• 模板综合


    ctsc前例行砍手

    可并堆、并查集 zoj2334

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <algorithm>
    #include <string.h>
    #include <vector>
    #include <math.h>
    #include <limits>
    #include <set>
    #include <map>
    using namespace std;
    #define SZ 666666
    int ch[SZ][2],dis[SZ],v[SZ];
    int merge(int a,int b)
    {
        if(!a||!b) return a+b;
        if(v[a]<v[b]) swap(a,b);
        ch[a][1]=merge(ch[a][1],b);
        if(dis[ch[a][0]]<dis[ch[a][1]]) swap(ch[a][0],ch[a][1]);
        if(!ch[a][1]) dis[a]=0;
        else dis[a]=dis[ch[a][1]]+1;
        return a;
    }
    int pop(int a)
    {
        int t=merge(ch[a][0],ch[a][1]);
        ch[a][0]=ch[a][1]=dis[a]=0;
        return t;
    }
    int ff[SZ],rot[SZ];
    int gf(int x) {return ff[x]?ff[x]=gf(ff[x]):x;}
    int n,m;
    void sol()
    {
        for(int i=1;i<=n;i++) scanf("%d",v+i), ch[i][0]=ch[i][1]=dis[i]=ff[i]=0, rot[i]=i;
        scanf("%d",&m);
        while(m--)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            int ga=gf(a),gb=gf(b);
            if(ga==gb) {puts("-1"); continue;}
            v[rot[ga]]/=2; v[rot[gb]]/=2;
            int aa=merge(pop(rot[ga]),rot[ga]);
            int bb=merge(pop(rot[gb]),rot[gb]);
            rot[ga]=merge(aa,bb);
            ff[gb]=ga;
            printf("%d
    ",v[rot[ga]]);
        }
    }
    int main()
    {
        while(scanf("%d",&n)!=-1) sol();
    }

    cdq分治 bzoj1176

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <algorithm>
    #include <string.h>
    #include <vector>
    #include <math.h>
    #include <limits>
    #include <set>
    #include <map>
    using namespace std;
    int s,w,q=0,Q=0,ans[233333];
    //tp=0 edit
    //tp=1 query
    //op: -1/1 for query
    //    value for edit
    struct cq {int x,y,op,tp,qid;}qs[233333];
    bool operator < (cq a,cq b) {return a.x<b.x;}
    int bits[2333333];
    int sum(int x)
    {
        int ans=0;
        for(;x>=1;x-=x&-x) ans+=bits[x];
        return ans;
    }
    void edit(int x,int y)
    {
        for(;x<=w;x+=x&-x) bits[x]+=y;
    }
    void cdq(int l,int r)
    {
        if(l>=r) return;
        int mid=(l+r)>>1;
        cdq(l,mid); cdq(mid+1,r);
        sort(qs+l,qs+mid+1);
        sort(qs+mid+1,qs+r+1);
        int cur=l;
        for(int i=mid+1;i<=r;i++)
        {
            if(qs[i].tp!=1) continue;
            int x=qs[i].x;
            while(cur<=mid&&qs[cur].x<=x)
            {
                if(qs[cur].tp==0) edit(qs[cur].y,qs[cur].op);
                ++cur;
            }
            ans[qs[i].qid]+=qs[i].op*sum(qs[i].y);
        }
        for(int i=l;i<cur;i++) if(qs[i].tp==0) edit(qs[i].y,-qs[i].op);
    }
    int main()
    {
        scanf("%d%d",&s,&w);
        int o,a,b,c,d;
        while(1)
        {
            scanf("%d",&o);
            if(o==1)
            {
                scanf("%d%d%d",&a,&b,&c);
                ++q; qs[q].x=a; qs[q].y=b; qs[q].tp=0; qs[q].op=c;
            }
            else if(o==2)
            {
                scanf("%d%d%d%d",&a,&b,&c,&d);
                ++Q;
                ++q; qs[q].x=a-1; qs[q].y=b-1; qs[q].tp=1; qs[q].op=1; qs[q].qid=Q;
                ++q; qs[q].x=c; qs[q].y=b-1; qs[q].tp=1; qs[q].op=-1; qs[q].qid=Q;
                ++q; qs[q].x=a-1; qs[q].y=d; qs[q].tp=1; qs[q].op=-1; qs[q].qid=Q;
                ++q; qs[q].x=c; qs[q].y=d; qs[q].tp=1; qs[q].op=1; qs[q].qid=Q;
            }
            else break;
        }
        cdq(1,q);
        for(int i=1;i<=Q;i++) printf("%d
    ",ans[i]);
    }

    splay tyvj1729

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <algorithm>
    #include <string.h>
    #include <vector>
    #include <math.h>
    #include <limits>
    #include <set>
    #include <map>
    using namespace std;
    #define SZ 666666
    int n,m,ch[SZ][2],siz[SZ],vs[SZ],fa[SZ],root,an=0;
    bool rev[SZ];
    void pd(int x)
    {
        if(!rev[x]) return;
        swap(ch[x][0],ch[x][1]);
        rev[ch[x][0]]^=1; rev[ch[x][1]]^=1;
        rev[x]=0;
    }
    void upd(int x)
    {
        siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1;
    }
    void rot(int x)
    {
        pd(fa[x]); pd(x);
        int y=fa[x],c=ch[y][0]==x; fa[x]=fa[y];
        if(fa[y]) ch[fa[y]][ch[fa[y]][1]==y]=x;
        int h=ch[x][c]; ch[y][!c]=h;
        if(h) fa[h]=y; ch[x][c]=y; fa[y]=x;
        upd(y); upd(x);
    }
    int ss[SZ],sn=0;
    void splay(int x,int f)
    {
        int cur=x;
        while(cur!=f) ss[++sn]=cur, cur=fa[cur];
        while(sn) pd(ss[sn--]);
        while(fa[x]!=f)
        {
            int y=fa[x];
            if(fa[y]!=f)
            {
                if(ch[fa[y]][1]==y^ch[y][1]==x) rot(x);
                else rot(y);
            }
            rot(x);
        }
        if(!f) root=x;
    }
    void splayp(int x,int f)
    {
        int p=root; pd(p);
        while(siz[ch[p][0]]!=x-1)
        {
            if(siz[ch[p][0]]<x-1) x-=siz[ch[p][0]]+1, p=ch[p][1];
            else p=ch[p][0];
            pd(p);
        }
        splay(p,f);
    }
    void addnode(int& x,int f,int v)
    {
        x=++an; ch[x][0]=ch[x][1]=rev[x]=0; fa[x]=f; siz[x]=1; vs[x]=v;
    }
    void build(int& x,int f,int l,int r)
    {
        if(l>r) {x=0; return;}
        int mid=l+r>>1;
        addnode(x,f,mid);
        build(ch[x][0],x,l,mid-1);
        build(ch[x][1],x,mid+1,r);
        upd(x);
    }
    #define RRL ch[ch[root][1]][0]
    void init()
    {
        addnode(root,0,0);
        addnode(ch[root][1],root,0);
        build(RRL,ch[root][1],1,n);
        upd(ch[root][1]); upd(root);
    }
    void revs(int l,int r)
    {
        splayp(l,0);
        splayp(r+2,root);
        rev[RRL]^=1;
    }
    int as[SZ],asn=0;
    void prt(int x)
    {
        if(!x) return;
        pd(x);
        prt(ch[x][0]);
        if(vs[x]) as[++asn]=vs[x];
        prt(ch[x][1]);
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        init();
        for(int i=1;i<=m;i++)
        {
            int l,r;
            scanf("%d%d",&l,&r);
            revs(l,r);
        }
        asn=0; prt(root);
        for(int i=1;i<=n;i++) printf("%d ",as[i]);
        putchar(10);
    }

    LCT uoj3

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <algorithm>
    #include <string.h>
    #include <vector>
    #include <math.h>
    #include <limits>
    #include <set>
    #include <map>
    using namespace std;
    #define SZ 666666
    int n,m,ch[SZ][2],vv[SZ],fa[SZ],root,an=0,mx[SZ];
    bool rev[SZ];
    void pd(int x)
    {
        if(!rev[x]) return;
        swap(ch[x][0],ch[x][1]);
        rev[ch[x][0]]^=1;
        rev[ch[x][1]]^=1;
        rev[x]=0;
    }
    bool top(int x) {return !(ch[fa[x]][0]==x||ch[fa[x]][1]==x);}
    void upd(int x)
    {
        mx[x]=x;
        if(vv[mx[ch[x][0]]]>vv[mx[x]]) mx[x]=mx[ch[x][0]];
        if(vv[mx[ch[x][1]]]>vv[mx[x]]) mx[x]=mx[ch[x][1]];
    }
    void rot(int x)
    {
        int y=fa[x],c=ch[y][0]==x; fa[x]=fa[y];
        if(!top(y)) ch[fa[y]][ch[fa[y]][1]==y]=x;
        int h=ch[x][c]; ch[y][!c]=h;
        if(h) fa[h]=y; ch[x][c]=y; fa[y]=x;
        upd(y); upd(x);
    }
    int ss[SZ],sn=0;
    void splay(int x)
    {
        for(int c=x;;c=fa[c])
        {
            ss[++sn]=c;
            if(top(c)) break;
        }
        while(sn) pd(ss[sn--]);
        while(!top(x))
        {
            int y=fa[x];
            if(!top(y))
            {
                if(ch[fa[y]][1]==y^ch[y][1]==x) rot(x);
                else rot(y);
            }
            rot(x);
        }
    }
    void access(int x)
    {
        for(int c=0;x;c=x,x=fa[x]) splay(x), ch[x][1]=c, upd(x);
    }
    void makeroot(int x) {access(x); splay(x); rev[x]^=1;}
    void link(int a,int b) {makeroot(a); fa[a]=b;}
    void cut(int a,int b) {makeroot(a); access(b); splay(b); ch[b][0]=fa[a]=0;}
    int findroot(int x)
    {
        access(x); splay(x);
        while(ch[x][0]) x=ch[x][0];
        splay(x); return x;
    }
    int getrd(int a,int b) {makeroot(a); access(b); splay(b); return b;}
    struct ce {int x,y,a,b;}es[233333];
    bool operator < (ce a,ce b) {return a.a<b.a;}
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++) scanf("%d%d%d%d",&es[i].x,&es[i].y,&es[i].a,&es[i].b);
        sort(es+1,es+1+m);
        int ans=2000000000;
        for(int i=1;i<=m;i++)
        {
            int x=es[i].x,y=es[i].y,b=es[i].b,a=es[i].a;
            vv[i+n]=b;
            if(findroot(x)==findroot(y))
            {
                int p=mx[getrd(x,y)];
                if(vv[p]<=b) goto updans;
                cut(p,es[p-n].x);
                cut(p,es[p-n].y);
            }
            link(x,i+n); link(y,i+n);
            updans:
            if(findroot(1)==findroot(n)) ans=min(ans,vv[mx[getrd(1,n)]]+a);
        }
        if(ans==2000000000) ans=-1;
        printf("%d
    ",ans);
    }

    后缀自动机、序列自动机 bzoj4032

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <algorithm>
    #include <string.h>
    #include <vector>
    #include <math.h>
    #include <limits>
    #include <set>
    #include <map>
    using namespace std;
    #define SZ 4444
    #define S 27
    struct AM
    {
    int ch[SZ][S],an,rot;
    };
    struct SeqAM: public AM
    {
    int lst[S],fail[SZ];
    SeqAM()
    {
        rot=an=1;
        for(int i=0;i<S;i++) lst[i]=1;
    }
    void ins(char c)
    {
        int x=++an; fail[x]=lst[c];
        for(int i=0;i<S;i++)
        {
            for(int s=lst[i];s&&!ch[s][c];s=fail[s]) ch[s][c]=x;
        }
        lst[c]=x;
    }
    }SeqA,SeqB;
    struct SufAM: public AM
    {
    int ml[SZ],fail[SZ],lst,cl;
    SufAM() {lst=rot=an=1; cl=0;}
    void ins(char s)
    {
        int x=++an,len=++cl,p=lst;
        lst=x; ml[x]=len;
        for(;p&&!ch[p][s];p=fail[p]) ch[p][s]=x;
        if(!p) {fail[x]=rot; return;}
        if(ml[ch[p][s]]==ml[p]+1) fail[x]=ch[p][s];
        else
        {
            int chh=ch[p][s],cm=++an;
            ml[cm]=ml[p]+1; fail[cm]=fail[chh];
            for(int i=0;i<S;i++) ch[cm][i]=ch[chh][i];
            fail[chh]=fail[x]=cm;
            for(;ch[p][s]==chh;p=fail[p]) ch[p][s]=cm;
        }
    }
    }SufA,SufB;
    int dep[SZ][SZ],qa[SZ*SZ],qb[SZ*SZ],h,t;
    int bfs(AM& a,AM& b)
    {
        memset(dep,0,sizeof(dep));
        h=0; t=1; qa[0]=a.rot; qb[0]=b.rot; dep[a.rot][b.rot]=1;
        while(h!=t)
        {
            int ca=qa[h],cb=qb[h]; ++h;
            for(int i=0;i<S;i++)
            {
                int cah=a.ch[ca][i],cbh=b.ch[cb][i];
                if(dep[cah][cbh]||!cah) continue;
                if(!cbh) return dep[ca][cb];
                dep[cah][cbh]=dep[ca][cb]+1;
                qa[t]=cah; qb[t]=cbh; ++t;
            }
        }
        return -1;
    }
    #define prt(x) printf("%d
    ",x)
    char A[SZ],B[SZ];
    int main()
    {
        scanf("%s%s",A,B);
        for(int i=0;A[i];i++) SeqA.ins(A[i]-'a'), SufA.ins(A[i]-'a');
        for(int i=0;B[i];i++) SeqB.ins(B[i]-'a'), SufB.ins(B[i]-'a');
        int AseqBseq=bfs(SeqA,SeqB);
        int AseqBsuf=bfs(SeqA,SufB);
        int AsufBseq=bfs(SufA,SeqB);
        int AsufBsuf=bfs(SufA,SufB);
        prt(AsufBsuf);
        prt(AsufBseq);
        prt(AseqBsuf);
        prt(AseqBseq);
    }

    后缀数组 uoj35

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <algorithm>
    #include <string.h>
    #include <vector>
    #include <math.h>
    #include <limits>
    #include <set>
    #include <map>
    using namespace std;
    namespace gsa
    {
    #define SZ 666666
    int n,sa[SZ],rank[SZ],qzh[SZ],t[SZ],tmpsa[SZ],tmpr[SZ],h[SZ];
    char s[SZ];
    bool same(int a,int b,int p) {return t[a]==t[b]&&t[a+p]==t[b+p];}
    void getsa(int n,int m=233)
    {
        for(int i=0;i<n;i++) rank[i]=s[i], ++qzh[rank[i]];
        for(int i=1;i<m;i++) qzh[i]+=qzh[i-1];
        for(int i=n-1;i>=0;i--) sa[--qzh[s[i]]]=i;
        for(int j=1;j<=n;j<<=1)
        {
            int cur=-1;
            for(int i=n-j;i<n;i++) tmpsa[++cur]=i;
            for(int i=0;i<n;i++) if(sa[i]>=j) tmpsa[++cur]=sa[i]-j;
            for(int i=0;i<n;i++) tmpr[i]=rank[tmpsa[i]];
            for(int i=0;i<m;i++) qzh[i]=0;
            for(int i=0;i<n;i++) ++qzh[tmpr[i]];
            for(int i=1;i<m;i++) qzh[i]+=qzh[i-1];
            for(int i=n-1;i>=0;i--) t[i]=rank[i], sa[--qzh[tmpr[i]]]=tmpsa[i];
            m=0;
            for(int i=0;i<n;i++)
                rank[sa[i]]=(i&&same(sa[i],sa[i-1],j))?m:++m;
            ++m;
        }
        for(int i=0;i<n;i++) rank[sa[i]]=i;
    }
    void geth(int n)
    {
        int p=0;
        for(int i=0;i<n;i++)
        {
            if(p) --p;
            int ls=sa[rank[i]-1];
            while(s[ls+p]==s[i+p]) ++p;
            h[rank[i]]=p;
        }
    }
    void ma_in()
    {
        scanf("%s",s);
        n=strlen(s); getsa(n+1); geth(n);
        for(int i=1;i<=n;i++) printf("%d ",sa[i]+1);
        putchar(10);
        for(int i=2;i<=n;i++) printf("%d ",h[i]);
    }
    }
    int main()
    {
        gsa::ma_in();
    }
  • 相关阅读:
    $('div div')和$('div >div')的区别
    [转]35岁前程序员要规划好的四件事,健康居首位
    程序员应该改变的20个思维习惯
    JQuery总结
    Javahome 与 Path 与ClassPath的含义
    jsp 位置
    访问 IIS 元数据库失败 权限问题
    xp添加文件夹写入权限
    dataset 对象
    js的一些代码
  • 原文地址:https://www.cnblogs.com/zzqsblog/p/5451134.html
Copyright © 2020-2023  润新知