Luogu3810 三維偏序(陌上花開)

2021-08-20 01:26:38 字數 2224 閱讀 7098

題目背景

這是一道模板題

可以使用bitset,cdq分治,k-dtree等方式解決。

題目描述有 n

n

個元素,第

i' role="presentation" style="position: relative;">i

i個元素有ai

a

i、bi

b

i、ci

c

i三個屬性,設f(

i)f (i

)表示滿足aj

≤ai aj≤

ai

且bj≤b

i bj≤

bi

且 cj

≤ci cj≤

ci

的 j j

的數量。

對於 d∈[

0,n)

' role="presentation" style="position: relative;">d∈[

0,n)

d∈[0

,n),求

f(i)

=df (i

)=

d的數量

輸入輸出格式

輸入格式:

第一行兩個整數

n n

、k k

,分別表示元素數量和最大屬性值。之後n

' role="presentation" style="position: relative;">n

n行,每行三個整數ai

a

i、bi

b

i、ci

c

i,分別表示三個屬性值。

輸出格式:

輸出 n

n

行,第d+

1' role="presentation" style="position: relative;">d+1

d+1行表示f(

i)=d

f (i

)=d的

i i

的數量。

輸入輸出樣例

輸入樣例#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:

3 1

3 0

1 0

1 0 0 1

說明1≤n

≤100000,1

≤k≤200000

' role="presentation" style="position: relative;">1≤n

≤100000,1

≤k≤2000001≤

n≤100000,1

≤k≤200000 題解

考慮使用cd

q cdq

分治,第一維直接排序搞掉,第二維cd

q cdq

搞成離線,最後一位上資料結構即可。

左半邊對右半邊的貢獻很好統計,左邊為單點加,右邊為區間求和。

**

#include

using

namespace

std;

const

int m=1e6+5;

struct sd;

bool cmp1(sd a,sd b)

int sum[m],ans[m],n,tot,base=1;

sd x[m],que[m];

void in()

void add(int v,int s)

int query(int le,int ri)

return ans;

}void cdq(int le,int ri)

for(int i=le;i<=ri;++i)

if(que[i].id<=mid)add(que[i].r,-que[i].cot);

}void ac()

cdq(1,tot);

for(int i=1;i<=tot;++i)ans[que[i].sum+que[i].cot-1]+=que[i].cot;

for(int i=0;iprintf("%d\n",ans[i]);

}int main()

Luogu 3810 三維偏序

我真的寫不來cdq啊 樹套樹卡常喪心病狂 作死套了fhqtreap 注意最後對於完全一樣的點,要在這些點的貢獻都新增完了之後一起算答案 code luogu judger enable o2 include include include using namespace std const int ...

洛谷 3810 模板 三維偏序(陌上花開)

題目描述 有 n個元素,第 i個元素有 ai,bi,c ia i,b i,c i ai bi ci 三個屬性,設 f i f i f i 表示滿足 aj ai且b j bi 且cj ci a j leq a i 且 b j leq b i 且c j leq c i aj ai 且bj bi 且cj ...

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

傳送門 洛谷 哇塞大佬好厲害 據說正解是一維排序,二維cdq,三維樹狀陣列的 然而大佬硬是二維三維都用了cdq 而且莫名好寫 太暴力了 1 minamoto 2 include3 include4 include5 using std sort 6 define getc p1 p2 p2 p1 b...