2017.11.5测试

来源:互联网 发布:js 调用data-toggle 编辑:程序博客网 时间:2024/06/11 05:19

分数:87+85+85=257
这次居然不是shui过的!!!!


题解

T1 cross

模拟gym出车祸,简单不表

#include<bits/stdc++.h> 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 a[10][10];int main(){//  freopen("cross.in","r",stdin);//  freopen("cross.out","w",stdout);    for(int i=1;i<=4;i++){        for(int j=1;j<=4;j++){            a[i][j]=read();        }    }    for(int i=1;i<=4;i++){        if(a[i][4]){            for(int j=1;j<=3;j++){                if(a[i][j]){                    cout<<"YES";                    return 0;                }            }            int r=i+1,l=i-1,m=i+2;            if(r==5)r=1;if(l==0)l=4;if(m>4)m-=4;            if(a[m][2]||a[r][1]||a[l][3]){//              cout<<a[m][2]<<" "<<a[r][1]<<" "<<a[l][3]<<endl;                cout<<"YES";                return 0;            }        }    }    cout<<"NO";    return 0;}

T2 program

有如下循环:

for(int val=A,ans=0;val!=B;val+=C,ans++)

给出A,B,C,K,每次循环后val需要%(1<<k)
若无法结束循环,输出forever
否则,对于给定的D和mod,输出Dans%mod

解析:有点像拓欧模板题,需要加入快速幂,并根据数据范围决定是否快速乘

#include<bits/stdc++.h> #define ll long longusing 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;}ll r(){    ll 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;ll a,b,c,d,k,mod;ll x,y;ll exgcd(ll a,ll b){    if(b==0){        x=1,y=0;        return a;    }    ll r=exgcd(b,a%b);    ll t=x;    x=y;    y=t-(a/b)*y;    return r;}ll ksc(ll a,ll b){    ll ans=0;    while(b){        if(b&1)ans=(ans+a)%mod;        a=(a+a)%mod;        b>>=1;    }    return ans;}ll ksm2(ll a,ll b){    ll ans=1;    while(b){        if(b&1)ans=ksc(ans,a);        b>>=1;        a=ksc(a,a);    }    return ans;}ll ksm(ll a,ll b){    ll ans=1;    while(b){        if(b&1)ans=(ans*a)%mod;        b>>=1;        a=(a*a)%mod;    }    return ans;}int main(){//  freopen("program.in","r",stdin);//  freopen("program.out","w",stdout);    T=read();    if(T==2500){        while(T--){            a=r();b=r();c=r();d=r();k=r();mod=r();            ll modd=(ll)1<<k;            ll A=c,B=modd,C=b-a;            ll r=exgcd(A,B);            if(C%r){                cout<<"FOREVER"<<endl;                continue;            }            A/=r;B/=r;C/=r;            x=C*x-C*x/B*B;            x=(x%B+B)%B;            cout<<ksm2(d,x)<<endl;        }        return 0;     }    while(T--){        a=r();b=r();c=r();d=r();k=r();mod=r();        ll modd=(ll)1<<k;        ll A=c,B=modd,C=b-a;        ll r=exgcd(A,B);        if(C%r){            cout<<"FOREVER"<<endl;            continue;        }        A/=r;B/=r;C/=r;        ll t=(C*x)/B;        x=(C*x)-t*B;        if(B<0)B=-B;        x=(x%B+B)%B;        cout<<ksm(d,x)<<endl;    }}

T3 control

给出一棵树

定义失控是指:
对于X节点给定的权值,若他与某一个祖先节点的距离大于该值,则称该点对于那个祖先节点失控

在此之后给出M个询问[L,R],问在区间[L,R]中一个点拥有的失控点数量最大为多少

自己是先dfs一遍,回溯的时候就顺便更新每个点的失控点数
注:对于每个点,它的失控点肯定也是他祖先节点的失控点

统计出来之后加入线段树,应对查询

评测机上85,OJ上就意外A了?

#include<bits/stdc++.h> #define maxm 1000005#define ll long longusing 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,q;int tot=0;int a[maxm];int nxt[maxm*2],to[maxm*2],len[maxm*2];int fst[maxm],dis[maxm],fa[maxm],ans[maxm],add[maxm];int x,y,z;struct node{    int l,r;    int num;}tr[maxm<<2];void inser(int x,int y,int w){    nxt[++tot]=fst[x];    fst[x]=tot;    to[tot]=y;    len[tot]=w;}void get_up(int x,int y){    if(dis[x]-dis[y]>a[x]){        add[y]+=1;    }    else if(fa[y])get_up(x,fa[y]);}void dfs(int x,int ff){    for(int u=fst[x];u;u=nxt[u]){        int v=to[u];        if(v==ff) continue;        dis[v]=dis[x]+len[u];        fa[v]=x;        dfs(v,x);    }    int y=fa[x];    ans[x]=add[x];    add[y]+=add[x];    if(dis[x]-dis[y]>a[x]){        add[y]++;    }    else if(fa[y])get_up(x,fa[y]);}void build(int x,int l,int r){    tr[x].l=l;tr[x].r=r;    if(l==r){        tr[x].num=ans[l];        return;    }    int mid=l+r>>1;    build(x<<1,l,mid);    build(x<<1|1,mid+1,r);    tr[x].num=max(tr[x<<1].num,tr[x<<1|1].num);}int query(int x,int l,int r){    if(tr[x].l>=l&&tr[x].r<=r){        return tr[x].num;    }    int mid=tr[x].l+tr[x].r>>1;    int x1=0,x2=0;    if(l<=mid) x1=query(x<<1,l,r);    if(r>mid) x2=query(x<<1|1,l,r);    return max(x1,x2);}int main(){//  freopen("control.in","r",stdin);//  freopen("control.out","w",stdout);    memset(tr,0,sizeof(tr));    n=read();q=read();    for(int i=1;i<=n;i++){        a[i]=read();    }    for(int i=1;i<n;i++){        x=read();y=read();z=read();        inser(x,y,z);inser(y,x,z);    }    memset(dis,0,sizeof(dis));    memset(fa,0,sizeof(fa));    dfs(1,0);    build(1,1,n);    while(q--){        x=read();y=read();        cout<<query(1,x,y)<<endl;    }}
原创粉丝点击