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

2022-07-20 04:39:07 字數 2123 閱讀 4986

有 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\) 的數量

第一行兩個整數 n、 k,分別表示元素數量和最大屬性值。

之後 n 行,每行三個整數 \(a_i 、b_i 、c_i\) ,分別表示三個屬性值。

輸出 n 行,第 \(d + 1\) 行表示 \(f(i) = d\) 的 i 的數量。

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

313

0101

001

\(1\leq n \leq 100000,1\leq k\leq 200000\)

cdq 分治

對序列分治,每次統計左區間每個元素對於右區間每個元素的貢獻

首先分別以x,y,z為1,2,3關鍵字排序

那麼現在x是有序的

然後對序列cdq分治,每次把左右區間按y,z排序

這樣保證了左區間所有x\(\leq\)右區間所有x,且左右區間y有序

維護左區間的指標,for右區間每乙個元素,只要左區間指標的元素y比當前小,就在權值樹狀陣列上以z為下標++

然後用當前的z收集ans

注意千萬不要單開ans陣列收集答案

因為當前元素在每次sort後會變成其他的,這樣收集就亂了

最後開桶統計即可

#include#include#include#include#include#include#include#include#define _ 0

#define ll long long

#define space putchar(' ')

#define enter putchar('\n')

#define fuu(x,y,z) for(int x=(y),x##end=z;x<=x##end;x++)

#define fu(x,y,z) for(int x=(y),x##end=z;x=x##end;x--)

#define fd(x,y,z) for(int x=(y),x##end=z;x>x##end;x--)

#define mem(x,y) memset(x,y,sizeof(x))

#ifndef olinr

inline char getc()

#else

#define getc() getchar()

#endif

templateinline void in(t &x)

int n,k;

struct bit

inline int query(int pos)

};struct node

}e[300000];

bit t;

int ans[300000];

inline void cdq(int l,int r)

); std::sort(e+mid+1,e+r+1,(const node &a,const node &b));

int now=l;

fuu(i,mid+1,r)

fuu(i,l,now-1) t.add(e[i].z,-e[i].num);

}int main()

); int tmp=0;

//去重,相同的壓一起(跟自己相同的算在ans的一部分,但自己對自己無貢獻)

fuu(i,1,n)

cdq(1,tmp);

//ans裡面套的是當前元素的答案(要加上相同的-自己)

//外面因為跟自己相同的都是成立的,所以+=個數

fuu(i,1,tmp) ans[e[i].ans+e[i].num-1]+=e[i].num;

fuu(i,0,n-1) printf("%d\n",ans[i]);

return ~~(0^_^0);

}

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 模板 三維偏序(陌上花開)

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