zoukankan      html  css  js  c++  java
  • jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    赛时

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

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

    在这里插入图片描述

    题解

    应用题解的一句话吧。
    在这里插入图片描述
    心态崩了。
    这是我读过的最长的题面,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
    ");
    		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("
    ");
    	}*/
    	
    	for (int i=1;i<=20;i++)
    	{
    		rak[id[i]]=i;
    	}
    	
    	scanf("%d",&n);
    	if (n==1)
    	{
    		printf("methane
    ");
    		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
    ");
    		}
    	}
    }
    
  • 相关阅读:
    Java POI Word 写文档
    安装SQL Server Management Studio遇到的29506错误
    DataSet中的relation
    如何在Eclipse中配置Tomcat
    button与submit
    redis应用场景
    机器学习实战-KNN(K-近邻算法)详解
    python中的random扩展
    php函数实现文章列表显示的几秒前,几分钟前,几天前等方法
    HTML5的Video标签的属性,方法和事件汇总
  • 原文地址:https://www.cnblogs.com/RainbowCrown/p/11597178.html
Copyright © 2011-2022 走看看