This is a title1
This is a title2
Splay:
//BZOJ3224 普通平衡树 各类平衡树模板题 //n个操作 //1 x 表示插入x //2 x 表示删除x(如果有多个相同的则只删除一个) //3 x 表示查询x的排名 //4 x 表示查询排名为x的数 //5 x 表示查询x的前驱 //6 x 表示查询x的后继 //Splay版 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; struct Splay{ struct node{ int v,fa,son[2],siz,sum; //0:左儿子 1:右儿子 }t[200001]; int tot,rt; Splay(){ tot=rt=0; } void newnode(int val){ t[++tot].v=val; t[tot].fa=t[tot].son[0]=t[tot].son[1]=0; t[tot].sum=t[tot].siz=1; } void clear(int x){ t[x].v=t[x].fa=t[x].son[0]=t[x].son[1]=t[x].sum=t[x].siz=0; } int lr(int x){ return t[t[x].fa].son[1]==x; } void update(int x){ if(x){ t[x].siz=t[x].sum; if(t[x].son[0])t[x].siz+=t[t[x].son[0]].siz; if(t[x].son[1])t[x].siz+=t[t[x].son[1]].siz; } } void rotate(int x){ int p=t[x].fa,pp=t[p].fa,ch=lr(x); t[p].son[ch]=t[x].son[ch^1]; t[t[p].son[ch]].fa=p; t[p].fa=x; t[x].son[ch^1]=p; t[x].fa=pp; if(pp)t[pp].son[t[pp].son[1]==p]=x; update(p); update(x); } void splay(int x,int p){ for(int f;(f=t[x].fa)!=p;rotate(x)){ if(t[f].fa!=p)rotate(lr(x)==lr(f)?f:x); } if(!p)rt=x; } void insert(int x){ if(rt==0){ newnode(x); rt=tot; return; } int now=rt,f=0; for(;;){ if(t[now].v==x){ t[now].sum++; update(now); update(f); splay(now,0); return; } f=now; now=t[now].son[t[now].v<x]; if(!now){ newnode(x); t[tot].fa=f; t[f].son[t[f].v<x]=tot; update(f); splay(tot,0); return; } } } int pre(){ int now=t[rt].son[0]; while(t[now].son[1])now=t[now].son[1]; return now; } int nxt(){ int now=t[rt].son[1]; while(t[now].son[0])now=t[now].son[0]; return now; } int find(int x){ int ans=0,now=rt; for(;;){ if(x<t[now].v)now=t[now].son[0]; else{ ans+=(t[now].son[0]?t[t[now].son[0]].siz:0); if(x==t[now].v){ splay(now,0); return ans+1; } ans+=t[now].sum; now=t[now].son[1]; } } } int findx(int x){ int now=rt; for(;;){ if(t[now].son[0]&&x<=t[t[now].son[0]].siz)now=t[now].son[0]; else{ int tmp=(t[now].son[0]?t[t[now].son[0]].siz:0)+t[now].sum; if(x<=tmp)return t[now].v; x-=tmp; now=t[now].son[1]; } } } void del(int x){ int kk=find(x); if(t[rt].sum>1){ t[rt].sum--; return; } if(!t[rt].son[0]&&!t[rt].son[1]){ clear(rt); rt=0; return; } if(!t[rt].son[1]){ int rrt=rt; rt=t[rrt].son[0]; t[rt].fa=0; clear(rrt); return; } if(!t[rt].son[0]){ int rrt=rt; rt=t[rrt].son[1]; t[rt].fa=0; clear(rrt); return; } int pr=pre(),rrt=rt; splay(pr,0); t[t[rrt].son[1]].fa=rt; t[rt].son[1]=t[rrt].son[1]; clear(rrt); update(rt); } int ppre(int x){ insert(x); int ans=t[pre()].v; del(x); return ans; } int nnxt(int x){ insert(x); int ans=t[nxt()].v; del(x); return ans; } }splaytree; int n,op,x; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d",&op,&x); switch(op){ case 1:splaytree.insert(x);break; case 2:splaytree.del(x);break; case 3:printf("%d\n",splaytree.find(x));break; case 4:printf("%d\n",splaytree.findx(x));break; case 5:printf("%d\n",splaytree.ppre(x));break; case 6:printf("%d\n",splaytree.nnxt(x));break; } } return 0; }
FFT:
1 //求多项式乘积 2 //要求多项式A和多项式B的积多项式C 3 //具体操作就是 4 //DFT(A),DFT(B)->暴力乘积->拉格朗日插值(即IDFT(C))->C 5 //其中DFT表示离散傅里叶变换 6 //通俗的来说就是用点值表示多项式 7 //使用神秘单位复数根将时间复杂度降至O(nlogn) 8 //ps:但是常数巨大 9 //pps:应用非常广泛,非常多题目都要fft or ntt优化,板子一定要背熟 10 #include<iostream> 11 #include<cstring> 12 #include<cstdio> 13 #include<cmath> 14 #define pw(n) (1<<n) 15 using namespace std; 16 const double pi=acos(-1); 17 struct complex{ 18 double a,b; 19 complex(double _a=0,double _b=0){ 20 a=_a; 21 b=_b; 22 } 23 friend complex operator +(complex x,complex y){return complex(x.a+y.a,x.b+y.b);} 24 friend complex operator -(complex x,complex y){return complex(x.a-y.a,x.b-y.b);} 25 friend complex operator *(complex x,complex y){return complex(x.a*y.a-x.b*y.b,x.a*y.b+x.b*y.a);} 26 friend complex operator *(complex x,double y){return complex(x.a*y,x.b*y);} 27 friend complex operator /(complex x,double y){return complex(x.a/y,x.b/y);} 28 }a[100001],b[100001]; 29 int n,m,bit,bitnum=0,rev[pw(20)]; 30 void getrev(int l){//Reverse 31 for(int i=0;i<pw(l);i++){ 32 rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1)); 33 } 34 } 35 void FFT(complex *s,int op){ 36 for(int i=0;i<bit;i++)if(i<rev[i])swap(s[i],s[rev[i]]); 37 for(int i=1;i<bit;i<<=1){ 38 complex w(cos(pi/i),op*sin(pi/i)); 39 for(int p=i<<1,j=0;j<bit;j+=p){//Butterfly 40 complex wk(1,0); 41 for(int k=j;k<i+j;k++,wk=wk*w){ 42 complex x=s[k],y=wk*s[k+i]; 43 s[k]=x+y; 44 s[k+i]=x-y; 45 } 46 } 47 } 48 if(op==-1){ 49 for(int i=0;i<=bit;i++){ 50 s[i]=s[i]/(double)bit; 51 } 52 } 53 } 54 int main(){ 55 scanf("%d%d",&n,&m); 56 for(int i=0;i<=n;i++)scanf("%lf",&a[i].a); 57 for(int i=0;i<=m;i++)scanf("%lf",&b[i].a); 58 m+=n; 59 for(bit=1;bit<=m;bit<<=1)bitnum++; 60 getrev(bitnum); 61 FFT(a,1); 62 FFT(b,1); 63 for(int i=0;i<=bit;i++)a[i]=a[i]*b[i]; 64 FFT(a,-1); 65 for(int i=m;i>=0;i--)printf("%d ",(int)(a[i].a+0.5)); 66 return 0; 67 }