有 nn 個元素,第 ii 個元素有 a_iai、b_ibi、c_ici三個屬性,設 f(i)f(i) 表示滿足 a_j \leq a_iaj≤ai且 b_j \leq b_ibj≤bi且 c_j \leq c_icj≤ci的 jj 的數量。
對於 d \in [0, n)d∈[0,n),求 f(i) = df(i)=d 的數量
輸入格式:
第一行兩個整數 nn、kk,分別表示元素數量和最大屬性值。
之後 nn 行,每行三個整數 a_iai、b_ibi、c_ici,分別表示三個屬性值。
輸出格式:
輸出 nn 行,第 d + 1d+1 行表示 f(i) = df(i)=d 的 ii 的數量。
輸入樣例#1: 複製
10 33 3 3
2 3 3
2 3 1
3 1 1
3 1 2
1 3 1
1 1 2
1 2 2
1 3 2
1 2 1
輸出樣例#1: 複製
3130101
001
1 \leq n \leq 100000, 1 \leq k \leq 2000001≤n≤100000,1≤k≤200000
就是一維排序,一維cdq,一維資料結構,
然後就是要把薩格屬性完全相同的要去掉,並在這個屬性的個數上+1. 其他的就沒什麼了
其實一開始看到cdq是一臉懵逼的,怎麼看也看不懂,但是理解了以後就會發現這玩意也挺簡單的。
1 #include 2 #include 3 #include 45struct
point
10 }num[100001],tem[100001
];11
bool
cmp(point lhs,point rhs)
16int c[200001],ans[100001],fin[100001],size[100001
];17
intn,k;
18void update(int ind,int num)
19long
long query(int
ind)
24void cdq(int l,int
r)33
while(j<=r)ans[num[j].id]+=query(num[j].c),tem[ind++]=num[j++];
34for(int e=l;esize[num[e].id]);
35while(i<=mid)tem[ind++]=num[i++];
36for(int i=l;i<=r;i++)num[i]=tem[i];37}
38int
main()
47for(int i=1;i<=ind;i++)num[i]=tem[i],num[i].id=i;
48 cdq(1
,ind);
49for(int i=1;i<=ind;i++)fin[ans[num[i].id]+size[num[i].id]-1]+=size[num[i].id];
50for(int i=0;i"
%d\n
",fin[i]);
51 }
P3810 模板 三維偏序(陌上花開)
傳送門 洛谷 哇塞大佬好厲害 據說正解是一維排序,二維cdq,三維樹狀陣列的 然而大佬硬是二維三維都用了cdq 而且莫名好寫 太暴力了 1 minamoto 2 include3 include4 include5 using std sort 6 define getc p1 p2 p2 p1 b...
P3810 模板 三維偏序(陌上花開)
這是一道模板題 可以使用bitset,cdq分治,k dtree等方式解決。有 nn 個元素,第 ii 個元素有 a iai b ibi c ici 三個屬性,設 f i f i 表示滿足 a j leq a iaj ai 且 b j leq b ibj bi 且 c j leq c icj ci ...
P3810 模板 三維偏序(陌上花開)
傳送門 cdq分治 先三關鍵字排序 然後把第二關鍵字歸併排序 在合併子區間時用 第三關鍵字的權值樹狀樹組 算出子區間的答案 為什麼可以這樣搞呢 首先第一維已經有序 所以只要考慮左邊對右邊的影響 把第二維歸併時 左子區間的第一二關鍵字 全部小於或等於 右子區間的第一二關鍵字 所以也只要考慮左邊對右邊的...