2017.10.26测试

来源:互联网 发布:硬盘烧坏数据能恢复吗 编辑:程序博客网 时间:2024/05/16 09:43

分数:0+65+0=65
emm,果然又是T1翻车

题解

T1 copycat

判断字符串B是否为字符串A经过若干次变化得到的
这里对于变化的定义是:
对于每一次变化,将A中所有 小写字母 x 替换为 小写字母 y (x、y 为任意字母)
emmm,加粗的原因是因为题解中如下三种情况我都考虑到了:

  1. 两个代码长度相等
  2. 所有非字母位置的字符对应相等
  3. 字符串A中所有字母x对应在字符串B中的位置的字母也都相同

但zero的我惊奇地发现一个反例:

Aabcdefxyz
Bzyxfedcba

此组数据满足上述所有条件,但却是不可行的,于是我加了一组预判,最后成功爆零
mother f**ker?!

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cstdlib>#include<algorithm>#include<cmath>#include<iomanip>#define inf 10000097#define m(a) memset(a,0,sizeof(a))using namespace std;int read(){    int x=0,f=1;char c;    for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-1;    for(;isdigit(c);c=getchar())x=(x<<3)+(x<<1)+c-'0';    return x*f;}int T,top;char s[1005],c[1005];int a[1005],b[1005],sta[1005];bool sign,fla,vis[1005],hva[1005],hvb[1005];int main(){//  freopen("copycat.in","r",stdin);//  freopen("copycat.out","w",stdout);    T=read();    while(T--){        m(a);m(b);m(hva);m(hvb);        m(vis);m(sta);        sign=0;top=0;fla=1;        gets(s+1);        int n=strlen(s+1);        gets(c+1);        int m=strlen(c+1);        if(n!=m){            cout<<0<<endl;            continue;        }        for(int i=1;i<=n;i++){            if(s[i]>='a'&&s[i]<='z')a[i]=s[i]-'a'+1,hva[a[i]]=1;            if(c[i]>='a'&&c[i]<='z')b[i]=c[i]-'a'+1,hvb[b[i]]=1;            if(!a[i]&&!b[i]){                if(s[i]!=c[i]){                    sign=1;break;                }                a[i]=inf;b[i]=inf;            }            else if(a[i]!=b[i]){                fla=0;            }            if((!a[i]&&b[i])||(a[i]&&!b[i])){                sign=1;break;            }        }        if(sign){            cout<<0<<endl;            continue;        }        if(fla){            cout<<1<<endl;            continue;        }        for(int i=1;i<=n;i++){            if(vis[i]||a[i]==inf)continue;            int tmp=a[i];            for(int j=i;j<=n;j++){                if(a[j]==tmp)sta[++top]=j,vis[j]=1;            }            tmp=b[sta[top]];top--;            while(top){                if(b[sta[top]]!=tmp){                    sign=1;break;                }                top--;            }        }        if(sign) {            cout<<0<<endl;            continue;        }        for(int i=1;i<=26;i++){            if(!hva[i])break;            if(i==26)                for(int j=1;j<=26;j++){                    if(!hvb[j])break;                    if(j==26)sign=1;                }        }        if(sign) cout<<0<<endl;        cout<<1<<endl;    }}

T2 running

最后得到的经验

  1. get_fa()简化写法与原写法时间复杂度并无可见差距
  2. 迪杰斯特拉最短路算法中也可以加入vis函数以优化,对时间复杂度帮助较大

题目:一张连通图,每条边两个权值a、b,需要找到由S到T所有路径中,在满足路径上所有a权值最大值最小的前提下,b权值和最小的路径

先并查集找出答案一,然后跑最短路求出答案二

#include<bits/stdc++.h>#define m(a) memset(a,0,sizeof(a))using namespace std;int read(){    int x=0,f=1;char c;    for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-1;    for(;isdigit(c);c=getchar())x=(x<<3)+(x<<1)+c-'0';    return x*f;}int n,m,maxx;int fst[500005],fa[500005];long long dis[500005];bool vis[500005];int tot=0,num=0;struct node{    int t;    long long len;    int en,to;    int nxt;}e[6000005],ee[6000005];void inser(int x,int y,long long c){    ee[++tot].nxt=fst[x];    fst[x]=tot;    ee[tot].en=x;    ee[tot].to=y;    ee[tot].len=(long long)c;}bool comp(const node &a,const node &b){    return a.t<b.t;}void wr(long long x){    if(x/10)wr(x/10);putchar(x%10+'0');}int get_fa(int x){    return x==fa[x]?x:fa[x]=get_fa(fa[x]);}int a,b,t,c,T,S;int main(){//  freopen("running.in","r",stdin);//  freopen("running.out","w",stdout);    maxx=0;    n=read();m=read();    for(int i=1;i<=m;i++){        a=read();b=read();t=read();c=read();        e[++num].en=a;e[num].to=b;e[num].t=t;e[num].len=(long long)t*c;    }    S=read();T=read();    sort(e+1,e+num+1,comp);    for(int i=1;i<=n;i++) fa[i]=i,dis[i]=-1;    for(int i=1;i<=num;i++){        int px=get_fa(e[i].en);        int py=get_fa(e[i].to);        if(px!=py){            fa[px]=py;            maxx=e[i].t;        }        if(get_fa(S)==get_fa(T)){            cout<<maxx<<" ";            break;        }    }    for(int i=1;i<=num;i++){        if(e[i].t<=maxx){            inser(e[i].en,e[i].to,e[i].len);            inser(e[i].to,e[i].en,e[i].len);        }    }    dis[S]=0;    priority_queue<pair<long long,int> >q;    q.push(make_pair(0,S));    while(!q.empty()){        int x=q.top().second;        q.pop();        vis[x]=0;        for(int u=fst[x];u;u=ee[u].nxt){            if(dis[ee[u].to]>dis[x]+ee[u].len||dis[ee[u].to]==-1){                dis[ee[u].to]=dis[x]+ee[u].len;                if(!vis[ee[u].to]){                    vis[ee[u].to]=1;                    q.push(make_pair(-dis[ee[u].to],ee[u].to));                }            }        }    }    wr(dis[T]);}

T3 toyuq

树形DP、树的直径的维护
人力有所不及(滑稽)
贴个不特判25分的WA暴力:

#include<bits/stdc++.h>using namespace std;int read(){    int x=0;char c;    for(c=getchar();!isdigit(c);c=getchar());    for(;isdigit(c);c=getchar())x=(x<<3)+(x<<1)+c-'0';    return x;}int n,t;int maxx=0;int x,y,z;int tot=0;int w[305],ar[305],fst[305];int nxt[605],to[605],len[605];void inser(int x,int y,int w){    nxt[++tot]=fst[x];    fst[x]=tot;    to[tot]=y;    len[tot]=w;}void dfs(int x,int fa,int ff,int tt){    if(tt>t){        return;    }    maxx=max(maxx,ff);    if(tt==t){        return;    }    int ttt=ar[x],tttt=w[x];    ar[x]=0;    for(int u=fst[x];u;u=nxt[u]){        int v=to[u];        if(v==fa)continue;        int tmp=ff+w[x];        w[x]=0;        dfs(v,x,tmp,tt+len[u]+ar[v]);        w[x]=tttt;    }    ar[x]=ttt;}int main(){    n=read();t=read();    for(int i=1;i<=n;i++) w[i]=read();    for(int i=1;i<=n;i++) ar[i]=read();    for(int i=1;i<n;i++){        x=read();y=read();z=read();        inser(x,y,z);inser(y,x,z);    }    for(int i=1;i<=n;i++){        dfs(i,0,w[i],ar[i]);    }    cout<<maxx;}

总结

T1还是要稳呐!

原创粉丝点击