首页 > 代码库 > 20161027模拟赛解题报告

20161027模拟赛解题报告

20161027模拟赛解题报告

By shenben

T1

数学题

模拟即可。

注意开long long

T2

技巧题

图片为本题第一张图。(无奈,图传不上来)

首先第一问图中的“Y 字形”的数量,这么简单,在此不细讲。

详见代码

On)累加一下就好了

主要说说第二问怎么搞

预处理 每个点分别与其他那些点相连 权值为第1,2,3大(若没有23大,就忽略)。记录一下权值与对应的点的标号。目的是方便下面的判断。

枚举入度>=3的点,即点B(有多个)

再枚举点B相连D点(不是点A,C)。

Step1

      若<B,D>D外连边的第1(权值)sum=D外连边的第2(权值)

否则sum=D外连边的第1(权值)

Step2:

<B,D>B外连边的第1(权值)sum(累加)+=B外连边的第2(权值)+ B外连边的第3(权值)

<B,D>B外连边的第2(权值)sum(累加)+=B外连边的第1(权值)+ B外连边的第3(权值)

<B,D>B外连边的第3(权值)sum(累加)+=B外连边的第1(权值)+ B外连边的第2(权值)

Step3

对于每种答案取一下大。maxn=max(maxn,sum);

Step4

最后输出。

注意windowslinux

T3

空间题

第一次    骗了30

实在是不会啊。

So 就无可奉告了

 

本次测试在window环境下评测的

T1代码(100分):

#include<cstdio>#include<iostream>#include<algorithm>#define ll long longusing namespace std;const int N=1e5+10;inline const ll read(){    register ll x=0,f=1;    register char ch=getchar();    while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}    while(ch>=0&&ch<=9){x=(x<<3)+(x<<1)+ch-0;ch=getchar();}    return x*f;}ll T,a,b,c,d,A,B,C,D,zd,zx,tmp,ansf,ansm;int main(){    freopen("tile.in","r",stdin);    freopen("tile.out","w",stdout);    T=read();    while(T--){        a=read();b=read();        c=read();d=read();        A=a*d;B=b*d;        C=c*b;D=b*d;        zd=__gcd(A,C);        zx=A/zd*C;        tmp=__gcd(zx,B);        ansf=zx/tmp;        ansm=B/tmp;        if(ansm==1) printf("%I64d\n",ansf);        else printf("%I64d/%I64d\n",ansf,ansm);    }    return 0;}

T2代码(100分):

#include<cstdio>#include<algorithm>#define ll long longusing namespace std;const ll N=2e5+10;inline const ll read(){    register ll x=0,f=1;    register char ch=getchar();    while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}    while(ch>=0&&ch<=9){x=(x<<3)+(x<<1)+ch-0;ch=getchar();}    return x*f;}struct node{    ll v,w,next;}e[N<<1];ll n,tot,ans,in[N],head[N];ll maxn;void add(ll x,ll y,ll z){    e[++tot].v=y;    e[tot].w=z;    e[tot].next=head[x];    head[x]=tot;}void bfs(ll x){    ll t=in[x]-1;    ll C=t*(t-1)/2;    for(ll i=head[x],t;i;i=e[i].next) if(in[e[i].v]>1) ans+=C*(in[e[i].v]-1);}struct data{    pair<ll,ll>own[4];}B[N];void first_deal(ll x,ll y,ll z){    if(z>B[x].own[1].second){        B[x].own[3]=B[x].own[2];        B[x].own[2]=B[x].own[1];        B[x].own[1]=make_pair(y,z);    }    else if(z>B[x].own[2].second){        B[x].own[3]=B[x].own[2];        B[x].own[2]=make_pair(y,z);    }    else{        B[x].own[3]=make_pair(y,z);    }}int main(){    freopen("question.in","r",stdin);    freopen("question.out","w",stdout);    n=read();    for(ll i=1,x,y,z;i<n;i++){        x=read(),y=read(),z=read();        add(x,y,z);add(y,x,z);        in[x]++;in[y]++;        first_deal(x,y,z);        first_deal(y,x,z);    }     for(ll i=1;i<=n;i++) if(in[i]>2) bfs(i);    for(ll i=1;i<=n;i++){        if(in[i]>2){            for(ll j=head[i],sum;j;j=e[j].next){                if(in[e[j].v]>1){                    sum=0;                    if(B[e[j].v].own[1].first!=i) sum=B[e[j].v].own[1].second;                    else sum=B[e[j].v].own[2].second;                    if(B[i].own[1].first!=e[j].v&&B[i].own[2].first!=e[j].v) sum+=e[j].w+B[i].own[1].second+B[i].own[2].second;                    else if(B[i].own[1].first!=e[j].v&&B[i].own[3].first!=e[j].v) sum+=e[j].w+B[i].own[1].second+B[i].own[3].second;                    else sum+=e[j].w+B[i].own[2].second+B[i].own[3].second;                    maxn=max(maxn,sum);                }            }        }    }    printf("%I64d\n%I64d",ans,maxn);    return 0;}

 

T3代码(30分):

#include<cstdio>#include<cstdlib>#include<queue>#include<algorithm>//#include<ctime>using namespace std;const int N=22;inline const int read(){    register int x=0,f=1;    register char ch=getchar();    while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}    while(ch>=0&&ch<=9){x=(x<<3)+(x<<1)+ch-0;ch=getchar();}    return x*f;}struct node{    int x,y,z,step;    node(int x=0,int y=0,int z=0,int step=0):x(x),y(y),z(z),step(step){}};const int dx[]={0,0,0,0,1,-1};const int dy[]={0,0,1,-1,0,0};const int dz[]={1,-1,0,0,0,0};short mp[N][N][N];bool vis[N][N][N];int m,X,Y,Z,x1,y1,z1,x2,y2,z2;bool inside(int x,int y,int z){    if(x>0&&x<=X&&y>0&&y<=Y&&z>0&&z<=Z) return 1;    return 0;}bool special_judge(int x,int y,int z){    int t;bool f1=0,f2=0,f3=0,f4=0,f5=0,f6=0;    t=inside(x-1,y,z);    if(t){        if(mp[x-1][y][z]==255) f1=1;    }    else f1=1;    t=inside(x+1,y,z);    if(t){        if(mp[x+1][y][z]==255) f2=1;    }    else f2=1;    t=inside(x,y-1,z);    if(t){        if(mp[x][y-1][z]==255) f3=1;    }    else f3=1;    t=inside(x,y+1,z);    if(t){        if(mp[x][y+1][z]==255) f4=1;    }    else f4=1;    t=inside(x,y,z-1);    if(t){        if(mp[x][y][z-1]==255) f5=1;    }    else f5=1;    t=inside(x,y,z+1);    if(t){        if(mp[x][y][z+1]==255) f6=1;    }    else f6=1;    return f1&f2&f2&f3&f4&f5&f6;}int tot;int work(){    queue<node>q;    q.push(node(x1,y1,z1,0));    while(!q.empty()){        tot++;        node h=q.front();q.pop();        for(int i=0,s,nx,ny,nz;i<6;i++){            nx=h.x+dx[i];            ny=h.y+dy[i];            nz=h.z+dz[i];            if(!vis[nx][ny][nz]&&inside(nx,ny,nz)&&mp[nx][ny][nz]!=255){                vis[nx][ny][nz]=1;                s=h.step+1;                q.push(node(nx,ny,nz,s));                if(nx==x2&&ny==y2&&nz==z2) return s;            }        }    }}int Clac,tmp;char ch1,ch2;int main(){    freopen("plumber.in","r",stdin);    freopen("plumber.out","w",stdout);    //srand(time(0));    X=read();Y=read();Z=read();    m=read();    x1=read();y1=read();z1=read();ch1=getchar();    x2=read();y2=read();z2=read();ch2=getchar();    mp[x1][y1][z1]=1;    mp[x2][y2][z2]=2;    for(int i=1,x,y,z;i<=m;i++){        x=read();y=read();z=read();        mp[x][y][z]=255;    }    if(special_judge(x1,y1,z1)){puts("impossible");return 0;}    if(special_judge(x2,y2,z2)){puts("impossible");return 0;}    Clac=work();    tmp=Clac/3;    if(tmp>20) {puts("impossible");return 0;}    printf("%d",tmp);    return 0;}

 

 

 

20161027模拟赛解题报告