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

    此处用于存放本喵的模板,不定时更新。(不过可能会咕咕咕qwq)

    由于本喵很菜,没学到的算法这里自然也没有模板啦~

    输入输出优化

    inline int read(){
        int X=0,w=0;char ch=0;
        while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
        while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
        return w?-X:X;
    } 
    int输入
    inline double dbread()
    {
       double X=0,Y=1.0; int w=0; char ch=0;
       while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
       while(isdigit(ch)) X=X*10+(ch^48),ch=getchar();
       ch=getchar();//读入小数点
       while(isdigit(ch)) X+=(Y/=10)*(ch^48),ch=getchar();
       return w?-X:X;
    }
    double输入
    inline void write(int x)
    {
        if(x<0) putchar('-'),x=-x;
        if(x>9) write(x/10);
        putchar(x%10+'0');
    }
    int输出

    图论


    图的存储

    inline void add(int u,int v,int w){
        e[++cnt].to=v;e[cnt].w=w;e[cnt].nxt=head[u];head[u]=cnt;
    }
    链式前向星存图


    最小生成树

    #include<bits/stdc++.h>
    using namespace std;
    struct node{
        int u,v,w;
    }e[200001];
    int fa[5001],n,m,ans,cnt;
    bool cmp(node a,node b){
        return a.w<b.w;
    }
    int find(int x)
    {
        if(fa[x]==x) return x;
        return fa[x]=find(fa[x]);
    }
    int main()
    {
        scanf("%d%d",&n,&m); 
        for(int i=1;i<=n;i++) fa[i]=i;
        for(int i=1;i<=m;i++)
        {
            e[i].u=read(),e[i].v=read(),e[i].w=read();
        }
        sort(e+1,e+m+1,cmp);
        for(int i=1;i<=m;i++)
        {
            if(find(e[i].u)==find(e[i].v)) continue;
            ans+=e[i].w;
            fa[find(e[i].v)]=find(e[i].u);
            if(cnt==n-2)
            {
                cnt++;
                break;
            }
        }
        printf("%d",ans);
        return 0;
    }
    Kruskal

    最短路

    多源最短路

    for(int k=1;k<=n;k++)
          for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                  f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
    Floyd

    单源最短路

    void spfa(int s)
    {
        for(int i=1;i<=n;i++) dis[i]=inf;
        q.push(s);
        dis[s]=0;vis[s]=1;
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            vis[u]=0;
            for(int i=head[u];i;i=e[i].nxt)
            {
                int v=e[i].to;
                if(dis[v]>dis[u]+e[i].w)
                {
                    dis[v]=dis[u]+e[i].w;
                    if(!vis[v])
                    {
                        vis[v]=1;
                        q.push(v);
                    }
                }
            }
        }
    }
    SPFA
    priority_queue<pii,vector<pii>,greater<pii> >q;
    void dij(int s)
    {
        dis[s]=0;
        q.push(pii(0,s));
        while(!q.empty())
        {
            int u=q.top().se,f=q.top().fi;
            q.pop();
            if(f!=dis[u])continue;
            for(int i=head[u];i;i=e[i].nxt)
            {
                int v=e[i].to,w=e[i].w;
                if(dis[v]>dis[u]+w)
                {
                    dis[v]=dis[u]+w;
                    q.push(pii(dis[v],v));
                }
            }
        }
        return;
    }
    Dijkstra

    数论

    bool he[10000005]={0};
    void Eratosthenes(int n)
    {
        for(int i=2;i<=n;i++)
        {
            if(he[i])continue;
            for(int j=2;j*i<=n;j++)he[j*i]=1;
        }
    }
    埃氏筛
    #include<bits/stdc++.h>
    using namespace std;
    bool prime1[100000001];
    int prime[100000001],n,m,k;
    void work(int n)
    {
        memset(prime1,true,sizeof(prime1));
        prime[0]=0;
        for(int i=2;i<=n;i++)
        {
            if(prime1[i])prime[++prime[0]]=i;
            for(int j=1;j<=prime[0] && i*prime[j]<=n;j++)
            {
                prime1[i*prime[j]]=false;
                if(i%prime[j]==0) break;
            }
        }
    }
    int main()
    {
        cin>>n>>m;
        work(n);
        for(int i=1;i<=m;i++)
        {
            scanf("%d",&k);
            printf("%d
    ",prime[k]);
        }
        return 0; 
    }
    线性筛
    欧拉函数
    归并排序
    线性求逆元
    exgcd
    #include<bits/stdc++.h> 
    #define ll long long
    #define G() cr=getchar()
    using namespace std;
    ll M,x,y,n;
    ll ans,a[110000],b[110000];
    ll xr;char cr;
    inline ll read()
    {
        xr=0;G();
        while(cr<'0'||cr>'9')G();
        while(cr>='0'&&cr<='9')xr=(xr<<1)+(xr<<3)+cr-48,G();
        return xr;
    }
    ll mul(ll a,ll b,ll c){
        ll res=0;
        while(b>0)
        {
            if(b&1)    res=((res+a))%c;
            a=(a+a)%c;
            b>>=1;
        }
        return (res%c+c)%c;
    }
    ll exgcd(ll p,ll q,ll &x,ll &y)
    {
        if(!q)
        {
            x=1;
            y=0;
            return p;
        }
        ll g=exgcd(q,p%q,y,x);
        y-=(p/q)*x;
        return g;
    }
    ll excrt()
    {
        M=b[1];
        ans=a[1];
        for(ll i=2;i<=n;i++)
        {
            ll c=((a[i]-ans)%b[i]+b[i])%b[i];
            ll g=exgcd(M,b[i],x,y);
            ll p=b[i]/g;
            x=mul(x,c/g,p);
            ans+=x*M;
            M*=p;
            ans=(ans%M+M)%M;
        }
        return ans;
    }
    int main()
    {
        n=read();
        for(ll i=1;i<=n;i++)
        {
            b[i]=read();a[i]=read();
        }
        printf("%lld",excrt());
        return 0;
    }
    excrt

    快速幂

    long long qpow(long long k,long long n,long long p)
    {
        if(n==0) return 1%p;
        long long ans=1;
        while(n)
        {
            if(n&1==1) ans=ans*k%p;
            k*=k;k%=p;n>>=1;
        }
        return ans;
    }
    快速幂(非递归版)

    数据结构

    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    int f[1000001][21],m,n;
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++) scanf("%d",&f[i][0]);
        for(int j=1;j<=21;j++)
        {
            for(int i=1;i+(1<<j)-1<=n;i++)
            {
                f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
            }
        }
        for(int i=1;i<=m;i++)
        {
            int l,r;
            scanf("%d%d",&l,&r);
            int k=log2(r-l+1); 
            printf("%d
    ",max(f[l][k],f[r-(1<<k)+1][k]));
        }
        return 0;
    }
    ST表
    #include<bits/stdc++.h>//包含区间和查询及单点加 
    using namespace std;
    int m,n;
    int tr[500001];
    int lowbit(int x) {return x & -x;}
    void add(int p,int k)
    {
        while(p <= n)
        {
            tr[p] += k;
            p += lowbit(p);
        }
    }
    int query(int x)
    {
        int ans = 0;
        while(x)
        {
            ans += tr[x];
            x -= lowbit(x);
        }
        return ans;
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i = 1;i <= n;i ++)
        {
            int a;
            scanf("%d",&a);
            add(i,a);
        }
        for(int i = 1;i <= m;i ++)
        {
            int a,x,y;
            scanf("%d",&a);
            scanf("%d%d",&x,&y);
            if(a == 1) add(x,y);
            if(a == 2) cout<<query(y)-query(x-1)<<endl;
        }
        return 0;
    }
    树状数组1
    #include<bits/stdc++.h>//区间加,区间乘,区间和查询 
    using namespace std;
    long long tr[400001];
    long long n,a[100001],lz1[400001],lz2[400001],m,p1;
    
    void build(long long p,long long l,long long r){
        lz1[p]=1;
        if(l==r)
        {
            tr[p]=a[l];
            return;
        }
        long long mid=(l+r)/2;
        build(p*2,l,mid);
        build(p*2+1,mid+1,r);
        tr[p]=tr[p*2]+tr[p*2+1];
    }
    
    void push_down(int p,int l,int r){
        long long mid=(l+r)/2;
        if(lz1[p]!=1)
        {
            (lz1[p*2]*=lz1[p]%p1)%=p1;
            (lz1[p*2+1]*=lz1[p]%p1)%=p1;
            (lz2[p*2]*=lz1[p])%=p1;
            (lz2[p*2+1]*=lz1[p])%=p1;
            (tr[p*2]*=(lz1[p])%p1)%=p1;
            (tr[p*2+1]*=(lz1[p])%p1)%=p1;
            lz1[p]=1;
        }
        if(lz2[p]>0)
        {
            (lz2[p*2]+=lz2[p]%p1)%=p1;
            (lz2[p*2+1]+=lz2[p]%p1)%=p1;
            (tr[p*2]+=(lz2[p]*(mid-l+1))%p1)%=p1;
            (tr[p*2+1]+=(lz2[p]*(r-(mid+1)+1))%p1)%=p1;
            lz2[p]=0;
        }
    }
    
    void modify1(long long p,long long l,long long r,long long ml,long long mr,long long x){
        if(l==ml&&r==mr)
        {
            (tr[p]*=x%p1)%=p1;
            (lz1[p]*=x%p1)%=p1;
            (lz2[p]*=x%p1)%=p1;
            return;
        }
        long long mid=(l+r)/2;
        push_down(p,l,r);
        if(mr<=mid) modify1(p*2,l,mid,ml,mr,x);
        else if(ml>=mid+1) modify1(p*2+1,mid+1,r,ml,mr,x);
        else
        {
            modify1(p*2,l,mid,ml,mid,x);
            modify1(p*2+1,mid+1,r,mid+1,mr,x);
        }
        tr[p]=(tr[p*2]+tr[p*2+1])%p1;
    }
    
    void modify2(long long p,long long l,long long r,long long ml,long long mr,long long x){
        if(l==ml&&r==mr)
        {
            tr[p]+=(x*(r-l+1))%p1;
            lz2[p]+=x;
            return;
        }
        long long mid=(l+r)/2;
        push_down(p,l,r);
        if(mr<=mid) modify2(p*2,l,mid,ml,mr,x);
        else if(ml>=mid+1) modify2(p*2+1,mid+1,r,ml,mr,x);
        else
        {
            modify2(p*2,l,mid,ml,mid,x);
            modify2(p*2+1,mid+1,r,mid+1,mr,x);
        }
        tr[p]=(tr[p*2]+tr[p*2+1])%p1;
    }
    
    long long query(long long p,long long l,long long r,long long ql,long long qr){
        if(l==ql&&qr==r) return tr[p];
        long long mid=(l+r)/2;
        push_down(p,l,r);
        if(qr<=mid){
            return query(p*2,l,mid,ql,qr);
        }
        if(ql>=mid+1){
            return query(p*2+1,mid+1,r,ql,qr);
        }
        else return (query(p*2,l,mid,ql,mid)+query(p*2+1,mid+1,r,mid+1,qr))%p1;
    }
    
    int main(){
        cin>>n>>m>>p1;
        for(long long i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        build(1,1,n);
        for(long long i=1,u,x,ql,qr;i<=m;i++)
        {
            cin>>u;
            if(u==1) cin>>ql>>qr>>x,modify1(1,1,n,ql,qr,x);
            else if(u==2) cin>>ql>>qr>>x,modify2(1,1,n,ql,qr,x);
            else cin>>ql>>qr,cout<<(query(1,1,n,ql,qr))%p1<<endl;
        }
        return 0;
    }
    线段树2

     字符串

    #include<bits/stdc++.h>
    using namespace std;
    char a[1000005],b[1000005];
    int nxt[1000005],n,m,j;
    int main()
    {
        scanf("%s%s",a+1,b+1);
        n=strlen(a+1),m=strlen(b+1);
        for(int i=2;i<=m;i++)
        {
            while(j&&b[j+1]!=b[i]) j=nxt[j];
            if(b[j+1]==b[i]) j++;
            nxt[i]=j;
        }
        j=0;
        for(int i=1;i<=n;i++)
        {
            while(j&&b[j+1]!=a[i]) j=nxt[j];
            if(b[j+1]==a[i]) j++;
            if(j==m) cout<<i-m+1<<endl;
        }
        for(int i=1;i<=m;i++)
        {
            cout<<nxt[i]<<" ";
        }
        return 0;
    }
                
    KMP
    #include<bits/stdc++.h>
    #define G() cr=getchar()
    using namespace std;
    char s[25000005];
    char cr;
    int n,cnt=1;
    int p[25000005];
    inline void read()
    {
        G();
        while(cr<'a'||cr>'z') G();
        while(cr>='a'&&cr<='z') s[++cnt]=cr,s[++cnt]='#',G();
    }
    int r,c,maxn;
    int main()
    {
        s[0]='~',s[1]='#';
        read();
        for(int i=1;i<=cnt;i++)
        {
            if(i<=r) p[i]=min(p[2*c-i],r-i+1);
            while(s[i-p[i]]==s[i+p[i]]) p[i]++;
            if(i+p[i]>r) r=p[i]+i-1,c=i;
            maxn=max(maxn,p[i]);
        }
        cout<<maxn-1<<endl;
        return 0;
    }
    manacher

    先存一下,还没弄完qwq

    发现什么问题记得告诉窝一下,窝会尽快修复qwq

  • 相关阅读:
    设计和实现OLAP解决方案
    数据库的数据挖掘概述
    SharePoint 2007中的搜索服务 Virus
    分离SharePoint的应用服务器的过程中遇到的问题 Virus
    自定义对象的比较系列二之实现IComparable Virus
    软件行业和传统行业的比较 Virus
    Sharepoint中用treeview来显示组织机构的人员状态的webpart Virus
    自定义对象的比较系列一之实现IComparable Virus
    无法保存webpart的属性设置,发生意外,异常来自 HRESULT:0x80020009(DISP_E_EXCEPTION) Virus
    SPD开发工作流需要注意的地方3[SPD工作流访问隐藏栏] Virus
  • 原文地址:https://www.cnblogs.com/ying-xue/p/mu-ban.html
Copyright © 2011-2022 走看看