TEST for codes

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 }

猜你喜欢

转载自www.cnblogs.com/dcdcbigbig/p/8931689.html