codeforces round338 总结&&题解

来源:互联网 发布:淘宝无忧退货怎么设置 编辑:程序博客网 时间:2024/05/05 05:32
A:
随便搞搞。。开心就好
B:
首先这道题是英语阅读题
我们可以发现。每个点的最长上升序列的长度是固定的,出度入度是固定的
那么我们可以dp一下?大概就是从1枚举到n然后用和他相连的点来更新?
反正我写了个spfa。。没有fst真开心
C:
n<=3000,这意味着我们可以乱搞
把第一个串翻转一下,中间随便插一个字符,然后每次暴力kmp就可以了
但是这道题可以线性做,像刚刚那样翻转后搞个SAM就可以。。
但是这个时C就放过吧
D:
BC原题,快速幂?欧拉函数?乘法逆元?玄学?
E:
二份答案,然后暴力判断在哪里就好了

细节有点坑爹就是了

A:

bool a[100010];int main(){    //freopen("xxx.in","r",stdin);    //freopen("xxx.out","w",stdout);     int n,k;cin>>n>>k;    for(int i=1;i<=n;i++){        int m;cin>>m;        for(int j=1;j<=m;j++){            int x;cin>>x;            a[x]=true;        }    }    for(int i=1;i<=k;i++){        if(!a[i])puts("NO"),exit(0);    }    puts("YES"),exit(0);}
B:

struct Edge{    int to,next;}edge[4000010];int size;int first[1000010];int n,m;int du[1000010];bool exsit[1000010];int dl[1000010];int dis[1000010];void addedge(int x,int y){    size++;    edge[size].to=y;    edge[size].next=first[x];    first[x]=size;    du[x]++;}long long ans;void spfa(){    }int main(){     R(n),R(m);    for(int i=1;i<=m;i++){        int x,y;R(x),R(y);        addedge(x,y),addedge(y,x);    }    int head=0,tail=0;    //dis[1]=1;dl[1]=1;    for(int i=1;i<=n;i++){        dis[i]=1,dl[++tail]=i,exsit[i]=true;    }    while(head!=tail){        head++;if(head==200001)head=1;        int v=dl[head];exsit[v]=false;        for(int u=first[v];u;u=edge[u].next){            if(edge[u].to>v&&dis[edge[u].to]<dis[v]+1){                dis[edge[u].to]=dis[v]+1;                if(!exsit[edge[u].to]){                    tail++;if(tail==200001)tail=1;                    dl[tail]=edge[u].to;exsit[edge[u].to]=0;                }            }        }    }    for(int i=1;i<=n;i++){        ans=max(ans,(long long)du[i]*(long long)dis[i]);    }    cout<<ans<<endl;}

C:

char s[10010];char T[10010];char t[10010];int tot=0;int fail[10010];int id[10010];int t1[10010];#include<vector>vector < pair<int,int> >Ans;int main(){    scanf("%s%s",s+1,T+1);    int n=strlen(s+1),m=strlen(T+1);    for(int i=1;i<=n;i++)t1[s[i]]=1;    for(int i=1;i<=m;i++)if(!t1[T[i]])puts("-1"),exit(0);    for(int i=1,j=n*2+1;i<=n;i++,j--){        s[j]=s[i];        id[j]=id[i]=i;    }    s[n+1]=1;n=n*2+1;    int l,r,preans;    for(int F=1;F<=m;){        t[++tot]=T[F];int ans=0;        for(int i=2,j=0;i<=tot;i++){            while(j&&t[i]!=t[j+1])j=fail[j];            if(t[i]==t[j+1])j++;            fail[i]=j;        }        for(int i=1,j=0;i<=n;i++){            while(j&&s[i]!=t[j+1])j=fail[j];            if(s[i]==t[j+1])j++;            if(j==tot){                ans=i-tot+1;                break;            }        }        if(ans){            F++;            if(F==m+1){                Ans.push_back(make_pair(ans,ans+tot-1));                break;            }            preans=ans;            //cerr<<preans<<endl;         }        else{            Ans.push_back(make_pair(preans,preans+tot-2));            tot=0;        }    }    cout<<Ans.size()<<endl;    for(int i=0;i<Ans.size();i++){        printf("%d %d\n",id[Ans[i].first],id[Ans[i].second]);    }   }

D:

int k[1000010];long long q_pow(long long a,long long n,long long mod){    long long tmp=1;    while(n){        if(n&1) tmp=(tmp*a)%mod;        a=(a*a)%mod;        n/=2;    }    return tmp;}void fuck(){    int i,j,v;    long long pro=1,ans=1;    bool flag=0;    memset(b,0,sizeof(b));        for(i=1;i<=n;i++){        int x;R(x);k[x]++;    }    n=200000;    for(i=1;i<=n;i++){        a[i]=k[i];    }    for(i=1;i<=n;i++){        v=i;        for(j=2;j*j<=i;j++){            if(v%j==0)                while(v%j==0){                    b[j]+=a[i];                    v/=j;                }            }        if(v>1) b[v]+=a[i];    }    for(i=1;i<=n;i++){        if(!b[i]) continue;        if(!flag&&b[i]%2){            flag=true;            pro=(pro*(b[i]+1)/2)%phi;        }        else pro=(pro*(b[i]+1))%phi;    }    for(i=1;i<=n;i++){        if(!b[i]) continue;        if(!flag) b[i]/=2;        ans=(ans*q_pow(i,b[i]*pro%phi+phi,mod))%mod;    }    printf("%I64d\n",ans);}int main(){    while(~scanf("%I64d",&n))        fuck();    return 0;}

E:

//Copyright(c) 2015 liuchenrui#include<cstdio>#include<iostream>#include<cstdlib>using namespace std;long long ansx=0,ansy=0,n,l=1,r=1ll<<30;#define print cout<<ansx<<' '<<ansy,exit(0)#define t1 if(n<=l)ansx-=n,ansy+=2ll*n,print;else ansx-=l,ansy+=2ll*l,n-=l;#define t2 if(n<=l)ansx-=2ll*n,print;else ansx-=2ll*l,n-=l;#define t3 if(n<=l)ansx-=n,ansy-=2ll*n,print;else ansx-=l,ansy-=2ll*l,n-=l;#define t4 if(n<=l)ansx+=n,ansy-=2ll*n,print;else ansx+=l,ansy-=2ll*l,n-=l;#define t5 if(n<=l)ansx+=2ll*n,print;else ansx+=2ll*l,n-=l;#define t6 if(n<=l)ansx+=n,ansy+=2ll*n,print;else ansx+=l,ansy+=2ll*l,n-=l;int main(){    scanf("%I64d",&n);    if(n==0)printf("0 0\n"),exit(0);    while(l!=r){        long long mid=(l+r)>>1ll;        if(mid*(mid+1)*3ll<n)l=mid+1ll;        else r=mid;    }    //t1 t2 t3 t4 t5 t6    ansx=2ll*l,ansy=0;    n-=(l-1)*(l)*3ll;    t1 t2 t3 t4 t5 t6} 


第一次AK啦。。同时入紫

0 0