zoukankan      html  css  js  c++  java
  • 常用模板

    板子贴(很多都是以前打的,码风不太一样,以后有时间重新打一遍吧。)

    总板子:

    #pragma GCC optimize("-O2")
    #include<bits/stdc++.h>
    #define getchar nc
    #define min(a,b) ((a)<(b)?(a):(b))
    #define max(a,b) ((a)>(b)?(a):(b))
    #define sight(c) ('0'<=c&&c<='9')
    #define swap(a,b) a^=b,b^=a,a^=b
    #define LL long long
    #define deg printf
    #define dput put
    #define dputc putchar
    #define db double 
    #define eho(x) for(int i=head[x];i;i=net[i])
    inline char nc(){
    static char buf[1000000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
    }
    inline void read(int &x){
        static char c;
        for (c=getchar();!sight(c);c=getchar());
        for (x=0;sight(c);c=getchar())x=x*10+c-48;
    }
    void write(int x){if (x<10) {putchar('0'+x); return;} write(x/10); putchar('0'+x%10);}
    inline void writeln(int x){ if (x<0) putchar('-'),x*=-1; write(x); putchar('
    '); }
    inline void writel(int x){ if (x<0) putchar('-'),x*=-1; write(x); putchar(' '); }
    using namespace std;
    signed main() {
        return 0;
    }
    View Code

    网络流Dinic:(已封装)

    #define eho(x) for(int& i=hed[x];~i;i=net[i])
    #define Eho(x) for(int i=head[x];~i;i=net[i])
    struct G {
        int head[N],net[M],fall[M],cost[M],s,t,tot,d[N],hed[N],cost2[M];
        bool in[N];
        queue<int> Q;
        G() {}
        inline void updata() {
            memcpy(cost,cost2,sizeof cost); 
        }
        inline void cpy() {
            memcpy(cost2,cost,sizeof cost);
        }
        inline void clear() {
            memset(head,-1,sizeof head);  tot=-1;}
        inline void add(int x,int y,int c) {
            fall[++tot]=y; net[tot]=head[x]; head[x]=tot; cost[tot]=c;}
        inline void adds(int x,int y,int c) {
            add(x,y,c); add(y,x,0);}
        inline bool spfa() {
            memset(d,127,sizeof d);
            int x; d[s]=1; Q.push(s); in[s]=1;
            while (!Q.empty()) {
                x=Q.front(); Q.pop();
                Eho(x)
                if (cost[i]&&d[fall[i]]>d[x]+1) {
                    d[fall[i]]=d[x]+1;
                    if (!in[fall[i]]) {
                        in[fall[i]]=1,Q.push(fall[i]);}
                }
                in[x]=0;
            }
            return d[t]<INF;
        }
        inline int dfs(int x,int F) {
            if (x==t|| !F) return F;
            int flow=0,r;
            eho(x)
            if (d[x]+1==d[fall[i]]&&((r=dfs(fall[i],min(F,cost[i])))>0)) {
                cost[i]-=r; cost[i^1]+=r;
                F-=r; flow+=r;
                if (!F) break;
            }
            return flow;
        }
        int dinic(int A,int B) {
            s=A; t=B;
            int flow=0;
            while (spfa()) {
                memcpy(hed,head,sizeof head);
                flow+=dfs(s,INF);
            }
            return flow;
        }
    } G;
    View Code

    网络流ISAP:(已封装)

    struct Maxflow{
        #define N 10007
        #define M 1000007 //注意这里 
        #define eho(x) for(int i=head[x];i;i=net[i])
        #define Eho(x) for(int& i=hea[x];i;i=net[i])
        #define inf (1<<27)
        int n,tot,fall[M],head[N],hea[N],s,t,cost[M],que[N],be,ed,net[M],gap[N],d[N],x,ret;
        Maxflow() {tot=1; memset(head,0,sizeof head);}
        inline void clear(int x,int y){tot=1; memset(head,0,sizeof head);}
        inline void add(int x,int y,int z){
            fall[++tot]=y; net[tot]=head[x]; head[x]=tot; cost[tot]=z;
        }
        inline void adds(int x,int y,int z){
            add(x,y,z); add(y,x,0);
        }
        void init() {
            memset(gap,0,sizeof gap); memset(d,0,sizeof d);
            ++gap[d[t]=1];
            memcpy(hea,head,sizeof hea);
            que[be=ed=1]=t;
            while (be<=ed) {
                x=que[be++];
                eho(x) if (!d[fall[i]]) ++gap[d[fall[i]]=d[x]+1],que[++ed]=fall[i]; 
            }
        }
        int get(int x,int fl){
            if (x==t) return fl; if (!fl) return 0;
            int flow=0,tmp;
            Eho(x) if (d[x]==d[fall[i]]+1&&(tmp=get(fall[i],min(fl,cost[i])))) {
                flow+=tmp; fl-=tmp; cost[i]-=tmp; cost[i^1]+=tmp; 
                if (!fl) return flow;
            }
            if (!(--gap[d[x]])) d[s]=n+1;
            ++gap[++d[x]],hea[x]=head[x];
            return flow; 
        }
        int isap(int S,int T,int Siz){
            s=S; t=T; n=Siz; init();
            ret=get(s,inf);
            while (d[s]<=n) ret+=get(s,inf);
            return ret;
        }
    }G;
    View Code

    线性规划防守战线[ZJOI 2013 day1]

    #include<bits/stdc++.h>
    #define eps 1e-7  
    #define inf 1e10  
    using namespace std;  
    int b; char c;
    inline void read(int &x) {
        c=getchar();
        b=1;
        for (; !(c>='0' && c<='9'); c=getchar()) if (c=='-') b=-1;
        for (x=0; c>='0' && c<='9'; x=x*10+c-'0',c=getchar());
        x*=b;
    }
    inline void read(long long &x) {
        c=getchar();
        b=1;
        for (; !(c>='0' && c<='9'); c=getchar()) if (c=='-') b=-1;
        for (x=0; c>='0' && c<='9'; x=x*10+c-'0',c=getchar());
        x*=b;
    }
    int n,m;  
    double ak[1010][10100],bp[1010],cpp[10100],v;  
    void fhb(int l,int e)  
        {  
            int i,j;  
               
            bp[l]/=ak[l][e];  
            for(i=1;i<=n;i++)  
                if(i!=e)  
                    ak[l][i]/=ak[l][e];  
            ak[l][e]=1/ak[l][e];  
       
            for(i=1;i<=m;i++)  
                if(i!=l&&fabs(ak[i][e])>eps)  
                {  
                    bp[i]-=ak[i][e]*bp[l];  
                    for(j=1;j<=n;j++)  
                        if(j!=e)  
                            ak[i][j]-=ak[i][e]*ak[l][j];  
                    ak[i][e]=-ak[i][e]*ak[l][e];  
                }  
       
            v+=cpp[e]*bp[l];  
            for(i=1;i<=n;i++)  
                if(i!=e)  
                    cpp[i]-=cpp[e]*ak[l][i];  
            cpp[e]=-cpp[e]*ak[l][e];  
        }  
    double hhh()  
        {  
            int i,l,e;  
            while(1)  
            {  
                for(i=1;i<=n;i++)  
                    if(cpp[i]>eps)  
                        break;  
                if((e=i)==n+1)  
                    return v;  
                double temp=inf;  
                for(i=1;i<=m;i++)  
                    if( ak[i][e]>eps && bp[i]/ak[i][e]<temp )  
                        temp=bp[i]/ak[i][e],l=i;  
                if(temp==inf) return inf;  
                fhb(l,e);  
            }  
        }  
    int main()  
    {  
        int i,j,x,y,z;  
        read(m); read(n);  
        for(i=1;i<=m;i++)  
            scanf("%lf",&bp[i]);  
        for(i=1;i<=n;i++)  
        {  
            read(x); read(y); read(z);
            for(j=x;j<=y;j++)  
                ak[j][i]=1;  
            cpp[i]=z;  
        }  
        double ans=hhh();  
        cout<<(long long)(ans+0.5)<<endl;  
        return 0;  
    }  
    View Code

    笛卡尔树

    #include<bits/stdc++.h>
     
    typedef struct {
        int k,a,num;
    } Node;
     
    Node data[50000];
    int father[50001];
    int left_child[50001];
    int right_child[50001];
    int convert[50001];
    int n;
     
    int cmp(const void *a, const void *b) {
        Node *p1,*p2;
        p1=(Node*)a;
        p2=(Node*)b;
        return p1->k - p2->k;
    }
    void insert(int index) {
        int i,j;
        i=data[index-1].num;
        while(i!=0 && data[convert[i]].a > data[index].a) {
            j=i;
            i=father[i];
        }
        if(i==0) {
            father[j]=data[index].num;
            left_child[data[index].num] = j;
        } else {
            left_child[data[index].num]=right_child[i];
            father[right_child[i]]=data[index].num;
            right_child[i]=data[index].num;
            father[data[index].num]=i;
        }
    }
     
    int main() {
        int i;
        scanf("%d", &n);
        for(i=0; i<n; i++) {
            scanf("%d %d", &data[i].k, &data[i].a);
            data[i].num=i+1;
        }
        qsort(data, n, sizeof(Node), cmp);
        convert[data[0].num]=0;
        for(i=1; i<n; i++) convert[data[i].num]=i, insert(i);
     
        printf("YES
    ");
        for(i=1; i<=n; i++) printf("%d %d %d
    ", father[i], left_child[i], right_child[i]);
     
        return 0;
    }
    View Code

    tarjan算法

    void tarjan(int x){
        int v;
        dfn[x]=low[x]=++tim;
        usd[x]=1; s.push(x);
        eho(x) {
            v=fall[i];
            if (dfn[v]==0) tarjan(v),low[x]=min(low[x],low[v]);
            else if (usd[v]) low[x]=min(low[x],dfn[v]);
            }
       if (dfn[x]==low[x]) {
                ++ans;
                do{
                     v=s.top();s.pop();usd[v]=0;
                }while (x!=v);}
          
    }
    View Code

    费用流:

    #include<bits/stdc++.h>
    #define sight(c) (c>='0'&&c<='9')
    #define gc getchar
    #define M 200007
    #define ner mer
    #define N 5007
    #define inf (INT_MAX>>7)
    #define eho(x) for(int i=head[x];~i;i=net[i])
    using namespace std;
    int usd[N],mer[N],val[N],head[N],net[M],fall[M],flo[M],cost[M],tot,s,t,x,n,m,y,f,c,w,maf,mic;
    queue<int> Q;
    void inline read(int &x){
        static char c;
        for(c=gc();!sight(c);c=gc());
        for(x=0;sight(c);x=x*10+c-48,c=gc());
    }
    void inline add(int x,int y,int f,int c){
        fall[++tot]=y;net[tot]=head[x];head[x]=tot;flo[tot]=f; cost[tot]=c;
    }
    bool spfa() {
        memset(usd,0,sizeof usd);
        memset(val,36,sizeof val);
        memset(mer,-1,sizeof mer);
        usd[s]=1; Q.push(s); val[s]=0; mer[s]=-2;
        while (!Q.empty()) {
            x=Q.front(); Q.pop(); 
            eho(x) 
             if (flo[i]&&val[x]+cost[i]<val[fall[i]]){
                 val[fall[i]]=val[x]+cost[i];mer[fall[i]]=i;
                 if (!usd[fall[i]]) {usd[fall[i]]=1,Q.push(fall[i]);}
            }
            usd[x]=0;
        }
        return ~mer[t];
    }
    int main () {
    //    freopen("a.in","r",stdin);
        read(n); read(m); read(s); read(t);
        memset(head,-1,sizeof head); tot=-1;
        while (m--) {
            read(x); read(y); read(w); read(c); 
            add(x,y,w,c); add(y,x,0,-c);
        }
        while (spfa()) {
            x=inf;
            for (int i=ner[t];i!=-2;i=ner[fall[i^1]]) 
              x=min(x,flo[i]);
            for (int i=ner[t];i!=-2;i=ner[fall[i^1]]) {
                flo[i]-=x; flo[i^1]+=x; mic+=x*cost[i];
            }
            maf+=x;
        }
        printf("%d %d
    ",maf,mic);
        return 0;
    }
    View Code

    树状数组(区间修改,区间查询,已封装):

    struct Tre{
        #define L(x) (x&-x)
        LL a[N],b[N],sum[N]; int siz;
        inline void TLE(int* a,int n){for (int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i];siz=n+1;} 
        inline void Change(LL* A,int x,LL dla){for (;x<siz;x+=L(x)) A[x]+=dla;}
        inline LL Ask(LL *A,int x){static LL anw;for(anw=0;x;x-=L(x))anw+=A[x];return anw;}
        inline void change(int l,int r,LL dla) {
            Change(a,l,dla); Change(a,r+1,-dla);
            Change(b,l,dla*l); Change(b,r+1,-dla*(r+1));
        }
        inline LL ask(int l,int r) {
            return (sum[r]+Ask(a,r)*(r+1)-Ask(b,r))
             -(sum[l-1]+Ask(a,l-1)*l-Ask(b,l-1));
        }
        #undef L
    }tree;
    View Code

    普通treap:

    #include<bits/stdc++.h>
    #define sight(c) ('0'<=c&&c<='9')
    #define RR NULL
    #define inf 1<<29
    #define random rrsbRRsb
    using namespace std;
    inline int random(){
        static int seed=707; 
        return seed=int(seed*48271LL%2147483647);
    }
    struct Treap{
        int key,rap,siz;
        Treap *ro[2];
        Treap(int k){
            siz=1;
            key=k;
            rap=random();
            ro[1]=ro[0]=RR;
        }
        inline void rub() {
            siz=1;
            if (ro[0]!=RR) siz+=ro[0]->siz;
            if (ro[1]!=RR) siz+=ro[1]->siz;
        }
        inline int cop(int x){
            if (x==key) return -1;
            return x<key?0:1;
        }
    };
    inline void read(int &x) {
        static char c; static int b;
        for (b=1,c=getchar();!sight(c);c=getchar()) if (c=='-') b=-1;
        for (x=0;sight(c);c=getchar()) x=x*10+c-48;
        x*=b;
    }
    void play(Treap* &rr,int d){
        Treap *k=rr->ro[d^1];
        rr->ro[d^1]=k->ro[d];
        k->ro[d]=rr;
        rr->rub();
        k->rub();
        rr=k;
    }
    void Insert(Treap* &rr,int x){
        if (rr==RR) rr=new Treap(x);
        else {
            int d=x < rr->key?0:1;
            Insert(rr->ro[d],x);
            if (rr->ro[d]->rap > rr->rap)
             play(rr,d^1);
        }
        rr->rub();
    }
    bool Find(Treap *p,int x){
        while(p!=RR) {
            int d=p->cop(x);
            if (d==-1) return true;
            p=p->ro[d];
        }
        return false;
    }
    void Delete(Treap* &t,int x){
        int d=t->cop(x);
        if (d==-1) {
            Treap *tmp=t;
            if (t->ro[0]==RR) {
                t=t->ro[1];
                delete tmp;
                tmp=RR;
            } else if (t->ro[1]==RR) {
                t=t->ro[0];
                delete tmp;
                tmp=RR;
            } else {
                int k=t->ro[0]->rap<t->ro[1]->rap?0:1;
                play(t,k);
                Delete(t->ro[k],x);
            }
        }
        else Delete(t->ro[d],x);
        if (t!=RR) t->rub();
    }
    int Kth(Treap *t,int k){
        int cm=0;
        if (t->ro[0]) cm=t->ro[0]->siz;  
        cm++;
        if (cm==k)
         return t->key;
        if (cm>k) return Kth(t->ro[0],k);
        return Kth(t->ro[1],k-cm);
    }
    int Rank(Treap *t,int k){
        int r;
        if (!t) return inf;
        if (t->ro[0]==RR) 
         r=0;else r=t->ro[0]->siz;
        if(k==t->key) return min(r+1,Rank(t->ro[0],k));
        if(k<t->key) 
         return Rank(t->ro[0],k);
        return r+1+Rank(t->ro[1],k);
    }
    int Pre(Treap *t,int k){
        if (!t) return -inf;
        if (k>t->key) return max(t->key,Pre(t->ro[1],k));
        return Pre(t->ro[0],k);
    }
    int Sub(Treap *t,int k){
        if (!t) return inf;
        if (k<t->key) return min(t->key,Sub(t->ro[0],k));
        return Sub(t->ro[1],k);
    }
    int n,op,x;
    int main () {
    //    freopen("a.in","r",stdin);
        read(n);
        Treap* root=RR;
        while (n--) {
            read(op); read(x);
            switch(op){
                case 1:Insert(root,x);break;
                case 2:Delete(root,x);break;
    //            case 2:printf("%d
    ",Find(root,x));break;
                case 3:printf("%d
    ",Rank(root,x));break;
                case 4:printf("%d
    ",Kth(root,x));break;
                case 5:printf("%d
    ",Pre(root,x));break;
                case 6:printf("%d
    ",Sub(root,x));break;
            }
        //    cout<<op<<endl;
        }
        return 0;
    }
    View Code

    fhq treap:

    #include<bits/stdc++.h>
    #define rr NULL
    #define inf (1<<29)
    #define ro son
    #define RR NULL
    using namespace std;
    #define random org
    inline int random(){
        static int seed=707; 
        return seed=int(seed*48271LL%2147483647);
    }
    struct Treap{
        int key,siz,val;
        Treap *son[2];
        Treap() {}
        Treap (int x){
            siz=1; key=x; val=random();
            son[0]=son[1]=rr;
        }
        void rub() {
            siz=1; 
            if (son[0]) siz+=son[0]->siz;
            if (son[1]) siz+=son[1]->siz;
        }
    }; 
    void split (Treap *now,int k,Treap* &x,Treap* &y){
        if (!now) { x=y=rr; return ;}
        if (now->key<=k) x=now,split(x->son[1],k,x->son[1],y);
        if (now->key> k) y=now,split(y->son[0],k,x,y->son[0]);
        now->rub();
    }
    Treap* kth(Treap* now,int k){
        if (k>now->siz||!k) return rr;
        int com=now->son[0]?now->son[0]->siz:0; 
        if (k<=com) return kth(now->son[0],k);
        if (k==com+1) return now;
        return kth(now->son[1],k-com-1);
    } 
    Treap* merge(Treap *x,Treap *y){
        if (!x) return y; if (!y) return x;
        if (x->val<y->val) {x->son[1]=merge(x->son[1],y);x->rub();return x;}
        else {y->son[0]=merge(x,y->son[0]);y->rub();return y;}
    } 
    int Rank(Treap *t,int k){
        int r;
        if (!t) return inf;
        if (t->son[0]==rr) 
         r=0;else r=t->ro[0]->siz;
        if(k==t->key) return min(r+1,Rank(t->ro[0],k));
        if(k<t->key) 
         return Rank(t->ro[0],k);
        return r+1+Rank(t->ro[1],k);
    }
    int Pre(Treap *t,int k){
        if (!t) return -inf;
        if (k>t->key) return max(t->key,Pre(t->ro[1],k));
        return Pre(t->ro[0],k);
    }
    int Sub(Treap *t,int k){
        if (!t) return inf;
        if (k<t->key) return min(t->key,Sub(t->ro[0],k));
        return Sub(t->ro[1],k);
    }
    int Kth(Treap *t,int k){
        int cm=0;
        if (t->ro[0]) cm=t->ro[0]->siz;  
        cm++;
        if (cm==k)
         return t->key;
        if (cm>k) return Kth(t->ro[0],k);
        return Kth(t->ro[1],k-cm);
    }
    Treap* root,*x,*y,*z;
    int T,op,a;
    #define sight(c) ('0'<=c&&c<='9')
    inline void read(int &x) {
        static char c; static int b;
        for (b=1,c=getchar();!sight(c);c=getchar()) if (c=='-') b=-1;
        for (x=0;sight(c);c=getchar()) x=x*10+c-48;
        x*=b;
    }
    int main () {
        read(T);
        while (T--) {
            read(op); read(a);
            switch (op){
                case 1: split(root,a,x,y); root=merge(merge(x,new Treap(a)),y); break;
                case 2: split(root,a,x,z); split(x,a-1,x,y); 
                        if (y) y=merge(y->son[0],y->son[1]);
                        root=merge(merge(x,y),z); break;
                case 3:printf("%d
    ",Rank(root,a));break;
                case 4:printf("%d
    ",kth(root,a)->key);break;
                case 5:printf("%d
    ",Pre(root,a));break;
                case 6:printf("%d
    ",Sub(root,a));break;
            }
        }
    }
    View Code

    树链剖分:

    #include<bits/stdc++.h>
    #define sight(c) ('0'<=c&&c<='9')
    #define LL int
    #define gc nc
    #define L(x) (x&-x)
    #define eho(x) for(int i=head[x];i;i=net[i])
    #define N 200007
    LL q1[N],q2[N],gg,sum[N],a[N],T,G;
    int tot,fall[N<<1],net[N<<1],head[N],top[N],son[N],f[N],dp[N],siz[N],mo,be[N],ed[N],ok
    ,n,m,A,B,t[N],op,x,y,z,dla,OS; 
    inline char nc(){
        static char buf[1000000],*p1=buf,*p2=buf;
        return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
    }
    inline void swap(int &x,int &y) {x^=y; y^=x; x^=y;}
    inline void read(LL &x){
        static char c;
        for(c=gc();!sight(c);c=gc());
        for(x=0;sight(c);c=gc()) x=x*10+c-48;
    }
    void write(LL x){if (x<10) {putchar('0'+x);return;}write(x/10); putchar('0'+x%10);}
    inline void ADd(int x,int y) {
        fall[++tot]=y; net[tot]=head[x]; head[x]=tot;
    }
    inline void add(LL &x,LL y) {
        x=x+y; if (x>=mo) x=x%mo; if (x<0) x=x%mo+mo;
    } 
    inline void Add(LL *A,int x,int dla) {for (;x<N;x+=L(x)) add(A[x],dla);}
    inline void adds(int l,int r,int x) {
        Add(q1,l,x); Add(q1,r+1,-x); Add(q2,l,l*x%mo); Add(q2,r+1,-(r+1)*x%mo);
    }
    inline LL Query(LL *A,int x){for(G=0;x;x-=L(x)) add(G,A[x]);return G;}
    inline LL qurey(int l){
        return (sum[l]+(l+1)*1ll*Query(q1,l)-Query(q2,l))%mo;
    }
    void dfs(int x,int fa){
        siz[x]=1; son[x]=-1; dp[x]=dp[fa]+1; f[x]=fa;
        eho(x) if (fall[i]^fa) {
            dfs(fall[i],x); siz[x]+=siz[fall[i]];
            if ((!(~son[x]))||siz[fall[i]]>siz[son[x]]) son[x]=fall[i]; 
        }
    }
    void dfs2(int x,int las){
        t[++ok]=x;top[x]=las; be[x]=ok; 
        if (~son[x]) dfs2(son[x],las);
        eho(x) if ((fall[i]^f[x])&&(fall[i]^son[x])) dfs2(fall[i],fall[i]); ed[x]=ok;
    }
    void apd(int x,int y,LL dla){
        while (top[x]!=top[y]) {
            if (dp[top[x]]<dp[top[y]]) swap(x,y);
            adds(be[top[x]],be[x],dla);
            x=f[top[x]];
        } if (dp[x]>dp[y]) swap(x,y);
        adds(be[x],be[y],dla);
    }
    LL query_path(int x,int y) {
        LL O=0;
        while (top[x]!=top[y]) {
            if (dp[top[x]]<dp[top[y]]) swap(x,y);
            add(O,qurey(be[x])-qurey(be[top[x]]-1));
            x=f[top[x]];
        } if (dp[x]>dp[y]) swap(x,y);
        add(O,qurey(be[y])-qurey(be[x]-1));
        return O;
    }
    int main () {
        read(n); read(m); read(OS);read(mo);
        for (int i=1;i<=n;i++) read(a[i]);
        for (int i=1;i< n;i++) {read(A); read(B); ADd(A,B); ADd(B,A); }
        dfs(OS,0); dfs2(OS,OS);
        for (int i=1;i<=n;i++) sum[i]=sum[i-1],add(sum[i],a[t[i]]);
        while (m--) {
            read(op); 
            switch (op) {
                case 1: read(x),read(y),read(dla); apd(x,y,dla); break;
                case 2: read(x),read(y); write(query_path(x,y));putchar('
    '); break;
                case 3: read(x); read(z); adds(be[x],ed[x],z);  break;
                case 4: read(x); T=qurey(ed[x])-qurey(be[x]-1); add(T,0ll); 
                 write(T); putchar('
    ');break;
            }
        } return 0;
    }
    View Code

    主席树:

    #include<bits/stdc++.h>
    #define sight(c) ('0'<=c&&c<='9')
    #define inf (INT_MAX>>1)
    #define MID ((l+r)>>1)
    #define N 6500007
    #define SIZ 270007
    using namespace std;
    struct Node{
        int l,r,sun;
    }tree[N];
    int tot,I,n,m,t,l,r,k,root[SIZ];
    inline void read(int &x){
        static char c;static int b;
        for(b=1,c=getchar();!sight(c);c=getchar())if (c=='-')b=-1;
        for(x=0;sight(c);c=getchar()) x=x*10+c-48;
        x*=b;
    }
    void write(int x){
        if (x<10) {putchar('0'+x);return;}
        write(x/10);putchar('0'+x%10);
    }
    void add(int old,int &id,int x,int l,int r){
        id=++tot;
        tree[id]=tree[old]; tree[id].sun++;
        if (l==r) { return; }
        if (x<=MID) add(tree[old].l,tree[id].l,x,l,MID);
        else add(tree[old].r,tree[id].r,x,MID+1,r);
    }
    int query(int L,int R,int k,int l,int r){
        if (l==r) return l;
        int cnt=tree[tree[R].l].sun-tree[tree[L].l].sun;
        if (cnt>=k)
        return query(tree[L].l,tree[R].l,k,l,MID);
        return query(tree[L].r,tree[R].r,k-cnt,MID+1,r);
    }
    int main () {
    //    freopen("a.in","r",stdin);
        read(n); read(m);
        for (int i=1;i<=n;i++) {
         root[i]=tot+1;read(t);
         add(root[i-1],I,t,-inf,inf);  }
        while(m--) {
            read(l); read(r); read(k);
            write(query(root[l-1],root[r],k,-inf,inf));putchar('
    ');
        }
        return 0;
    }
    View Code

    带修改主席树:原题

    #pragma GCC optimize("-O2")
    #include <bits/stdc++.h>
    using namespace std;
    #define N 100005
    #define int long long
    #define LL long long
    #define INF 2187654321LL
    #define INFF 4387654321LL
    #define abs(x) (x>0?x:-x)
    int n,q,zz,at,k,a[N],ans,AAA;
    LL last,L,R,Mid;
    #define getchar nc
    #define sight(c) ('0'<=c&&c<='9')
    inline char nc(){
    static char buf[1000000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
    }
    inline void read(int &x){
        static char c;static int b;
        for (b=1,c=getchar();!sight(c);c=getchar())if (c=='-') b=-1;
        for (x=0;sight(c);c=getchar())x=x*10+c-48; x*=b;
    }
    struct Seg{ int l,r;int w; } T[N<<6|1];
    int cnt,rt1[N],rt2[N];
    #define MID (l+r>>1)
    void add(int k,LL l,LL r,LL pos,int &x){
        x=++cnt; T[x]=T[k]; T[x].w++;
        if (l==r) return;
        if (pos<=MID) add(T[x].l,l,MID,pos,T[x].l);else add(T[x].r,MID+1,r,pos,T[x].r);
    }
    inline int query(int x,LL l,LL r,LL rr){
        AAA=0;
        while (l^r)  if (rr<=MID) r=MID,x=T[x].l; else AAA+=T[T[x].l].w,l=MID+1,x=T[x].r;
        return AAA+T[x].w;
    }
    #undef MID
    #define Mid (L+R>>1)
    void write(LL x){if (x<10) {putchar('0'+x); return;} write(x/10); putchar('0'+x%10);}
    inline void writeln(LL x){ if (x<0) putchar('-'),x*=-1; write(x); putchar('
    '); }
    signed main() {
    //    freopen("b.in","r",stdin);
    //    freopen("B.out","w",stdout);
        read(n);read(q);read(zz);
        for (int i=1;i<=n;i++) read(a[i]);
        for (int i=1;i<=n;i++) add(rt1[i-1],0,INFF,(LL)a[i]-zz+INF,rt1[i]);
        for (int i=1;i<=n;i++) add(rt2[i-1],0,INFF,(LL)a[i]+i+INF,rt2[i]);
        while (q--){
            read(at);read(k);
            at=(1ll*at^abs(last))%n+1;k=(1ll*k^abs(last))%n+1;
            L=0;R=INFF;
            while (L<R){ 
                ans=query(rt1[at],0,INFF,Mid);
                ans+=query(rt2[n],0,INFF,Mid+at)-query(rt2[at],0,INFF,Mid+at);
                if (ans>=k) R=Mid; else L=Mid+1;
            }
            writeln(last=(L-INF));
        }
        return 0;
    }
    View Code

    lca:

    inline int lca(int x,int y){
        if (dep[x]<dep[y]) swap(x,y);
        for (int i=SIZ-1;~i;i--) if (dep[f[i][x]]>=dep[y]) x=f[i][x];
        if (x==y) return x;
        for (int i=SIZ-1;~i;i--) if (f[i][x]^f[i][y]) x=f[i][x],y=f[i][y];
        return f[0][x];
    }
    View Code

    线性基:

    void Guass()
    {
        for (int i=1;i<=n;i++)
         for (int j=62;~j;j--)
            if ((A[i]>>j)&1) 
             if (!P[j]) {P[j]=A[i]; break;} 
             else A[i]^=P[j];
        for (int j=0;j<=62;j++) if (P[j]) OT[r++]=P[j];
    }
    View Code

    2-sat:调整卫星[NKOJ 3814]

    #include<bits/stdc++.h>
    #define M 4010303
    #define N 2071
    #define LL long long
    #define eho(x) for(int i=head[x];i;i=net[i])
    #define MARICLE __attribute__((optimize("-O2")))
    using namespace std;
    char c;int bb;
    int n,m,tot,X,Y,K;
    int uusd[N];
    int A[N],B[N];
    int fall[M],net[M],head[N],low[N],dfn[N],tim,size,in[N];
    int p[N];
    stack <int> S;
    MARICLE inline LL sr(int x){
        return 1ll*x*x;
    }
    MARICLE inline void read(int &x) {
        c=getchar();
        bb=1;
        for (; !(c>='0' && c<='9'); c=getchar()) if (c=='-') bb=-1;
        for (x=0; c>='0' && c<='9'; x=x*10+c-'0',c=getchar());
        x*=bb;
    }
    MARICLE inline void read(long long &x) {
        c=getchar();
        bb=1;
        for (; !(c>='0' && c<='9'); c=getchar()) if (c=='-') bb=-1;
        for (x=0; c>='0' && c<='9'; x=x*10+c-'0',c=getchar());
        x*=bb;
    }
    MARICLE inline void add(int x,int y){
        fall[++tot]=y; net[tot]=head[x]; head[x]=tot; 
    }
    MARICLE void tarjan(int x) {
        int u;
        low[x]=dfn[x]=++tim;
        uusd[x]=1;
        S.push(x);
        eho(x){
            u=fall[i];
            if (dfn[u]==0) {tarjan(u);low[x]=min(low[x],low[u]);}   
            else
             if (uusd[u])
             low[x]=min(low[x],dfn[u]);
        }
        if (low[x]==dfn[x]) {
                ++size;
                do {
                    u=S.top(); S.pop();
                    in[u]=size;  uusd[u]=0;
                }while (x!=u);
            }
    }
    MARICLE bool ty(LL x){
         memset(head,0,sizeof head);tot=0;tim=0;
         memset(dfn,0,sizeof dfn);size=0;
        for (int i=1;i<=2*n;i++)
         for (int j=i+1;j<=2*n;j++)
          if ((i+1)/2!=(j+1)/2&&(LL)(sr(A[i]-A[j])+sr(B[i]-B[j])<x))
                 add(i,p[j]),add(j,p[i]);
        for (int i=1; i<=2*n; i++)
            if (!dfn[i]) tarjan(i);
        for (int i=1;i<=n;i++)
         if (in[i<<1]==in[i*2-1]) return false;
        return true;
    }
    MARICLE int main () {
        //freopen("a.in","r",stdin);
        read(n); 
        for (int i=1;i<=n;i++)
         p[i*2-1]=i*2,p[i*2]=i*2-1;
        for (int i=1;i<=n;i++){
             read(X);read(Y);read(K);
             A[i*2-1]= (X);  A[i*2  ]= (X); 
             B[i*2-1]= (Y+K); B[i*2  ]= (Y-K); 
         }
        LL r=1ll<<17,ans=0;
        while (r){
            if(ty(ans+r)) ans+=r;
            r>>=1;
        } printf("%lld
    ",ans);
    }
    View Code

    purfer序列 :明明的烦恼[HNOI 2008]

    #include<bits/stdc++.h>  
    using namespace std;  
    const int size=168;  
    const int data[size+1]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,  
    79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,  
    193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,  
    313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,  
    443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,  
    587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,  
    719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857  
    ,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997};  
    int n,len,i,a,sum,j,k,sumsum;  
    int t[10001],ans[size+1];  
    void C(int n,int m)  
    {  
      int i,p,j;  
      for (i=m+1;i<=n;i++)  
      {  
        p=i;j=1;  
        while (p>1){while (p%data[j]==0) {ans[j]++;p/=data[j];}j++;}  
      }  
      for (i=1;i<=n-m;i++)  
      {  
        p=i;j=1;  
        while (p>1){while (p%data[j]==0) {ans[j]--;p/=data[j];}j++;}  
      }  
    }  
    int main()  
    {  
        //freopen("bzoj_1005.in","r",stdin);
        //freopen("bzoj_1005.out","w",stdout);
      scanf("%d",&n);len=n-2;  
      if (n==1) {
        int sb;
        cin>>sb;
        if (sb==0 ||sb==-1)
        cout<<1;
        else cout<<0;
        return 0;
      }
      for (i=1;i<=n;i++)  
      {  
        scanf("%d",&a);  
        if (a==0||len-(a-1)<0) {printf("0");return 0;}  
        if (a==-1) {sum++;continue;}a--;  
        C(len,a);len-=a;  
        sumsum=sumsum+(a-1);
      }  
      if (sumsum!=n-2 && sum==0)
      {
        cout<<0;
        return 0;
      }
      if (len)  
      {  
        j=1;  
        while (sum>1){while (sum%data[j]==0) {ans[j]+=len;sum/=data[j];} j++;}  
      }  
      t[1]=1;k=1;  
      for (i=1;i<=size;i++)  
        while (ans[i])  
        {  
          ans[i]--;  
          for (j=1;j<=k;j++) t[j]*=data[i];  
          for (j=1;j<=k;j++) if (t[j]>9) {t[j+1]+=t[j]/10;t[j]%=10;}  
          while (t[k+1]) {k++;t[k+1]+=t[k]/10;t[k]%=10;}  
        }  
      for (i=k;i>0;i--)printf("%d",t[i]);  
      return 0;  
    }  
    View Code

    FFT:

    #include<bits/stdc++.h>
    #define db double
    #define fo(i,a,b) for(int i=a;i<=b;i++)
    #define pi acos(-1)
    #define N 3378123
    #define com rrsb
    using namespace std;
    struct com{
        db r,i;
        com(){}
        com(db a,db b):r(a),i(b){}
    };
    inline com operator + (const com A,const com B) {
            return com(A.r+B.r,A.i+B.i);
        }
    inline com operator - (const com A,const com B) {
            return com(A.r-B.r,A.i-B.i);
        }
    inline com operator * (const com A,const com B) {
            return com(A.r*B.r-A.i*B.i,A.i*B.r+A.r*B.i);
        }
    com a[N],b[N],X,Y;
    int c[N],R[N],n,m,L;
    char ch[N];
    bool bo;
    inline int read(){
        int f=1,x=0;char ch;
        do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
        do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
        return f*x;
    }
    inline void fft(com *a,int x){
        fo(i,0,n-1) if(i < R[i]) swap(a[i],a[R[i]]);
        for (int i=1;i<n;i<<=1)// 注意这里的n不是输入的n
         { com wn(cos(pi/i),x*sin(pi/i));
          for (int j=0;j<n;j+=(i<<1)){
              com w(1,0);
               for (int k=0;k<i;k++,w=w*wn) {
                   X=a[j+k]; Y=w*a[j+k+i];
                   a[j+k]=X+Y; a[i+j+k]=X-Y;
               }
          }
        }
        if (x==-1) fo(i,0,n-1) a[i].r=a[i].r/n;
    }
    int main () {
        //0freopen("a.in","r",stdin);
        n=read();m=read();
        for(int i=0;i<=n;i++)a[i].r=read();
        for(int i=0;i<=m;i++)b[i].r=read(); m+=n;
        for(n = 1;n <= m ;n <<= 1) ++L;// get size 
        fo(i,0,n-1) R[i] = (R[i>>1]>>1)|((i&1)<<(L-1));//do ni pair
        fft(a,1); fft(b,1);
        fo(i,0,n) a[i]=a[i]*b[i];
        fft(a,-1);
        fo(i,0,m) c[i]=(int)(a[i].r+0.5);
        fo(i,0,m) printf("%d ",c[i]);
        return 0;
    }
    View Code

    CDQ:

    #include<bits/stdc++.h>
    #define sight(c) ('0'<=c&&c<='9')
    #define N 200007
    inline void read(int &x){
        static char c;
        for (c=getchar();!sight(c);c=getchar());
        for (x=0;sight(c);c=getchar())x=x*10+c-48;
    }
    void write(int x){if (x<10) {putchar('0'+x); return;} write(x/10); putchar('0'+x%10);}
    inline void writeln(int x){if (x<0) x*=-1,putchar('-'); write(x); putchar('
    '); }
    using namespace std;
    struct Node{
        int a,b,c,id;
        inline bool operator <(const Node& A)const{
           if (a==A.a) { if (b==A.b) return c<A.c; return b<A.b; } return a<A.a;
        }
        inline bool operator ==(const Node& A)const{
           return A.a==a&&A.b==b&&A.c==c;
        }
    }p[N>>1],a[N>>1];
    struct Tre{
        #define L(x) x&-x
        int s[N];
        void in(int x,int dla) {for (;x<N;x+=L(x)) s[x]+=dla;}
        int ask(int x) {static int L;for (L=0;x;x-=L(x)) L+=s[x]; return L;}
        void clear() {memset(s,0,sizeof s);}
        #undef L
    }Tree;
    int ans[N>>1],n,k,tot,id[N>>1];
    inline bool cmp(const Node &x,const Node &y){
        if (x.b==y.b) return x.id<y.id;
        return x.b<y.b;
    }
    #define Mid ((l+r)>>1)
    void cqh(int l,int r){
        if (l==r) return;
        for (int i=l;i<=r;i++) p[i]=a[i],p[i].id=i;
        sort(p+l,p+r+1,cmp);
        for (int i=l;i<=r;i++)
         if (p[i].id<=Mid) Tree.in(p[i].c,1);
         else ans[a[p[i].id].id]+=Tree.ask(p[i].c);
        for (int i=l;i<=r;i++) if (p[i].id<=Mid) Tree.in(p[i].c,-1);
        cqh(l,Mid); cqh(Mid+1,r);
    }
    int main () {
    //    freopen("cqh800Ton.in","r",stdin);
        read(n); read(k);
        for (int i=1;i<=n;i++)
         read(a[i].a),read(a[i].b),read(a[i].c),a[i].id=i;
        sort(a+1,a+n+1);
        for (int i=n-1;i;i--) {
            if (a[i]==a[i+1]) tot++; else tot=0;
            ans[a[i].id]=tot;
        }
        cqh(1,n);
        for (int i=1;i<=n;i++) id[ans[i]]++;
        for (int i=0;i<n;i++) writeln(id[i]);
        return 0;
    }
    View Code

     pollard_rho:[CZOI_NOIP2017_27]

    #include<bits/stdc++.h>
    #define N 20005
    #define LL long long
    using namespace std;
    #define INF 2e18
    LL f[N],n,mo,T;
    LL divsor[100];
    int dcnt=0;
    LL dmi=INF;
    #define TIMES 15
    LL mul(LL x,LL y,LL MOD)
    {
        LL tmp=(x*y-(LL)((long double)x/MOD*y+1e-8)*MOD)%MOD;
        if (tmp<0) tmp+=MOD;
        return tmp;
    }
    LL ksm(LL x,LL y,LL MOD)
    {
        LL ans=1;x%=MOD;
        while (y)
        {
            if (y&1) ans=mul(ans,x,MOD);
            x=mul(x,x,MOD);y>>=1;
        }
        return ans;
    }
    LL GetRandom(LL n)
    {
        LL num = (((unsigned LL)rand() + 100000007)*rand())%n;
        return num+1;
    }
    LL Mod_Mul(LL a,LL b,LL mod)
    {
        LL msum=0;
        while(b)
        {
            if(b&1) msum = (msum+a)%mod;
            b>>=1;
            a = (a+a)%mod;
        }
        return msum;
    }
    LL Quk_Mul(LL a,LL b,LL mod)
    {
        LL qsum=1;
        while(b)
        {
            if(b&1) qsum=Mod_Mul(qsum,a,mod);
            b>>=1;
            a=Mod_Mul(a,a,mod);
        }
        return qsum;
    }
    bool Miller_Rabin(LL n)
    {
        if(n==2||n==3||n==5||n==7||n==11||n==13||n==17||n==41) return true;
        if(n==1||n%2==0||n%3==0||n%5==0||n%7==0||n%11==0||n%41==0||n%17==0) return false;
        if (n%13==0) return false;
        int div2=0;
        LL tn=n-1;
        while( !(tn%2) )
        {
            div2++;
            tn/=2;
        }
        for(int tt=0;tt<TIMES;tt++)
        {
            LL x=GetRandom(n-1); //随机得到[1,n-1]
            if(x==1) continue;
            x=Quk_Mul(x,tn,n);
            LL pre=x;
            for(int j=0;j<div2;j++)
            {
                x = Mod_Mul(x, x, n);
                if(x==1&&pre!=1&&pre!=n-1) return false;
                pre=x;
            }
            if(x!=1) return false;
        }
        return true;
    }
    LL gcd(LL a,LL b)
    {
        if(b==0) return a;
        return gcd(b,a%b);
    }
    LL pollard_rho(LL dn,LL dc)
    {
        LL x,y,d,i=1,k=2;
        x = GetRandom(dn-1);
        y = x;
        while(1)
        {
            i++;
            x = (Mod_Mul(x, x, dn) + dc)%dn;
            d = gcd( y-x , dn );
            if(1 < d && d < dn )
                return d;
            if( y==x ) return dn;
            if( i==k )
            {
                y=x;
                k <<= 1;
            }
        }
    }
    void Divide(LL dn,int dk)
    {
        if(dn==1) return ;
        if( Miller_Rabin(dn) == true )
        {
            divsor[dcnt++]=dn;
            dmi = min(dmi,dn);
            return ;
        }
        LL dtmp=dn;
        while(dtmp>=dn) dtmp = pollard_rho(dtmp,dk--);//随机寻找dn的因子,dtmp
        Divide(dtmp, dk);
        Divide(dn/dtmp,dk);
    }
    void work(LL x,LL mo) {
        if (x==1) {printf("%d
    ",1); return;}
        if (x==4) {printf("%d
    ",8%mo); return;}
        memset(divsor,0,sizeof divsor); dcnt=0;
        if( Miller_Rabin(n) )  divsor[++dcnt]=n;else {dcnt++;Divide(x,251);}
        while (divsor[dcnt]==0) dcnt--;
        sort(divsor+1,divsor+dcnt+1);
        for (int i=1;i<=dcnt;i++) if (divsor[i]==divsor[i-1]) 
        {printf("-1
    "); return;}  f[0]=1;
        for (int i=1;i<(1<<dcnt);i++)
        {
            int s=0;f[i]=0;
            for (int j=i;j;j-=j&(-j),s++);
            for (int j=1;j<=dcnt;j++)
                if (i&(1<<(j-1))) f[i]=(f[i]+mul(f[i-(1<<(j-1))],ksm(divsor[s],divsor[j]-1,mo),mo))%mo;
        }
        printf("%lld
    ",f[(1<<dcnt)-1]);return;
    }
    int main () {
        srand(unsigned(time(0)));
        scanf("%d",&T);
        while (T--) {
            scanf("%lld%lld",&n,&mo);
            work(n,mo);
        }
        return 0;
    }
     
    View Code

    A_star

    #include<bits/stdc++.h>
    using namespace std;
    #define sight(c) ('0'<=c&&c<='9')
    #define N 2000005
    #define Eho(x) for(int i=Head[x];i;i=Net[i])
    #define eho(x) for(int i=head[x];i;i=net[i])
    #define NN 5005
    #define db double
    int L,tot,Tot,head[NN],Head[NN],net[N>>3],Net[N>>3],fall[N>>3],Fall[N>>3];
    int u[NN],INF,n,X,len,ans,cnt[NN],M,s,t;
    db l,vis[NN],cost[N>>3],Cost[N>>1],E,co;
    char c;
    inline void read(int &x){
        for (c=getchar();!sight(c);c=getchar());
        for (x=0;sight(c);c=getchar()) x=x*10+c-48;
    }
    inline void read(db &x){
        read(L); x=L; l=.1;
        if (c=='.') for (c=getchar();sight(c);c=getchar(),l*=0.1) x+=(c-48)*l;
    } 
    inline void write(int x) {if (x<10) {putchar('0'+x);return;}write(x/10),putchar('0'+x%10);}
    inline void writeln(int x){write(x),putchar('
    ');}
    inline void add(int x,int y,db co){
        fall[++tot]=y; net[tot]=head[x]; head[x]=tot; cost[tot]=co;
    }
    inline void Add(int x,int y,db co){
        Fall[++Tot]=y; Net[Tot]=Head[x]; Head[x]=Tot; Cost[Tot]=co;
    }
    struct star{
        int id; db now,add;
        inline bool operator<(const star& AAA) const{
            return add>AAA.add;
        } 
        star() {}
        star(int x,db a,db b):id(x),now(a),add(b){}
    }hep[N];
    star A;
    queue<int> Q;
    void spfa(int s,int t){
        Q.push(s); u[s]=1; 
        for (int i=1;i<n;i++) vis[i]=1e9;
        while (!Q.empty()) {
            X=Q.front(); Q.pop();
            Eho(X) if (vis[Fall[i]]>vis[X]+Cost[i]) {
                vis[Fall[i]]=vis[X]+Cost[i];
                if (!u[Fall[i]]) u[Fall[i]]=1,Q.push(Fall[i]);
            }
            u[X]=0;
        }
    }
    void put(int id,db now,db add){hep[++len]=star(id,now,add),push_heap(hep+1,hep+1+len);}
    inline star get(){pop_heap(hep+1,hep+1+len);return hep[len--];}
    void Astar(){
        put(1,0,vis[1]);
        while (len) {
            A=get();
            if (A.add>E) return;
            if (A.id==n) {ans++;E-=A.add; continue;}
            if (++cnt[A.id]>INF) continue;
            eho(A.id) 
             put(fall[i],(A.now)+cost[i],(A.now)+cost[i]+vis[fall[i]]);
        }
    }
    int main () {
    //    freopen("a.in","r",stdin);
        read(n); read(M); read(E);
        while (M--) {
            read(s); read(t),read(co);
            add(s,t,co),Add(t,s,co);
        }
        spfa(n,1); INF=E/vis[1];
        Astar();
        writeln(ans); return 0;
    }
    View Code

    SAM:

    #pragma optimize("-O2")
    #include<bits/stdc++.h>
    #define N 3000003
    #define max(a,b) ((a)>(b)?(a):(b))
    #define min(a,b) ((a)<(b)?(a):(b))
    using namespace std;
    struct S{
        int c[26],fa,val;
    }T[N];
    int tot=1,tmp,n,len,c[N],id[N],now,ti,x,last,siz[N];
    long long ans;
    char ch[N];
    inline int Sam(int x,int last){
        int np=++tot;
        T[np].val=T[last].val+1;
        for(;last&&(!T[last].c[x]);last=T[last].fa) T[last].c[x]=np;
        if (!last) T[np].fa=1;
        else {
            int q=T[last].c[x];
            if (T[last].val+1==T[q].val) T[np].fa=q;
            else {
                int nq=++tot;  T[nq]=T[q];
                T[nq].val=T[last].val+1;
                T[q].fa=T[np].fa=nq;
                for (;last&&T[last].c[x]==q;last=T[last].fa) T[last].c[x]=nq;
            }
        }
        siz[np]=1;
        return np;
    }
    int main () {
    //    freopen("a.in","r",stdin);
       scanf("%s",ch); len=strlen(ch);last=1; 
       for (int i=0;i<len;i++) last=Sam(ch[i]-'a',last);
       for (int i=1;i<=tot;i++) c[T[i].val]++;
       for (int i=1;i<=len;i++) c[i]+=c[i-1];
       for (int i=1;i<=tot;i++) id[c[T[i].val]--]=i;
       for (int i=tot;i;i--) {
             int p=id[i];
             siz[T[p].fa]+=siz[p];
             if (siz[p]>1) ans=max(ans,1ll*siz[p]*T[p].val);
       }
       printf("%lld
    ",ans); return 0;
    }
    View Code

    Manacher

    #pragma GCC optimize("-O2")
    #include<bits/stdc++.h>
    #define N 22300007
    using namespace std;
    int tot,len,mr,pos,ml,p[N];
    char ch[N],s[N];
    int main () {
        s[0]='$';
        scanf("%s",ch);
            len=strlen(ch);tot=0;
            for (int i=0;i<len;i++)
             s[++tot]='#',s[++tot]=ch[i];
            s[++tot]='#'; s[++tot]=21;
             mr=pos=ml=0;
            for (int i=1;i<tot;i++) {
                if (i<mr) p[i]=min(p[pos*2-i],mr-i);
                else p[i]=1;
                while (s[i+p[i]]==s[i-p[i]]) p[i]++;
                if (i+p[i]>mr)  mr=i+p[i],pos=i;
                ml=max(ml,p[i]-1);
            }
            printf("%d
    ",ml);
    }
    View Code

    KMP:

    #pragma GCC optimize("-O2")
    #include<bits/stdc++.h>
    //#define getchar nc
    #define min(a,b) ((a)<(b)?(a):(b))
    #define max(a,b) ((a)>(b)?(a):(b))
    #define sight(c) ('0'<=c&&c<='9')
    #define swap(a,b) a^=b,b^=a,a^=b
    #define LL long long
    #define deg printf
    #define dput put
    #define dputc putchar
    #define db double
    #define eho(x) for(int i=head[x];i;i=net[i])
    inline char nc(){
    static char buf[1000000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
    }
    inline void read(int &x){
        static char c;
        for (c=getchar();!sight(c);c=getchar());
        for (x=0;sight(c);c=getchar())x=x*10+c-48;
    }
    void write(int x){if (x<10) {putchar('0'+x); return;} write(x/10); putchar('0'+x%10);}
    inline void writeln(int x){ if (x<0) putchar('-'),x*=-1; write(x); putchar('
    '); }
    inline void writel(int x){ if (x<0) putchar('-'),x*=-1; write(x); putchar(' '); }
    using namespace std;
    #define N 1000007
    char s1[N+7],s2[N+7];
    int j,len1,len2,kmp[N+7];
    signed main() {
        scanf("%s",s1+1); len1=strlen(s1+1);
        scanf("%s",s2+1); len2=strlen(s2+1);
        for (int i=2;i<=len2;i++) {
            while (j&&s2[i]!=s2[j+1]) j=kmp[j];
            if (s2[j+1]==s2[i]) j++;
            kmp[i]=j;
        } j=0;
        for (int i=1;i<=len1;i++) {
            while (j&&s1[i]!=s2[j+1]) j=kmp[j];
            if (s2[j+1]==s1[i]) j++;
            if (j==len2) {writeln(i-j+1); j=kmp[j];} 
        }
        for (int i=1;i<=len2;i++) writel(kmp[i]);
        return 0;
    }
    View Code

    ex_gcd:

    #include<bits/stdc++.h>
    #define mod(x,b) ((x%b+b)%b)
    using namespace std;
    int x,y,a,b,t;
    int e_gcd(int a,int b,int &x,int &y){
        if (b==0) {
            x=1; y=0; return a;
        }
        int yy=e_gcd(b,a%b,x,y);
        int tep=x;
        x=y;
        y=tep-(a/b)*y;
        return yy;
    }
    int main () {
        scanf("%d",&t);
        while (t--) {
            scanf("%d%d",&a,&b);
            if (e_gcd(a,b,x,y)==1) {
                x=mod(x,b);if (x==0) x=b;
                printf("%d
    ",x);
            }
            else printf("Not Exist
    ");
        }
    }
    View Code

    带权并查集:

    #include<bits/stdc++.h>
    #define N 201001
    using namespace std;
    char c;int b;
    int n,m,k,l,r,czy,ans,fa,fb;
    int f[N],val[N],sum[N],net[N];
    inline void read(int &x) {
        c=getchar();
        b=1;
        for (; !(c>='0' && c<='9'); c=getchar()) if (c=='-') b=-1;
        for (x=0; c>='0' && c<='9'; x=x*10+c-'0',c=getchar());
        x*=b;
    }
    /*int getfa(int i)
    {
        int x,top,j,next;
        x=i;
        while (f[x]!=x) x=f[x];
        top=i;
        while (top!=x)
        {
            next=f[top]; f[top]=x;
            j=next;
            do
            {
                val[top]=(val[top]^val[j]);
                j=f[j];
                  
            } while (j!=f[j]);
            top=next;  
         } 
         return x;
    }*/
    int getfa(int x)
    {
        if (f[x]==x) return x;
        int ret=getfa(f[x]);
        val[x]^=val[f[x]];
        return f[x]=ret;
    }
    int main () {
         read(n); read(m); read(czy);
         for (int i=1;i<=n;i++) f[i]=i;
         for (int i=1;i<=m;i++) {
            read(l); read(r); read(k);
            l=l^(ans*czy);r=r^(ans*czy);k=k^(ans*czy);
            l=l-1;
            fa=getfa(l); fb=getfa(r);
            if (fa==fb) {
                if ((val[r]^val[l])!=k) ans=0;
                else ans=1;
            } else {
                if (fa>fb) {
                    f[fa]=r; val[fa]=k^val[l];ans=1;
                }
                if (fa<fb) {
                    f[fb]=l; val[fb]=k^val[r];ans=1;
                }
            }
            printf("%d
    ",ans);
         }
        for (int i=1;i<=n;i++){
            getfa(i);
            if (f[i]!=i) {sum[i]=sum[f[i]]^val[i];} else sum[i]=sum[i-1];
            //printf("%d
    ",sum[i]^sum[i-1]);
        }
        for (int i=1;i<=n;i++)
         printf("%d
    ",sum[i]^sum[i-1]);
       return 0;
    }
    View Code

    ST:

    #include<bits/stdc++.h>
    #define SIZ 10
    #define LL long long
    #define N 1307
    #define y1 YII
    #define min(a,b) ((a)<(b)?(a):(b))
    #define max(a,b) ((a)>(b)?(a):(b))
    #define INF (1<<28)
    #define MARICLE __attribute__((optimize("-O4")))
    #define getchar nc
    using namespace std;
    char c; int b;
    MARICLE inline char nc(){
    static char buf[1000000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
    }
    MARICLE inline void read(int &x) {
        c=getchar(); b=1;
        for (; !(c>='0' && c<='9'); c=getchar()) if (c=='-') b=-1;
        for (x=0; c>='0' && c<='9'; x=x*10+c-'0',c=getchar());
        x*=b;
    }
    MARICLE void write(int x) {
        if (x<10) { putchar('0'+x); return;}
        write(x/10); putchar('0'+x%10); 
    }
    MARICLE void write(LL x) {
        if (x<10) { putchar('0'+x); return;}
        write(x/10); putchar('0'+x%10); 
    }
    int n,m,a[N][N],mi[N][N][SIZ],ma[N][N][SIZ],q,ANW,x1,x2,y1,y2,xs,ys,MI,SI,SY;
    LL sum[N][N];
    char ch[100];
    MARICLE int main () {
        read(n);
        read(m);
        for (int i=1,j; i<=n; i++)
            for (j=1; j<=m; j++)
                read(a[i][j]),sum[i][j]=a[i][j]+sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1];
        for (int i=n; i ; i--)
            for (int j=m; j; j--)
                ma[i][j][0]=mi[i][j][0]=a[i][j];
        for (int k=1,i,j; k<SIZ; k++)
            for (i=n; i; i--)
                for (j=m; j; j--) {
                    ma[i][j][k]=max(max(ma[i][j][k-1],ma[i+(1<<k-1)][j+(1<<k-1)][k-1])
                                    ,max(ma[i+(1<<k-1)][j][k-1],ma[i][j+(1<<k-1)][k-1]));
                    mi[i][j][k]=min(min(mi[i][j][k-1],mi[i+(1<<k-1)][j+(1<<k-1)][k-1])
                                    ,min(mi[i+(1<<k-1)][j][k-1],mi[i][j+(1<<k-1)][k-1]));
                }
        read(q);
        while (q--) {
            c=getchar();
            while (c<'A'||c>'Z') c=getchar();
            c=getchar();
            if (c=='U') {
                read(x1); x1++; read(y1); y1++;
                read(x2); x2++; read(y2); y2++;
                write(1ll*sum[x2][y2]+sum[x1-1][y1-1]-sum[x2][y1-1]-sum[x1-1][y2]); 
                putchar('
    ');
            } else if (c=='I') {
                read(x1); x1++; read(y1); y1++;
                read(x2); x2++; read(y2); y2++;
                xs=x2-x1+1; ys=y2-y1+1;
                MI=min(xs,ys); SI=0;
                while ((1<<SI+1)<=MI) SI++;
                SY=1<<SI; int i=x1,j=y1;
                ANW=INF;
                while (1) {
                    j=y1;
                    while (1) {
                        ANW=min(ANW,mi[i][j][SI]);
                        if (j==y2-SY+1) break;
                        j+=SY;
                        if (j+SY-1>=y2) j=y2-SY+1;
                    }
                    if (i==x2-SY+1) break;
                    i+=SY;
                    if (i+SY-1>=x2) i=x2-SY+1;
                }
                write(ANW);putchar('
    ');
            } else {
                read(x1); x1++; read(y1); y1++;
                read(x2); x2++; read(y2); y2++;
                xs=x2-x1+1;
                ys=y2-y1+1;
                MI=min(xs,ys);
                SI=0;
                while ((1<<SI+1)<=MI) SI++;
                SY=1<<SI;
                int i=x1,j=y1;
                ANW=0;
                while (1) {
                    j=y1;
                    while (1) {
                        ANW=max(ANW,ma[i][j][SI]);
                        if (j==y2-SY+1) break;
                        j+=SY;
                        if (j+SY-1>=y2) j=y2-SY+1;
                    }
                    if (i==x2-SY+1) break;
                    i+=SY;
                    if (i+SY-1>=x2) i=x2-SY+1;
                }
                write(ANW);putchar('
    ');
            }
        }
        return 0;
    }
    View Code

    凸包:

    #include<bits/stdc++.h>
    #define N 10007
    #define inf INT_MAX
    using namespace std;
    struct P{
        int x,y;
        P(){}
        P(int a,int b):x(a),y(b){}
        P operator + (const P &A)const{return P(x+A.x,y+A.y);}
        P operator - (const P &A)const{return P(x-A.x,y-A.y);}
        bool operator < (const P&A)const{if (x==A.x) return y<A.y;return x<A.x;} 
        int operator * (const P &A)const{return x*A.y-y*A.x;}
    }a[N],x;
    inline void read(int &x) {
    char c=getchar();int b=1;
    for (; !(c>='0' && c<='9'); c=getchar()) if (c=='-') b=-1;
    for (x=0; c>='0' && c<='9'; x=x*10+c-'0',c=getchar());
    x*=b;
    }
    int n,s[N],top;
    bool cmp(int x,int y){
        if (a[x].x==a[y].x) return a[x].y<a[y].y;
        return a[x].x<a[y].x;
    }
    int main () {
    //  freopen("a.in","r",stdin);
        read(n);
        for (int i=0;i<n;i++)
         { read(a[i].x),read(a[i].y);}
        sort(a,a+n);
        int m = 0;  
        for(int i = 0; i < n; i++) {  
            while(m>1&&((a[s[m-1]]-a[s[m-2]])*(a[i]-a[s[m-2]])<=0))m--;  
            s[m++]=i;  
        }  
        int k = m;  
        for(int i = n-2;~i; i--) {  
            while(m>k&&(a[s[m-1]]-a[s[m-2]])*(a[i]-a[s[m-2]])<=0) m--;  
            s[m++] =i;  
        }  
        if(n>1) m--;
        sort(s,s+m,cmp);  
        printf("%d
    ",m);
        for (int i=0;i<m;i++)
         printf("%d %d
    ",a[s[i]].x,a[s[i]].y);
        return 0;
    }
    View Code

    矩乘:

    #include<bits/stdc++.h>
    #define mo 1000000007
    #define fo(i,a,b) for(int i=a;i<=b;i++)
    #define LL long long
    using namespace std;
    LL f[3][3],a[3][3],tmp[3][3],gn;
    int T;
    void cheng(LL (&a)[3][3],LL (&b)[3][3]) {
        memset(tmp,0,sizeof tmp);
        fo(i,1,2)fo(j,1,2)fo(k,1,2) {tmp[i][k]+=(1ll*a[i][j]*b[j][k])%mo;
          if (tmp[i][k]>mo) tmp[i][k]-=mo;}
        memcpy(a,tmp,sizeof tmp);
    }
    void cheng1(LL (&a)[3][3],LL (&b)[3][3]) {
        memset(tmp,0,sizeof tmp);
        fo(i,1,2)fo(k,1,2)fo(j,1,2) {tmp[i][k]+=(1ll*a[i][j]*b[j][k])%mo;
          if (tmp[i][k]>mo) tmp[i][k]-=mo;}
        memcpy(a,tmp,sizeof tmp);
    }
    void qsm (LL (&f)[3][3],LL (&a)[3][3],LL p){
        while (p){
            if (p&1) cheng1(f,a);
            cheng(a,a); p>>=1; 
        }
    }
    int main () {
        scanf("%d",&T);
        while (T--) {
            scanf("%lld",&gn);
            f[1][1]=1; f[2][2]=1;
            f[1][2]=0; f[2][1]=0;
            a[1][1]=0; a[2][1]=1;
            a[1][2]=1; a[2][2]=1;
            qsm(f,a,gn*2+2);
            printf("%lld
    ",f[2][2]-1);
        }
        return 0;
    }
    View Code

    快速幂:

    MARICLE inline LL qsm(LL x,int y) {
        LL ans=1;
        while (y) {
            if (y&1) ans=ans*x%mo;
            x=x*x%mo;
            y>>=1;
        }
        return ans;
    }
    View Code

    数论函数:

    #include<bits/stdc++.h>
    #define N 1000000
    bool mark[N+5];
    int prime[N+5];
    int num;
    long long sum[N+5];
    int euler[N+5];
    inline int Min(int a,int b){return a<b?a:b;}
    void Euler()
    {
        int i,j;
        num = 0;
        memset(euler,0,sizeof(euler));
        memset(prime,0,sizeof(prime));
        memset(mark,0,sizeof(mark));
        euler[1] = 1; // multiply function
        sum[1]=1;
        for(i=2;i<=N;i++)
        {
            if(!mark[i])
            {    
                prime[num++] = i;
                euler[i] = -1;
            }
            for(j=0;j<num;j++)
            {
                if(i*prime[j]>N){break;}
                mark[i*prime[j]] = 1;
                if(i%prime[j]==0)
                {
                    euler[i*prime[j]] = 0;
                    break;
                }
                else
                {
                    euler[i*prime[j]] = -euler[i];
                }
            } sum[i]=sum[i-1]+euler[i];
        }
    }
     
    int main()
    {
        int i;
        int M1,M2;
        Euler(); int t;
        scanf("%d",&t);
       while (t--){
        scanf("%d%d",&M1,&M2);
        long long ans = 0;
        int min = Min(M1,M2);
        /*for(i=1;i<=min;i++)
        {
            sum += euler[i]*(M1/i)*(M2/i);
        }*/
        for (int i=1,last;i<=min;i=last+1){
            last=Min(M1/(M1/i),M2/(M2/i));
            ans+=(sum[last]-sum[i-1])*(M1/i)*(M2/i);
            }
        printf("%lld
    ",ans);
            }
    }
    View Code

    点分治:

    #include<bits/stdc++.h>
    #define N 1000000
    bool mark[N+5];
    int prime[N+5];
    int num;
    long long sum[N+5];
    int euler[N+5];
    inline int Min(int a,int b){return a<b?a:b;}
    void Euler()
    {
        int i,j;
        num = 0;
        memset(euler,0,sizeof(euler));
        memset(prime,0,sizeof(prime));
        memset(mark,0,sizeof(mark));
        euler[1] = 1; // multiply function
        sum[1]=1;
        for(i=2;i<=N;i++)
        {
            if(!mark[i])
            {    
                prime[num++] = i;
                euler[i] = -1;
            }
            for(j=0;j<num;j++)
            {
                if(i*prime[j]>N){break;}
                mark[i*prime[j]] = 1;
                if(i%prime[j]==0)
                {
                    euler[i*prime[j]] = 0;
                    break;
                }
                else
                {
                    euler[i*prime[j]] = -euler[i];
                }
            } sum[i]=sum[i-1]+euler[i];
        }
    }
     
    int main()
    {
        int i;
        int M1,M2;
        Euler(); int t;
        scanf("%d",&t);
       while (t--){
        scanf("%d%d",&M1,&M2);
        long long ans = 0;
        int min = Min(M1,M2);
        /*for(i=1;i<=min;i++)
        {
            sum += euler[i]*(M1/i)*(M2/i);
        }*/
        for (int i=1,last;i<=min;i=last+1){
            last=Min(M1/(M1/i),M2/(M2/i));
            ans+=(sum[last]-sum[i-1])*(M1/i)*(M2/i);
            }
        printf("%lld
    ",ans);
            }
    }
    View Code

    可持久化Treap:

    #pragma optimize("-O2")
    #include<bits/stdc++.h>
    #define sight(c) ('0'<=c&&c<='9')
    #define rr NULL
    #define Ma 2147483647
    #define N 500007
    #define getchar nc
    inline char nc(){
    static char buf[1000000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
    }
    inline void read(int &x){
        static char c;static int b;
        for (b=1,c=getchar();!sight(c);c=getchar()) if (c=='-') b=-1;
        for (x=0;sight(c);c=getchar()) x=x*10+c-48;
        x*=b;
    }
    void write(int x){if (x<10) {putchar('0'+x); return;} write(x/10); putchar('0'+x%10);}
    inline void writeln(int x){ if (x<0) putchar('-'),x*=-1; write(x); putchar('
    '); }
    using namespace std;
    inline int rod() {
        static int x=23333;
        return x^=x<<13,x^=x>>17,x^=x<<5;
    }
    struct T{
        T* s[2];int key,siz,val;
        T() {}
        T(int x){s[0]=s[1]=rr; key=x;siz=1;val=rod();}
        void rub() {
            siz=1;
            if (s[0]) siz+=s[0]->siz;
            if (s[1]) siz+=s[1]->siz;
        }
    };
    T  *ro[N],*X,*Y,*Z;
    void spilt(T* now,int k,T* &x,T* &y){
        if (!now) {x=y=rr; return;}
        int cmp=now->s[0]?now->s[0]->siz+1:1;
        if (k<cmp) y=now,spilt(y->s[0],k,x,y->s[0]);
        else x=now,spilt(x->s[1],k-cmp,x->s[1],y);
        now->rub();
    }
    void spilt2(T* now,int k,T* &x,T* &y){
        if (!now) {x=y=rr; return;}
        if (k<=now->key) y=now,spilt2(y->s[0],k,x,y->s[0]);
        else x=now,spilt2(x->s[1],k,x->s[1],y);
        now->rub();
    }
    T* merge(T* x,T* y) {
        if (!x) return y; if (!y) return x;
        if (x->val<y->val) {x->s[1]=merge(x->s[1],y);x->rub();return x;}
        y->s[0]=merge(x,y->s[0]);y->rub(); return y;
    }
    int pre(T* now,int x){
        if (!now) return -Ma;
        if (now->key>=x) return pre(now->s[0],x);
        return max(now->key,pre(now->s[1],x));
    }
    int net(T* now,int x){
        if (!now) return Ma;
        if (now->key<=x) return net(now->s[1],x);
        return min(now->key,net(now->s[0],x));
    }
    int m,n,v,op,x,tot;
    int main () {
    //    freopen("a.in","r",stdin);
    //    freopen("rr.out","w",stdout);
        read(m);
        while (m--) {
            read(v); read(op); read(x);
            switch (op) {
                case 1: spilt2(ro[v],x,X,Y); 
                  ro[++tot]=merge(merge(X,new T(x)),Y); break;
                case 2: spilt2(ro[v],x,X,Y);
                  spilt(Y,1,Y,Z); if (Y&&Y->key^x) Z=merge(Y,Z);
                  ro[++tot]=merge(X,Z); break;
                case 3: spilt2(ro[v],x,X,Y); 
                  writeln((X?X->siz:0)+1); 
                  ro[v]=merge(X,Y); ro[++tot]=ro[v];break;
                case 4: 
                spilt(ro[v],x,X,Y); 
                spilt(X,x-1,X,Z);
                  writeln(Z->key); X=merge(X,Z); ro[v]=merge(X,Y);ro[++tot]=ro[v]; break;
                case 5: writeln(pre(ro[v],x));ro[++tot]=ro[v]; break;
                case 6: writeln(net(ro[v],x));ro[++tot]=ro[v]; break;    
            }
        } return 0;
    }
    View Code

    斜率优化:

    #include<bits/stdc++.h>
    #define B(x) (1ll*a*sum[x]*sum[x]+dp[x]-b*sum[x])//就是题解里的C(j),直线的截距,y=kx+b中的b
    #define K(x) (-2ll*a*sum[x])//直线的斜率
    #define N 1070001
    #define LL long long
    #define sight(C) (C<='9'&&C>='0')
    using namespace std;
    LL sum[N],q[N],n,m,x,head,tail,dp[N],a,b,c;
    LL check(int x,int y) {//判断当前直线与i组合的DP值
        return dp[y]+a*(sum[x]-sum[y])*(sum[x]-sum[y])+b*(sum[x]-sum[y])+c;
    } char C;int B;
    double jiao(int x,int y){ //求直线的交点
        return 1.0*(B(x)-B(y))/(K(x)-K(y));
    } 
    LL read(LL &x) {
        C=getchar(); B=1;
        for(;!sight(C);C=getchar()) if (C=='-') B=-1;
        for(x=0;sight(C);C=getchar()) x=x*10+C-'0';
        x*=B;
    }
    int main () {
         read(n); 
         read(a); read(b); read(c);
            for (int i=1;i<=n;i++) 
             read(x),sum[i]=sum[i-1]+x;
            head=tail=0;
            q[tail++]=0;
            for (int i=1;i<=n;i++) {
                while (head+1<tail && check(i,q[head])<=check(i,q[head+1])) head++;//当前解被超过,将其出队
                dp[i]=check(i,q[head]);
                while (head+1<tail && jiao(q[tail-2],i)<=jiao(q[tail-1],i)) tail--;//i与q【tail-1】相比,i的交点在前,所以将q【tail-1】删除
                q[tail++]=i;
            } 
        printf("%lld
    ",dp[n]);
        return 0;
    }
    View Code

    分块:

    #pragma GCC optimize("-O3")
    #include<bits/stdc++.h>
    #define sight(c) ('0'<=c&&c<='9')
    #define SIZ 254
    #define OTK 407
    #define Re register
    #define N 100607
    #define fp puts
    #define l(x) (x*SIZ-SIZ+1)
    #define r(x) (x*SIZ)
    inline void read(int &x){
        static char c;
        for (c=getchar();!sight(c);c=getchar());
        for (x=0;sight(c);c=getchar())x=x*10+c-48;
    }
    void write(int x){if (x<10) {putchar('0'+x); return;} write(x/10); putchar('0'+x%10);}
    inline void writeln(int x){ if (x<0) putchar('-'),x*=-1; write(x); putchar('
    '); }
    using namespace std;
    struct RR{int num,root;}V[OTK][N];
    int pre[N],pos[N],a[N],ma[N],n,m,be[N],op,l,r,v,p,q,ans,lz[N];
    inline int fa(int x){
        while (x^pre[x]) x=pre[x]=pre[pre[x]];  return x;
    }
    inline void push(int x) {
        for (Re int i=l(x);i<=r(x);i++) 
         a[i]=pos[fa(i)],V[x][a[i]].root=V[x][a[i]].num=0,a[i]-=lz[x];
        for (int i=l(x);i<=r(x);i++) pre[i]=0; lz[x]=0;
    }
    inline void reb(int x){
        ma[x]=0;
        for (Re int i=l(x);i<=r(x);i++) {
            if (a[i]>ma[x]) ma[x]=a[i];
            V[x][a[i]].root?pre[i]=V[x][a[i]].root:
            (pos[i]=a[i],V[x][a[i]].root=i,pre[i]=i);
            V[x][a[i]].num++;
        }
    }
    RR *A,*B;
    void play(int x,int a,int b){
        A=&V[x][a]; B=&V[x][b];
        B->root?pre[A->root]=B->root:(B->root=A->root,pos[A->root]=b);
        B->num+=A->num,A->num=A->root=0;
    }
    inline void det(int x,int v){
        int &p=lz[x] ,&q=ma[x];
        if ((v<<1)<=q-p) {
            for (Re int i=p+1;i<=p+v;i++)
             if (V[x][i].root) play(x,i,i+v);
            p+=v;
        } else {
            for (Re int i=q;i>p+v;i--)
              if (V[x][i].root) play(x,i,i-v);
            q=min(q,p+v);
        }
    }
    int main () {
        read(n); read(m);
        for (Re int i=1;i<=n;i++) 
         read(a[i]),be[i]=(i-1)/SIZ+1;
        for (Re int i=1;i<=be[n];i++) reb(i);
        while (m--) {
            read(op); read(l); read(r); read(v);
            switch (op) {
                case 1: p=be[l]; q=be[r];
                  if (p^q) {
                        push(p); push(q);
                        for (Re int i=l;i<=r(p);i++) if (a[i]>v) a[i]-=v;
                        for (Re int i=l(q);i<=r;i++) if (a[i]>v) a[i]-=v;
                        for (Re int i=p+1;i<q;i++) 
                         det(i,v);
                        reb(p); reb(q);
                  } else {
                       push(p);
                       for (Re int i=l;i<=r;i++) if (a[i]>v) a[i]-=v;
                       reb(p);
                  }
                break;
                case 2: p=be[l]; q=be[r]; ans=0;
                  if (p^q) {
                      for (Re int i=l;i<=r(p);i++) if (pos[fa(i)]-lz[p]==v) ans++;
                      for (Re int i=l(q);i<=r;i++) if (pos[fa(i)]-lz[q]==v) ans++;
                      for (Re int i=p+1;i<q;i++)
                        if (v+lz[i]<N) ans+=V[i][v+lz[i]].num; 
                    }else 
                     for (Re int i=l;i<=r;i++) if (pos[fa(i)]-lz[p]==v) ans++;
                   writeln(ans);
                break;
            }
        }
    }
    View Code

    SG函数:

    #include<bits/stdc++.h>
    #define gc getchar
    #define sight(c) ('0'<=c&&c<='9')
    using namespace std;
    int x,y,n,ans,T;
    inline void read(int &x){
        static char c;
        for(c=gc();!sight(c);c=gc());
        for(x=0;sight(c);c=gc()) x=x*10+c-48;
    }
    int sg(int x,int y){  
       long long tmp=2;
       for(int i=0;;i++,tmp*=2)
        if( (x-1)%tmp<tmp/2 && (y-1)%tmp < tmp/2 ) return i;
    }
    int main () {
        read(T); 
        while (T--) { ans=0;
         read(n); n>>=1;
         for (int i=1;i<=n;i++)  read(x),read(y),ans^=sg(x,y);
           printf("%s
    ",ans?"YES":"NO"); }
        return 0;
    }
    View Code

    杜教筛:

    #include<bits/stdc++.h>
    #define LL long long
    #define N 4000007
    using namespace std;
    map<LL,int> ma;
    LL a,n;
    int LS,fis[N],pim[N>>3],tot,fi[N],u[N];
    bool p[N];
    LL F(LL x){
        if (x<LS) return fis[x];
        if (ma.count(x)) return ma[x];
        LL ans=1;
        for (LL i=2,last;i<=x;i=last+1) {
            last=x/(x/i); ans=ans-(last-i+1)*F(x/i);
        } ma[x]=ans; return ans;
    }
    void LST(int LS){
        fis[1]=1;
        for (int i=2;i<LS;i++) {
            if (!p[i]) u[i]=-1,pim[++tot]=i;
            for (int j=1;j<=tot&&i*pim[j]<LS;j++) {
                p[i*pim[j]]=1; if (i%pim[j]) u[i*pim[j]]=-u[i]; else{ u[i*pim[j]]=0; break;}
            }
            fis[i]=(fis[i-1]+u[i]);
        }
    }
    void init() {
        LS=min((int)pow(n,0.6667),N-47);
        LST(LS);
    }
    int main () {
        scanf("%lld %lld",&a,&n);
        init();
        printf("%lld",F(n)-F(a-1));
    }
    View Code

    离散对数:

    #include<bits/stdc++.h>
    #define N 100007
    #define LL long long
    int p[N];
    int l[N>>2],pm[N>>4],tog,tot,mo,x;
    using namespace std;
    LL qsm(LL x,LL y) {
        static LL anw;
        for(anw=1;y;y>>=1,x=x*x%mo) if(y&1) anw=anw*x%mo;
        return anw;
    }
    void getp(int x){
        for (int i=2;i<N;i++) {
            if (!p[i]) l[++tog]=i;
            for (int j=1;j<=tog&&i*l[j]<N;j++) {
                p[i*l[j]]=l[j];
                if (i%l[j]==0) break;
            }
        }
        x=x-1;
        for (int i=1;i<=tog&&l[i]*l[i]<x;i++) 
            if (x%l[i]==0) {
                pm[++tot]=l[i];
                while (x%pm[tot]==0) x/=pm[tot];
            }
        if (x!=1) pm[++tot]=x;
    }
    bool check(int x){
        for (int i=1;i<=tot;i++)
         if (qsm(x,(mo-1)/pm[i])==1) return 0;
        return 1;
    }
    int PP(int x){
        for (int i=1;i<=x;i++)
         if (check(i)) return i;
    }
    int main () {
    //    freopen("a.in","r",stdin);
        scanf("%d",&x);
        getp(x); mo=x;
        printf("%d
    ",PP(x));
    }
    View Code

    生成树计数:

    #include<bits/stdc++.h>
    #define gc getchar
    #define sight(c) ('0'<=c&&c<='9')
    //#define getchar nc
    #define double long double
    #define bug 1000007
    #define SIZ 107
    #define fabs(x) ((x)>0?(x):(-x))
    #define zero(x) (fabs(x)>1e-9?0:1)
    using namespace std;
    int n;
    int f[SIZ][SIZ];
    double b[SIZ][SIZ];
    inline char nc () {
        static char buf[bug],*p1=buf,*p2=buf;
        return p1==p2&&(p2=(p1=buf)+fread(buf,1,bug,stdin),p1==p2)?EOF:*p1++;
    }
    inline void read(int &x){
        static char c;static int b;
        for(c=gc(),b=1;!sight(c);c=gc()) c=='-'?b=-1:b;
        for(x=0;sight(c);x=x*10+c-48,c=gc()); x*=b;
    }
    double det() {
        double ret = 1;int sign=0;
        for (int i=0;i<n;i++) for (int j=0;j<n;j++) b[i][j]=f[i][j];
        for (int i=0,j,k;i<n;i++) {  
            if (zero(b[i][i])) {  
                for (j=i+1;j<n;j++)   if (!zero(b[j][i]))  break;  
                if (j == n)   return 0;  
                for (k=i;k<n;k++)  swap(b[i][k],b[j][k]);
                sign++;  
            }  
            ret*= b[i][i];  
            for (k = i + 1; k < n; k++)  
                b[i][k] /= b[i][i];  
            for (j = i + 1; j < n; j++)  
                for (k = i + 1; k < n; k++)  
                    b[j][k] -= b[j][i] * b[i][k];  
        }  
        if (sign & 1)  
            ret = -ret;  
        return ret;  
    }
    int main () {
    //    freopen("a.in","r",stdin);
        read(n);
        for (int i=0;i<n;i++) {
            f[i][i]=3; f[i][(i+1)%n]--; f[i][(i+n-1)%n]--;
        }
        printf("%.0Lf
    ",det());
        return 0;
    }
    View Code

    多阶差分:

    #include<bits/stdc++.h>
    #define sight(c) ('0'<=c&&c<='9')
    #define LL long long
    inline void read(int &x) {
        static char c;
        for (;!sight(c);c=getchar());
        for (x=0;sight(c);c=getchar())x=x*10+c-48;
    }
    inline void read(long long &x) {
        static char c;static int b;
        for (b=1;!sight(c);c=getchar())if (c=='-') b=-1;
        for (x=0;sight(c);c=getchar())x=x*10+c-48;
        x*=b;
    }
    #define N 501007
    #define min(a,b) (a)<(b)?(a):(b)
    #define HP a
    LL len,ans2,ans,Ans,cm,n,dle,a[N],k,r,c1[N],c2[N],c3[N],c4[N],hp[N];
    bool check(LL P)
    {
        int sss=sqrt(P); int tot=0;
        LL t1=0,t2=0,t3=0,t0=0;
        memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2));
        memset(c3,0,sizeof(c3)); memset(c4,0,sizeof(c4));
        for(int i=1;i<=n;++i)hp[n-i+1]=HP[i]+1;//记得+1,因为怪物0血还没有死
        for(int i=1;i<=n;++i)
        {
            t3+=c3[i]; t2+=c2[i];
            t1+=c1[i]+t2; t0+=t1+c4[i];
            hp[i]-=1ll*P*t3-t0;
            if(hp[i]<=0)continue; int gg=((hp[i]+P-1)/P);
            tot+=gg; if(tot>k)return false;
            c3[i+1]+=gg;c3[min(n+1,i+sss+1)]-=gg;
            c2[i+1]+=1ll*2*gg;c2[min(n+1,i+sss+1)]-=2*gg;
            c1[i+1]-=gg;c1[min(n+1,i+sss+1)]-=1ll*(1ll*2*sss-1)*gg;
            c4[min(n+1,i+sss+1)]-=1ll*sss*sss*gg;
        }
        return tot<=k;
    }
    int main () {
        read(n); read(k);
        for (int i=1;i<=n;i++) read(a[i]);
        r=1ll<<53;
        while (r) {
            if (!check(ans+r)) ans+=r;
            r>>=1;
        } 
        printf("%lld
    ",ans+1); return 0;
    }
    View Code

    哈希:

    struct Ha{
        #define HaN 1000007
        #define HaM 1000007
        int head[HaN],net[HaM],fall[HaM],tag[HaN],tot,tim,
        c[HaM],g[HaM];
        ull h[HaM];
        void _new() {++tim; tot=0;}
        int push(int x) {
            return (tag[x]^tim)?(tag[x]=tim,head[x]=0):head[x];
        }
        int &get(ull _h,int _c) {
            static int hs;
            hs=(_h*233+_c)%HaN;
            for (int i=push(hs);i;i=net[i]) 
             if (h[i]==_h&&c[i]==_c) return g[i];
            h[++tot]=_h,c[tot]=_c; g[tot]=0; net[tot]=head[hs]; head[hs]=tot;
            return g[tot];
        }
    }f[2];
    View Code

    NTT:

    void Pre() {
        for (int i=1;i<N;i++) l[i]=qsm(3,(mo-1)/i/2),n[i]=qsm(l[i]);
    }
    LL wn,w,Xx,Yy;
    inline void NTT(vector<LL> &X,int x,int m){static LL gg;
         m=1<<m;gg=qsm(m);
        for (int i=0;i<m;i++) if (i<D[i]) swap(X[i],X[D[i]]);
        for (int i=1;i<m;i<<=1) {
            wn=x?l[i]:n[i]; w=1; 
            for (int j=0;j<m;j+=i<<1,w=1) 
             for (int k=j;k<j+i;k++,w=w*wn%mo) {
                 Xx=X[k]; Yy=X[k+i]*w%mo;
                 X[k]=(Xx+Yy)%mo; X[k+i]=(Xx-Yy+mo)%mo;
             }    
        }
        if (!x) for (int i=0;i<m;i++) X[i]=X[i]*gg%mo;
    } 
    struct Poly{
        vector<LL> poly;
        int len;
        Poly() {len=0; poly.clear(); poly.pb(1);}
        void clear(){len=0; poly.clear(); poly.pb(1);}
        void mul(Poly &A,Poly &B){
            static int m;
            len=B.len+A.len;
            for (m=0;1<<m<=len;m++);
            poly.resize(1<<m); 
            A.poly.resize(1<<m);  B.poly.resize(1<<m);
            for (int i=1;i<(1<<m);i++) D[i]=D[i>>1]>>1|((i&1)<<m-1);
             NTT(A.poly,1,m); NTT(B.poly,1,m); 
            for (int i=0;i<(1<<m);i++) poly[i]=A.poly[i]*B.poly[i]%mo;
            NTT(poly,0,m);
            A.clear(); B.clear();
        }
        void out() {
            for (int i=len;~i;i--) printf("%lld ",poly[i]);puts("");
        }
    }P[N],g[N],Pta,*f=g+1;
    View Code

    差不多就这些吧。

  • 相关阅读:
    114.114.114.114和8.8.8.8
    一台电脑双网卡同时上网
    eNSP模拟器
    路由器UPnP
    子网掩码
    网线水晶头制作
    AP (无线访问接入点(WirelessAccessPoint))
    筛选键
    注册表方法修改网络名称
    图片素材网址
  • 原文地址:https://www.cnblogs.com/rrsb/p/8323687.html
Copyright © 2011-2022 走看看