jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)

jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)

赛时

花了30+分钟去读题,幸好读懂了。
当时全机房的人都在祝愿出题人身体健康,阖家安康,万事如意。
怕是他再这么玩,出个什么“物理”。下一年恐怕要到清明节去拜拜了。

疯狂地打,越码越心态崩掉。
码了近2个小时,6.7k+的代码,人已经是处于爆炸状态了,只打到80分。
后面两道大水都没想。
结果出来成绩爆0?!!

jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)

题解

应用题解的一句话吧。
jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
心态崩了。
这是我读过的最长的题面,C++打过的最长的程序,我好长啊。

题解

9k+

#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <cctype>
using namespace std;
const int maxn=310;

char s[21][10],ss[21][10],t[10][10],jh;
int n,xx,yy,dep[maxn],fa[maxn],g1,g2,ag1,ag2,st,en;
int gs[maxn],gg[maxn],a[maxn],b[maxn],aa[maxn],bb[maxn],cc[maxn],x[maxn],y[maxn],rd[maxn],dd[maxn],ee[maxn],jl[maxn],id[21],px[maxn],rak[maxn],ans[maxn][maxn],c[maxn],e[maxn];
int tot,nex[maxn*2],las[maxn*2],tov[maxn*2];
bool bz[maxn],jb[maxn],final;

inline int read()
{
    int X=0,w=0; char ch=0;
    while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
    while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}

__attribute__((optimize("-O3")))
void insert(int x,int y)
{
    tot++;
    tov[tot]=y;
    nex[tot]=las[x];
    las[x]=tot;
}

__attribute__((optimize("-O3")))
void dfs(int x,int ff)
{
    dep[x]=dep[ff]+1;
    fa[x]=ff;
    for (int i=las[x];i>0;i=nex[i])
    {
        if (tov[i]!=ff) dfs(tov[i],x);
    }
}

__attribute__((optimize("-O3")))
void get(int x,int ff)
{
    for (int i=las[x];i>0;i=nex[i])
    {
        if (tov[i]!=ff) 
        {
            if (bz[tov[i]]==false)
            {
                g2++;
                a[g2]=dep[x];
                b[g2]=tov[i];   
            }           
        }
    }
    for (int i=las[x];i>0;i=nex[i])
    {
        if (tov[i]!=ff) 
        {
            if (bz[tov[i]]!=false)
            {
                get(tov[i],x); 
            }           
        }
    }
}


__attribute__((optimize("-O3")))
void color1(int x,int i)
{
    c[i]++;
    for (int j=las[x];j>0;j=nex[j])
    {
        if (bz[tov[j]]==false)
        {
            bz[x]=true;
            color1(tov[j],i);   
        }
    }
}

__attribute__((optimize("-O3")))
void color(int x,int i)
{
    cc[i]++;
    for (int j=las[x];j>0;j=nex[j])
    {
        if (bz[tov[j]]==false)
        {
            bz[x]=true;
            color(tov[j],i);    
        }
    }
}

__attribute__((optimize("-O3")))
void qsort(int l,int r)
{
    int i=l;int j=r;
    int m=ee[(i+j)/2];
    int m1=aa[(i+j)/2];
    while (i<=j)
    {
        while (ee[i]<m || (ee[i]==m && aa[i]<m1)) i++;
        while (ee[j]>m || (ee[j]==m && aa[j]>m1)) j--;
        if (i<=j)
        {
            swap(aa[i],aa[j]);
            swap(ee[i],ee[j]);
            swap(cc[i],cc[j]);
            i++;j--;
        }
    }
    if (l<j) qsort(l,j);
    if (r>i) qsort(i,r); 
}

__attribute__((optimize("-O3")))
void work()
{
        for (int k=1;k<=n;k++)
        {
            fa[k]=0;dep[k]=0;bz[k]=false;
        }
        dfs(st,0);
        
        yy=en;xx=st;
        while (yy!=0)
        {
            bz[yy]=true;
            yy=fa[yy];
        }
        
        for (int i=1;i<=g2;i++)
        {
            color(bb[i],i);
        }
        
        for (int i=1;i<=g2;i++)
        {
            ee[i]=rak[cc[i]];
        }
        
        qsort(1,g2);
        
        int j=0;
        for (int i=1;i<=g2;i++)
        {
            if (ee[i]!=ee[i-1])
            {
                j++;
                jl[j]=cc[i];
            }
            ans[j][0]++;
            ans[j][ans[j][0]]=aa[i];
        }
        
        for (int i=1;i<=j;i++)
        {
            printf("%d",ans[i][1]);
            for (int k=2;k<=ans[i][0];k++)
            {
                printf(",%d",ans[i][k]);
            }
            printf("-");
            if (ans[i][0]>1)
            {
                for (int k=1;k<=gg[ans[i][0]];k++)
                {
                    printf("%c",t[ans[i][0]][k]);
                }
            }
            for (int k=1;k<=gs[jl[i]];k++)
            {
                printf("%c",s[jl[i]][k]);
            }
            printf("yl");
            if (i!=j)
            {
                printf("-");
            }
        }
        
        for (int k=1;k<=gs[g1];k++)
        {
            printf("%c",s[g1][k]);
        }
        if (final==false)
        printf("ane\n");
        else
        printf("yl");
}

__attribute__((optimize("-O3")))
int main()
{   
    final=false;
    freopen("chem.in","r",stdin);
    freopen("chem.out","w",stdout);
    gs[1]=4;s[1][1]='m';s[1][2]='e'; s[1][3]='t';s[1][4]='h';
    gs[2]=3;s[2][1]='e';s[2][2]='t'; s[2][3]='h';
    gs[3]=4;s[3][1]='p';s[3][2]='r'; s[3][3]='o';s[3][4]='p';
    gs[4]=3;s[4][1]='b';s[4][2]='u'; s[4][3]='t';
    gs[5]=4;s[5][1]='p';s[5][2]='e'; s[5][3]='n';s[5][4]='t';
    gs[6]=3;s[6][1]='h';s[6][2]='e'; s[6][3]='x';
    gs[7]=4;s[7][1]='h';s[7][2]='e'; s[7][3]='p';s[7][4]='t';
    gs[8]=3;s[8][1]='o';s[8][2]='c'; s[8][3]='t';
    gs[9]=3;s[9][1]='n';s[9][2]='o'; s[9][3]='n';
    gs[10]=3;s[10][1]='d';s[10][2]='e'; s[10][3]='c';
    gs[11]=5;s[11][1]='u';s[11][2]='n'; s[11][3]='d';s[11][4]='e';s[11][5]='c';
    gs[12]=5;s[12][1]='d';s[12][2]='o'; s[12][3]='d';s[12][4]='e';s[12][5]='c';
    gs[13]=6;s[13][1]='t';s[13][2]='r'; s[13][3]='i';s[13][4]='d';s[13][5]='e';s[13][6]='c';
    gs[14]=8;s[14][1]='t';s[14][2]='e'; s[14][3]='t';s[14][4]='r';s[14][5]='a';s[14][6]='d';s[14][7]='e';s[14][8]='c';
    gs[15]=8;s[15][1]='p';s[15][2]='e'; s[15][3]='n';s[15][4]='t';s[15][5]='a';s[15][6]='d';s[15][7]='e';s[15][8]='c';
    gs[16]=7;s[16][1]='h';s[16][2]='e'; s[16][3]='x';s[16][4]='a';s[16][5]='d';s[16][6]='e';s[16][7]='c';
    gs[17]=8;s[17][1]='h';s[17][2]='e'; s[17][3]='p';s[17][4]='t';s[17][5]='a';s[17][6]='d';s[17][7]='e';s[17][8]='c';
    gs[18]=7;s[18][1]='o';s[18][2]='c'; s[18][3]='t';s[18][4]='a';s[18][5]='d';s[18][6]='e';s[18][7]='c';
    gs[19]=7;s[19][1]='n';s[19][2]='o'; s[19][3]='n';s[19][4]='a';s[19][5]='d';s[19][6]='e';s[19][7]='c';
    gs[20]=4;s[20][1]='i';s[20][2]='c'; s[20][3]='o';s[20][4]='s';
    
    gg[2]=2;t[2][1]='d';t[2][2]='i';
    gg[3]=3;t[3][1]='t';t[3][2]='r';t[3][3]='i';
    gg[4]=5;t[4][1]='t';t[4][2]='e';t[4][3]='t';t[4][4]='r';t[4][5]='a';
    gg[5]=5;t[5][1]='p';t[5][2]='e';t[5][3]='n';t[5][4]='t';t[5][5]='a';
    gg[6]=4;t[6][1]='h';t[6][2]='e';t[6][3]='x';t[6][4]='a';
    gg[7]=5;t[7][1]='h';t[7][2]='e';t[7][3]='p';t[7][4]='t';t[7][5]='a';
    gg[8]=4;t[8][1]='o';t[8][2]='c';t[8][3]='t';t[8][4]='a';
    gg[9]=4;t[9][1]='n';t[9][2]='o';t[9][3]='n';t[9][4]='a';
    
    memcpy(ss,s,sizeof(s));memcpy(px,gs,sizeof(gs));
    for (int i=1;i<=20;i++) id[i]=i;
    for (int i=1;i<=20;i++)
    {
        for (int j=i+1;j<=20;j++)
        {
            bool pd=false;
            for (int k=1;k<=min(px[i],px[j])+1;k++)
            {
                if (ss[i][k]>ss[j][k])
                {
                    pd=true;
                }
                else
                if (ss[i][k]<ss[j][k])
                {
                    break;
                }
            }
            if (pd==true)
            {
                swap(id[i],id[j]);
                for (int k=1;k<=9;k++)
                {
                    jh=ss[i][k];
                    ss[i][k]=ss[j][k];
                    ss[j][k]=jh;
                }           
                swap(px[i],px[j]);
            }
        }
    }
    
    /*for (int i=1;i<=20;i++)
    {
        for (int j=1;j<=px[i];j++)
        {
            printf("%c",ss[i][j]);
        }
        printf("\n");
    }*/
    
    for (int i=1;i<=20;i++)
    {
        rak[id[i]]=i;
    }
    
    scanf("%d",&n);
    if (n==1)
    {
        printf("methane\n");
        return 0;
    }
    for (int i=1;i<n;i++)
    {
        scanf("%d%d",&x[i],&y[i]);
        insert(x[i],y[i]);
        insert(y[i],x[i]);
        rd[x[i]]++;rd[y[i]]++;
    }
    tot=0;
    for (int i=1;i<=n;i++)
    {
        if (rd[i]==1)
        {
            tot++;
            dd[tot]=i;
        }
    }
    for (int i=1;i<=tot;i++)
    {
        for (int j=1;j<=tot;j++)
        {
            if (i!=j)
            {
                for (int k=1;k<=n;k++)
                {
                    fa[k]=0;dep[k]=0;bz[k]=false;c[k]=0;
                }
                xx=dd[i];yy=dd[j]; 
                dfs(xx,0);
                g1=dep[yy];
                while (yy!=0)
                {
                    bz[yy]=true;
                    yy=fa[yy];
                }
                g2=0;
                get(xx,0);
                
                for (int i=1;i<=g2;i++)
                {
                    color1(b[i],i);
                }
                
                for (int i=1;i<=g2;i++)
                {
                    e[i]=rak[c[i]];
                }
                
                bool qd=false;
                if (g1>ag1)
                {
                    qd=true;
                }
                else
                if (g1==ag1) 
                {
                    if (g2>ag2)
                    {
                        qd=true;
                    }
                    else
                    if (g2==ag2)
                    {
                        bool pd=true;
                        bool pdd=true;
                        for (int k=1;k<=g2;k++)
                        {
                            if (aa[k]>a[k]) 
                            {
                                bool pdd=false;
                                break;
                            }
                            else 
                            if (aa[k]<a[k]) 
                            {
                                pd=false;break; 
                            }
                        }
                        if (pd==true && pdd==false)
                        {
                            qd=true;
                        }
                        if (pd==true && pdd==true)
                        {
                            bool pddd=true;
                            for (int k=1;k<=g2;k++)
                            {
                                if (e[k]<ee[k])
                                {
                                    break;
                                }
                                else
                                if (e[k]>ee[k])
                                {
                                    pddd=false;
                                    break;
                                }
                            }
                            if (pddd==true)
                            {
                                qd=true;
                            }
                        }
                    }
                }
                if (qd==true)
                {
                    ag1=g1;ag2=g2;st=dd[i];en=dd[j];
                    memcpy(aa,a,sizeof(a));
                    memcpy(bb,b,sizeof(b));
                }
            }
        }
    }
    g1=ag1;
    g2=ag2;
    if (g2!=1)
    {
        work();
    }
    else
    {
        for (int k=1;k<=n;k++)
        {
            fa[k]=0;dep[k]=0;bz[k]=false;
        }
        dfs(st,0);
        
        yy=en;xx=st;
        while (yy!=0)
        {
            bz[yy]=true;
            yy=fa[yy];
        }
        
        bool pd=true;
        for (int i=1;i<=n;i++)
        {
            if (bz[i]==false && rd[i]>2)
            {
                pd=false;
                break;
            }
        }
        if (pd==true)
        {
            work();
        }
        else
        {
            int jlg1=g1;
            g1=0;ag1=0;
            g2=0;ag2=0;
            memcpy(jb,bz,sizeof(bz));
            int stb=bb[1];
            int sta=aa[1];
            //for (int i=1;i<=tot;i++)
            {
                int i=stb;
                for (int j=1;j<=tot;j++)
                {
                    if (i!=j && jb[i]==false && jb[dd[j]]==false)
                    {
                        for (int k=1;k<=n;k++)
                        {
                            fa[k]=0;dep[k]=0;bz[k]=jb[k];c[k]=0;
                        }
                        xx=i;yy=dd[j]; 
                        dfs(xx,0);
                        g1=dep[yy];
                        while (yy!=0)
                        {
                            bz[yy]=true;
                            yy=fa[yy];
                        }
                        g2=0;
                        get(xx,0);
                        
                        for (int i=1;i<=g2;i++)
                        {
                            color1(b[i],i);
                        }
                        
                        for (int i=1;i<=g2;i++)
                        {
                            e[i]=rak[c[i]];
                        }
                        
                        bool qd=false;
                        if (g1>ag1)
                        {
                            qd=true;
                        }
                        else
                        if (g1==ag1) 
                        {
                            if (g2>ag2)
                            {
                                qd=true;
                            }
                            else
                            if (g2==ag2)
                            {
                                bool pd=true;
                                bool pdd=true;
                                for (int k=1;k<=g2;k++)
                                {
                                    if (aa[k]>a[k]) 
                                    {
                                        bool pdd=false;
                                        break;
                                    }
                                    else 
                                    if (aa[k]<a[k]) 
                                    {
                                        pd=false;break; 
                                    }
                                }
                                if (pd==true && pdd==false)
                                {
                                    qd=true;
                                }
                                if (pd==true && pdd==true)
                                {
                                    bool pddd=true;
                                    for (int k=1;k<=g2;k++)
                                    {
                                        if (e[k]<ee[k])
                                        {
                                            break;
                                        }
                                        else
                                        if (e[k]>ee[k])
                                        {
                                            pddd=false;
                                            break;
                                        }
                                    }
                                    if (pddd==true)
                                    {
                                        qd=true;
                                    }
                                }
                            }
                        }
                        if (qd==true)
                        {
                            ag1=g1;ag2=g2;st=i;en=dd[j];
                            memcpy(aa,a,sizeof(a));
                            memcpy(bb,b,sizeof(b));
                        }
                    }
                }
            }
            printf("%d-(",sta);
            final=true;
            work();
            printf(")");
            for (int k=1;k<=gs[jlg1];k++)
            {
                printf("%c",s[jlg1][k]);
            }
            printf("ane\n");
        }
    }
}
上一篇:第十二节 gevent多任务


下一篇:翻译密码(简单的 大小写英文字母后移四位,其他字符不变)C语言与Python版本