對於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的複雜度,把動態的問題轉化為靜態的問題,即把邊修改邊查詢改為先修改再查詢。...