P3810 模板 三維偏序(陌上花開)

2022-05-08 04:48:09 字數 2098 閱讀 4726

有 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 3

3 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: 複製

313

0101

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 4

5struct

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分治 先三關鍵字排序 然後把第二關鍵字歸併排序 在合併子區間時用 第三關鍵字的權值樹狀樹組 算出子區間的答案 為什麼可以這樣搞呢 首先第一維已經有序 所以只要考慮左邊對右邊的影響 把第二維歸併時 左子區間的第一二關鍵字 全部小於或等於 右子區間的第一二關鍵字 所以也只要考慮左邊對右邊的...