洛谷3810 三維偏序

2021-08-13 06:21:36 字數 1245 閱讀 6783

對於n個元素,第i個元素有ai,bi,ci三個屬性,f(i)表示滿足aj<=ai,bj<=bi,cj<=ci的j(i不等於j)的個數,對於在區間(0,n-1]的d,輸出f(i)=d的i的數量。

n<=100000

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

3 1

3 0

1 0

1 0 0 1

這一題要通過不斷地降維來解決。

先是排序一波可以解決第一維

用cdq分治來解決第二維

對於區間[l,mid],(mid,r],統計前乙個區間對後乙個區間的貢獻即可

統計的時候再按第二維來排序一次即可

第三維用樹狀陣列來解決就好了

總的複雜度是log^2的

#include 

#include

#include

using namespace std;

struct edge a[200050];

int n,i,k,num,t;

inttr[200050],f[200050];

intread()

return sum;

}bool cmp2(edge a,edge b)

bool cmp1(edge a,edge b)

void add(int

x,inty)}

int query(int

y) returns;}

void cdq(int l,int r)

a[i].ans+=query(a[i].z);

}

// if (l1==mid) l1++;

for (i=l;i<=l1-1;i++)

add(-a[i].cnt,a[i].z);

}int main()

sort(a+1,a+n+1,cmp1);

for (i=1;i<=n;)

cdq(1,num);

for (i=1;i<=num;i++)

for (i=0;i<=n-1;i++)

printf("%d\n",f[i]);

}

開始學習cdq分治和整體二分了……

洛谷 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 ...

Luogu 3810 三維偏序

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

洛谷P3810(三維偏序,CDQ分治果題)

題面 最近公尺娜都在學cdq分治,看到題都直接想cdq,還講得頭頭是道,所以本蒟蒻也水一水。找到bzoj的一題果題,居然還是許可權的,但我還是找到了本題。個人理解,有乙個修改和查詢的序列,cdq就是可以離線的條件下,用logn的複雜度,把動態的問題轉化為靜態的問題,即把邊修改邊查詢改為先修改再查詢。...