2017.10.23测试

来源:互联网 发布:百度指数数据下载 编辑:程序博客网 时间:2024/05/15 01:14

分数:100+0+100=200
状态ojbk

题解

T1 fib

emmm果然走到了这一步…
出题人已经用暴力来应付题解了!
我还能说什么呢?

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<algorithm>#include<cmath>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,a;long long f[1005];void fb(){    #define m(a) memset(a,0,sizeof(a))    m(f);    f[1]=1;    for(int i=2;i<=45;i++){        f[i]=(long long)f[i-1]+f[i-2];    }}bool check(int x){    if(x==0)return 1;    for(int i=1;f[i]<=x;i++){        for(int j=1;f[j]<=x;j++){            int tmp=(long long)f[i]*f[j];            if(x==tmp)return 1;        }    }    return 0;}int main(){//  freopen("fib.in","r",stdin);//  freopen("fib.out","w",stdout);      fb();    T=read();    while(T--){        a=read();        if(check(a)) cout<<"Yes"<<endl;        else cout<<"No"<<endl;    }}

… 实在不知道怎么错

T2 equal

感觉自己写的正解
但是毕竟是linux环境,变数略大,哎呦
就是lca、路径中点,然后一波特判balabala
可是自己又WA又T的,还是太可惜了,毕竟今天还是有五个AKdalao的

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<algorithm>#include<cmath>#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,x,y,m;int tot=0;int nxt[200005],to[200005];int fst[100005],dis[100005],f[100005][30],sz[100005];void inser(int x,int y){    nxt[++tot]=fst[x];    fst[x]=tot;    to[tot]=y;}void dfs(int x,int fa){    sz[x]=1;    for(int u=fst[x];u;u=nxt[u]){        int v=to[u];        if(v==fa) continue;        dis[v]=dis[x]+1;        f[v][0]=x;        dfs(v,x);        sz[x]+=sz[v];    }}void build(){    dfs(1,0);    for(int i=1;i<=26;i++){        for(int j=1;j<=n;j++){            if(f[j][i-1]) f[j][i]=f[f[j][i-1]][i-1];        }    }}int lca(int x,int y){    if(dis[x]<dis[y]) swap(x,y);    int len=dis[x]-dis[y];    for(int s=0;len;len>>=1,s++){        if(len&1) x=f[x][s];    }    for(int i=26;i>=0;i--){        if(f[x][i]!=f[y][i]){            x=f[x][i];y=f[y][i];        }    }    if(x==y)return x;    return f[x][0];}int jp(int x,int ff){    int len=dis[x]-ff;    for(int s=0;len;len>>=1,s++){        if(len&1)x=f[x][s];    }    return sz[x];}void solve(int x,int y){    int w=lca(x,y);    if(dis[x]==dis[y]){        cout<<n-jp(x,dis[w]+1)-jp(y,dis[w]+1)<<endl;        return;    }    if(w==x||w==y){        if(dis[x]<dis[y]) swap(x,y);        int len=dis[x]-dis[y];        if(len&1){            cout<<0<<endl;            return;        }        cout<<jp(x,(dis[x]+dis[y])/2)-jp(x,(dis[x]+dis[y])/2+1)<<endl;        return;    }    int len=dis[x]+dis[y]-2*dis[w];    if(len&1){        cout<<0<<endl;        return;    }    if(dis[x]<dis[y]) swap(x,y);    cout<<jp(x,dis[x]-len/2)-jp(x,dis[x]-len/2+1)<<endl;}int main(){//  freopen("equal.in","r",stdin);//  freopen("equal.out","w",stdout);    m(f);m(dis);m(sz);    tot=0;n=read();    for(int i=1;i<n;i++){        x=read();y=read();        inser(x,y);inser(y,x);    }    build();    m=read();    for(int i=1;i<=m;i++){        x=read();y=read();        if(x==y) cout<<n<<endl;        else solve(x,y);    }}

天啊!!!居然是dis[x]==dis[y]的情况判错了!
这个时候应该是n-size[fx]-size[fy]而我写的居然是size[lca]-…!!!
调了一下午!!!该打

T3 tree

emmm,T3和T1可能是一个情况,但是没有那么简单
我采取从叶子节点开始倒着读,与父节点贪心匹配(就是能配上就配了)
而不是一开始写的:

  • 按照边读
  • 从父节点开始读

于是就A了?!

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<algorithm>#include<cmath>#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,n,k,x,tot,ans,num;int fst[100005];bool vis[100005];struct node{    int x,to,nxt;}e[400005];void clear(){    m(e);m(vis);m(fst);    tot=0;ans=0;num=0;}void inser(int x,int y){    e[++tot].nxt=fst[x];    fst[x]=tot;    e[tot].x=x;    e[tot].to=y;}void dfs(int x,int fa){    for(int u=fst[x];u;u=e[u].nxt){        int v=e[u].to;        if(v==fa) continue;        dfs(v,x);        if(ans>=k)return;        if(!vis[v]&&!vis[x]){            vis[v]=1;            vis[x]=1;            num++;            ans+=2;            if(ans>=k)return;        }    }}void fs(){    for(int i=1;i<=tot;i++){        if(vis[e[i].x]&&vis[e[i].to]) continue;        vis[e[i].x]=1;vis[e[i].to]=1;        ans++;num++;        if(ans>=k)break;    }}int main(){//  freopen("tree.in","r",stdin);//  freopen("tree.out","w",stdout);    T=read();    while(T--){        clear();        n=read();k=read();        for(int i=1;i<n;i++){            x=read();            inser(i+1,x);            inser(x,i+1);        }        dfs(1,0);        if(ans<k)fs();        cout<<num<<endl;    }}
原创粉丝点击