P3810 陌上花開 CDQ分治

2022-05-21 02:16:12 字數 1909 閱讀 2014

傳送門:

\[有n 個元素,第 i 個元素有 a_i、 b_i、 c_i 三個屬性,設 f(i) 表示滿足 a_j\leq a_i 且 b_j \leq b_i且 c_j \leq c_i的 j 的數量。\\

對於 d \in [0, n],求 f(i) = d 的數量

\]cdq分治模板題,

我們將第一維在主函式排序後,cdq分治裡面,每次將左半邊和右半邊按照y排序,因為一開始的x是已經排序過了的,所以分治將其分為左半邊和右半邊時,左半邊的x還是小於右半邊的x,因此維護右半邊的位置i和左半邊的位置j,如果y[j]=y[i]時,不滿足偏序關係的時候,我們就可以直接樹狀陣列查詢小於z[i]的前半部分的j的個數,這樣,這麼多個數就滿足三維的偏序關係。

1.x的偏序關係已經在主函式裡面處理,所以分治分了後前一半的x小於後一半的x

2.y的偏序關係是兩個指針對著掃了,一遍,將滿足y[j]3.z的偏序關係是從樹狀陣列中查的小於z[i]的z[j]有多少個

一直這樣分治下去,我們就可以得到最終的答案

這個題有乙個坑點就是,當x,y,z都相同時,在分治的時候,本來它們相互之間都有貢獻,可是cdq的過程中只有左邊的能貢獻右邊的。這可怎麼辦呢?我們直接離散化後,給定乙個權值,這樣算貢獻就不會算錯了

#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;

cdq(l, mid);

cdq(mid + 1, r);

sort(a + l, a + mid + 1, cmpy);

sort(a + mid + 1, a + r + 1, cmpy);

int j = l;

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

a[i].ans += sum(a[i].z);

}for(int i = l; i < j; i++)

}int main()

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

int tot = 0;

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

cdq(1, tot);

sort(a + 1, a + tot + 1, cmpx);

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

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

return 0;

}

P3810 陌上花開(CDQ分治)

題意 有n nn個元素,第i ii個元素有a ia i ai b ib i bi c ic i ci 三個屬性,設f i f i f i 表示滿足aj ai a j a i aj ai 且bj b ib j b i bj bi 且cj c ic j c i cj ci 且j ij i j i的j j...

洛谷P3810 陌上花開(CDQ分治)

傳送門 題解 cdq分治模板題。一維排序,二維歸併,三維樹狀陣列。核心思想是分治,即計算左邊區間對右邊區間的影響。如下 include using namespace std typedef long long ll const int n 200005 int n,k,m struct node ...

luogu3810 陌上花開 cdq分治

求三維偏序 設三維為a,b,c。先對a排序,這樣i的偏序就只能然而排序的時候需要三個維度都判斷一遍,最後還要去重,不然會出現實際應該記答案的數出現在它後面的情況。排序用的函式裡不要寫類似於 之類的東西啊.會出奇奇怪怪的問題的 re 然後分治來做,我們在做區間 l,r 的時候,先去做 l,m 和 m ...