題目背景
這是一道模板題
可以使用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...