模板2

来源:互联网 发布:詹姆斯2017总决赛数据 编辑:程序博客网 时间:2024/05/16 03:34
#include<cstdio>#include<cmath>#include<ctime>#include<cstring>#include<queue>#include<set> #include<algorithm>using namespace std;int x,y,a,b;int gcd(int &x,int &y,int a,int b){    if(!b){        x=1,y=0;        return a;    }    int ret=gcd(x,y,b,a%b);    int tmp=x;    x=y;    y=tmp-a/b*y;    return ret;}int main(){    scanf("%d%d",&a,&b);    gcd(x,y,a,b);    printf("%d",(x%b+b)%b);}
#include<cstdio>#include<cmath>#include<ctime>#include<cstring>#include<queue>#include<set> #include<algorithm>using namespace std;multiset<int> q,p; int n,m;int main(){    scanf("%d",&n);    while(n--){        int opt,x,j;        scanf("%d%d",&opt,&x);        multiset<int>::iterator it;        if(opt==1) q.insert(x),p.insert(-x);        if(opt==2) q.erase(x),p.erase(-x);        if(opt==3) {             j=1;it=q.begin();            for(;it!=q.find(x);it++,j++) ;printf("%d\n",j);        }        if(opt==4) for(it=q.begin(),j=1;it!=q.end()&&j<=x;it++,j++) if(j==x) printf("%d\n",*it);        if(opt==5) printf("%d\n",-*upper_bound(p.begin(),p.end(),-x));        if(opt==6) printf("%d\n",*upper_bound(q.begin(),q.end(),x));    } }
#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<queue>using namespace std;int n,m;int s;int vis[510000],x,y,head[510000],nex[1110000],to[1110000],tot;int net[1110000],h[510000],t[1100000],tot2,f[510000],lca[1100000];void add(int x,int y){ //邻接链表     nex[++tot]=head[x];    to[tot]=y;    head[x]=tot;}void add2(int x,int y){ //邻接链表     net[++tot2]=h[x];    t[tot2]=y;    h[x]=tot2;}int read(){    char ret;int ans=0;ret=getchar();    while(ret>'9'||ret<'0') ret=getchar();    while(ret<='9'&&ret>='0') ans=(ans<<1)+(ans<<3)+ret-'0',ret=getchar();    return ans;}int find(int x){    return f[x]=f[x]==x?x:find(f[x]);}void dfs(int x){    vis[x]=1;f[x]=x;    for(int i=head[x];i;i=nex[i]){        int tmp=to[i];        if(vis[tmp]) continue;        dfs(tmp);        f[tmp]=x;    }    for(int i=h[x];i;i=net[i]){        int tmp=t[i];        if(vis[tmp]){            lca[i]=find(tmp);            if(i&1) lca[i+1]=lca[i];            else lca[i-1]=lca[i];        }    }}int main(){    scanf("%d%d%d",&n,&m,&s);    for(int i=1;i<n;i++) scanf("%d%d",&x,&y),add(x,y),add(y,x);    for(int i=1;i<=m;i++) scanf("%d%d",&x,&y),add2(x,y),add2(y,x);    dfs(s);    for(int i=1;i<=m;i++) printf("%d\n",lca[i*2]);}
#include<cstdio>#include<cmath>#include<ctime>#include<cstring>#include<queue>#include<algorithm>using namespace std;int vis[510000],x,y,head[510000],nex[1110000],to[1110000],dep[510000],tot;void add(int x,int y){ //邻接链表     nex[++tot]=head[x];    to[tot]=y;    head[x]=tot;}int st[510000][23],n,q,s;int read(){    char ret;int ans=0;ret=getchar();    while(ret>'9'||ret<'0') ret=getchar();    while(ret<='9'&&ret>='0') ans=(ans<<1)+(ans<<3)+ret-'0',ret=getchar();    return ans;}void dfs(int x){    vis[x]=1;    for(int i=head[x];i;i=nex[i]){        int tmp=to[i];        if(vis[tmp]) continue;        dep[tmp]=dep[x]+1;st[tmp][0]=x;        dfs(tmp);    }}int lca(int x,int y){    if(x==y) return x;    if(dep[x]<dep[y]) swap(x,y);    for(int i=20;i>=0;i--){        if(st[x][i]&&dep[st[x][i]]>=dep[y])        x=st[x][i];    }    if(x==y) return x;    for(int i=20;i>=0;i--){        if(st[x][i]&&st[y][i]&&st[x][i]!=st[y][i])        x=st[x][i],y=st[y][i];    }    return st[x][0];}int main(){    n=read(),q=read(),s=read();    for(int i=1;i<n;i++) x=read(),y=read(),add(x,y),add(y,x);    dfs(s);    for(int i=1;(1<<i)<=n;i++)    for(int j=1;j<=n;j++)    if(st[j][i-1]&&st[st[j][i-1]][i-1])    st[j][i]=st[st[j][i-1]][i-1];    while(q--){        x=read(),y=read();        printf("%d\n",lca(x,y));    }}
#include<iostream>#include<cstdio>#include<cstring>#define LL long long using namespace std;const int N=200007;inline int read(){    int x=0,p=1;char ch=getchar();    while(ch<'0'||ch>'9') {if(ch=='-') p=-1;ch=getchar();}    while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();    return x*p;}int Q,n,m;int head[N],nxt[2*N],to[2*N],cos[2*N],tot;int dis[N];bool vis[N];void add(int x,int y,int z){    to[++tot]=y;    nxt[tot]=head[x];    head[x]=tot;    cos[tot]=z;}bool DFS_spfa(int x){    vis[x]=1;    for(int i=head[x];i;i=nxt[i])    {        int tmp=to[i];        if(dis[tmp]>dis[x]+cos[i])        {            if(vis[tmp])             return 1;            dis[tmp]=dis[x]+cos[i];            int w=DFS_spfa(tmp);            if(w==1) return 1;        }     }    vis[x]=0;    return 0;}int main(){    Q=read();    while(Q--)    {        memset(head,0,sizeof(head));        memset(vis,0,sizeof(vis));        memset(dis,0,sizeof(dis));        tot=0;int flag=0;        n=read(),m=read();        for(int i=1,x,y,z;i<=m;i++){            x=read(),y=read(),z=read();            add(x,y,z);            if(z>0)             add(y,x,z);        }        for(int i=1;i<=n;i++)            if(DFS_spfa(i)) {                printf("YE5\n");flag=1;break;            }         if(!flag)         printf("N0\n");    }    return 0;}
#include<cstdio>#include<iostream>#include<cstring>#include<cmath>#include<set>#include<map>#include<queue>#include<vector>#include<ctime>#include<cstdlib>#include<algorithm>using namespace std;const int M=1100000;int n,m,e,x,y,vis[M],ans,nex[M],to[M],head[M],tot,matc[M];void add(int x,int y){ //邻接链表     nex[++tot]=head[x];    to[tot]=y;    head[x]=tot;}int match(int x){    for(int i=head[x];i;i=nex[i]){        int tmp=to[i];        if(!vis[tmp]){            vis[tmp]=1;            if(!matc[tmp]||match(matc[tmp])){            matc[x]=tmp;            matc[tmp]=x;            return 1;            }        }    }    return 0;}int main(){    scanf("%d%d%d",&n,&m,&e);    while(e--){        scanf("%d%d",&x,&y);        if(y>m) continue;        add(x,y+n);        add(y+n,x);    }    for(int i=1;i<=n;i++){        memset(vis,0,sizeof vis);        ans+=match(i);    }    printf("%d",ans); } 
#include<cstdio>#include<iostream>#include<cstring>#include<set>#include<map>#include<queue>#include<vector>#include<cstdlib>#include<algorithm>using namespace std;const int M=1100000;int n,m,opt,x[M],y[M],dfn[M],low[M],vis[M],cnt,ans,nex[M],to[M],head[M],tot,dp[M],strak[M],top,color_num,col[M],sum[M],v[M];void add(int x,int y){ //邻接链表     nex[++tot]=head[x];    to[tot]=y;    head[x]=tot;}void tarjan(int x){    dfn[x]=++cnt;    low[x]=cnt;    strak[++top]=x;    vis[x]=1;    for(int i=head[x];i;i=nex[i]){        int tmp=to[i];        if(!dfn[tmp]) tarjan(tmp),low[x]=min(low[x],low[tmp]);        else if(vis[tmp]) low[x]=min(low[x],dfn[tmp]);    }    if(dfn[x]==low[x]){        color_num++;        while(strak[top+1]!=x){            int tmp=strak[top--];            vis[tmp]=0;            col[tmp]=color_num;            sum[color_num]+=v[tmp];        }    }}void dfs(int x){    if(dp[x]) return ;    dp[x]=sum[x];int maxn=0;    for(int i=head[x],tmp;i;i=nex[i]){        if(!dp[to[i]])         dfs(to[i]);        maxn=max(dp[to[i]],maxn);    }    dp[x]+=maxn;}int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++) scanf("%d",&v[i]);    for(int i=1;i<=m;i++){        scanf("%d%d",&x[i],&y[i]);        add(x[i],y[i]);    }    for(int i=1;i<=n;i++)    if(!dfn[i]) tarjan(i);    memset(head,0,sizeof head);    memset(nex,0,sizeof nex);    memset(to,0,sizeof to);tot=0;    for(int i=1;i<=m;i++)    if(col[x[i]]!=col[y[i]]) add(col[x[i]],col[y[i]]);    memset(vis,0,sizeof vis);    for(int i=1;i<=color_num;i++)    if(!dp[i])    dfs(i),ans=max(dp[i],ans);    printf("%d",ans);}
#include<cstdio>#include<iostream>#include<cstring>#include<set>#include<map>#include<queue>#include<vector>#include<cstdlib>#include<algorithm>int n,m,p,t,jc[110000];using namespace std;int fastpow(int a,int k,int p){//快速幂     int ans=1;    while(k){        if(k&1) ans=1ll*ans*a%p;         a=1ll*a*a%p;        k>>=1;    }    return ans;}int c(int n,int m,int p){    if(n<m) return 0;    return 1ll*jc[n]*fastpow(jc[m],p-2,p)%p*fastpow(jc[n-m],p-2,p)%p;}int lucas(int n,int m,int p){    return m==0?1:1ll*c(n%p,m%p,p)*lucas(n/p,m/p,p)%p;}int main(){    scanf("%d",&t);    while(t--){        scanf("%d%d%d",&n,&m,&p);        jc[0]=1;        for(int i=1;i<=p;i++) jc[i]=1ll*jc[i-1]*i%p;        printf("%d\n",lucas(n+m,m,p)%p);    }}

矩阵快速幂

#include<cstdio>#include<iostream>#include<cstring>#include<set>#include<map>#include<queue>#include<vector>#include<cstdlib>#include<algorithm>#define p 1000000007using namespace std;int n,k,t;struct st{    int a[5][5];    inline st operator *(const st &b)const{        st ans;        for(int i=0;i<3;i++)        for(int j=0;j<3;j++)        {            ans.a[i][j]=0;            for(int k=0;k<3;k++)            ans.a[i][j]=(1ll*ans.a[i][j]+1ll*a[i][k]*b.a[k][j]%p)%p;        }        return ans;    }}q;st fastpow(st a,int k){    st ans=a;k--;    while(k){        if(k&1) ans=ans*a;        a=a*a;        k>>=1;    }    return ans;}int main(){    scanf("%d",&t);    q.a[0][0]=1;q.a[0][1]=1;q.a[0][2]=0;q.a[1][0]=0;q.a[1][1]=0;    q.a[1][2]=1;q.a[2][0]=1;q.a[2][1]=0;q.a[2][2]=0;    while(t--){        scanf("%d",&n);         if(n==1||n==2||n==3) {        printf("1\n");        continue;        }        st ans=fastpow(q,n-3);        printf("%d\n",(1ll*ans.a[0][0]+1ll*ans.a[1][0]+1ll*ans.a[2][0])%1000000007);    }}
原创粉丝点击