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\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");
		}
	}
}
posted @ 2019-09-27 12:40  RainbowCrown  阅读(173)  评论(0编辑  收藏  举报