[TOC]
假装有目录(以前就是有的)
woc明天就走了怎么这么多没写
之前写的忘得差不多了,再写遍(省选部分模板连同一些比较水的。。)。
就按分类顺序排了。另外还是Markdown好用,但可惜不能代码折叠。光改字体就好麻烦啊。。
计算几何。。
斜率优化
四边形不等式优化
分治
CDQ分治✔
三维偏序:http://www.cnblogs.com/SovietPower/p/8574905.html
1 /* 2 5904kb 840ms 3 是对x,y,z都相同的元素去重,不是对z。。sb了。 4 去重后的贡献是q[p].cnt! 5 */ 6 #include <cstdio> 7 #include <cctype> 8 #include <algorithm> 9 #define gc() getchar() 10 #define lb(x) (x)&-(x) 11 const int N=1e5+5,MAXN=2e5+5; 12 13 int n,Ans[N]; 14 int read(); 15 struct Node 16 { 17 int x,y,z,cnt,ans; 18 void Init(){ 19 x=read(),y=read(),z=read(),cnt=1; 20 } 21 bool operator <(const Node &a)const{ 22 return x==a.x?(y==a.y?z<a.z:y<a.y):x<a.x; 23 } 24 }q[N],tmp[N]; 25 26 inline int read() 27 { 28 int now=0;register char c=gc(); 29 for(;!isdigit(c);c=gc()); 30 for(;isdigit(c);now=now*10+c-'0',c=gc()); 31 return now; 32 } 33 namespace BIT 34 { 35 int n,val[MAXN]; 36 inline void Add(int p,int v){ 37 while(p<=n) val[p]+=v,p+=lb(p); 38 } 39 inline int Query(int p){ 40 int res=0; 41 while(p) res+=val[p],p-=lb(p); 42 return res; 43 } 44 inline void Clear(int p){ 45 while(p<=n) 46 if(val[p]) val[p]=0,p+=lb(p); 47 else break; 48 } 49 } 50 void CDQ(int l,int r) 51 { 52 if(l<r){ 53 int m=l+r>>1; CDQ(l,m), CDQ(m+1,r); 54 int p1=l,p2=m+1,t=0; 55 while(p1<=m&&p2<=r) 56 { 57 if(q[p1].y<=q[p2].y) BIT::Add(q[p1].z,q[p1].cnt), tmp[t++]=q[p1++];//只是排y,别去管什么z。。 58 else q[p2].ans+=BIT::Query(q[p2].z), tmp[t++]=q[p2++]; 59 } 60 if(p1<=m){ 61 for(int i=l; i<p1; ++i) BIT::Clear(q[i].z); 62 while(p1<=m) tmp[t++]=q[p1++]; 63 } 64 else if(p2<=r){ 65 while(p2<=r) q[p2].ans+=BIT::Query(q[p2].z), tmp[t++]=q[p2++]; 66 for(int i=l; i<=m; ++i) BIT::Clear(q[i].z); 67 } 68 for(int i=0; i<t; ++i) q[l+i]=tmp[i]; 69 } 70 } 71 72 int main() 73 { 74 n=read(),BIT::n=read(); 75 for(int i=1; i<=n; ++i) q[i].Init(); 76 std::sort(q+1,q+1+n); 77 int cnt=1; 78 for(int i=2; i<=n; ++i) 79 if(q[i].z!=q[i-1].z||q[i].y!=q[i-1].y||q[i].x!=q[i-1].x) q[++cnt]=q[i]; 80 else ++q[cnt].cnt; 81 CDQ(1,cnt); 82 for(int i=1; i<=cnt; ++i) Ans[q[i].ans+q[i].cnt-1]+=q[i].cnt; 83 for(int i=0; i<n; ++i) printf("%d\n",Ans[i]); 84 85 return 0; 86 }