HDU4742 CDQ分治,三維LIS

2021-09-25 07:55:59 字數 1927 閱讀 5826

傳送門:

每個球都有三個屬性值x,y,z,要求最長的lis的長度和方案數

一維lis很好求,dp一下就行

二維的lis,將第一維排序後,和第一維一樣

那麼三維的lis怎麼做了,我們很容易想到將第一維排序後分治的寫,分了後, 按照y排序,怎麼治呢?用樹狀陣列更新前前x的最大值,然後再用dp更新即可

這裡需要注意,和陌上花開等板子題不一樣,我們這裡不能分了左半部分後再直接分右半部分,這個地方卡了我好久。這裡的分治運用是用來給dp服務的,我們dp是由前面的狀態轉移過來,所以,我們要先更新左半邊後再去分治右半邊

#include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

typedef pairpii;

typedef unsigned long long ull;

#define ls rt<<1

#define rs rt<<1|1

#define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

#define bug printf("*********\n")

#define fin freopen("input.txt","r",stdin);

#define fon freopen("output.txt","w+",stdout);

#define io ios::sync_with_stdio(false),cin.tie(0)

#define debug1(x) cout<<"["<<#x<<" "<<(x)<<"]\n"

#define debug2(x,y) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<"]\n"

#define debug3(x,y,z) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<" "<<#z<<" "<= 1; i -= lowbit(i)) else if(tr[i].max == ret.max)

}return ret;

}void clear(int x)

}void solve(int l, int r)

a ret = getsum(point[i].x);

ret.max++;

if(ret.max == ans[point[i].id].max) else if(ret.max > ans[point[i].id].max)

}for(int i = l; i <= mid; i++) clear(point[i].x);

for(int i = mid + 1; i <= r; i++)

point[i] = now[i];

solve(mid + 1, r);

}//dp[i]=max(dp[i-1],dp[j]+1)

int main()

sort(point + 1, point + 1 + n, cmpx);

for(int i = 1, xx = point[1].x - 1, num = 0; i <= n; i++)

sort(point + 1, point + 1 + n, cmpy);

for(int i = 1; i <= n; i++)

solve(1, n);

a ret;

ret.max = -1;

for(int i = 1; i <= n; i++) else if(ret.max < ans[i].max)

}printf("%d %d\n", ret.max, ret.sum);

}return 0;

}

陌上花開(三維偏序)(cdq分治)

其實就是三位偏序的模板,cdq分治入門題。學習cdq分治請看 stdcall大佬的部落格 傳送門 排序來維護第一層,cdq維護一層,樹狀陣列維護一層,然後就沒有啦qwqwq include include include include include define maxn 100010 usin...

三維偏序 cdq

luogu 3810 就是將逆序對轉化到了三維上去 原理等我寒假再補 第一維sort解決 第二維並歸排序 cdq 解決 第三維樹狀陣列 luogu judger enable o2 include include include include using std sort const int ma...

bzoj2683 簡單題 三維偏序cdq分治

給定乙個n n n n n 1e5 n 1 e5 的矩陣,單點修改,區間查詢。二維樹狀陣列?空間開不下。那就換乙個辦法,記得之前用cdq分治來做樹狀陣列的時候,每乙個查詢的答案是在它前面的修改的並且修改的位置在它前面的才可以計入答案,這裡也是一樣,將每乙個詢問拆成四個字首和陣列之後,每乙個查詢的答案...