[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 }
CDQ分治 三维偏序

相关文章:

  • 2022-12-23
  • 2021-09-09
  • 2021-09-18
  • 2021-10-26
  • 2021-09-27
  • 2022-12-23
  • 2022-12-23
  • 2021-11-08
猜你喜欢
  • 2021-12-18
  • 2022-12-23
  • 2021-12-04
  • 2021-06-08
  • 2021-11-07
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案