傳送門:
\[有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 ...