読者です 読者をやめる 読者になる 読者になる

天下一プログラマーコンテスト2016 予選A

Contest

反省点がないので文章はほぼないです。

Irrelevant:

#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){
	int ret=0;
	for(int i=1;i<=100;i++){
		if(i%3&&i%5)ret+=i;
	}
	printf("%d\n",ret);
}
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
vector<int>g[1100];
int t[1100];
int ret=0;
int mm[1100];
void dfs(int a){
	int tmp=999999;
	if(a==0)tmp=0;
	if(t[a])tmp=t[a];
	else{
		
		for(int i=0;i<g[a].size();i++){
			dfs(g[a][i]);
			tmp=min(tmp,mm[g[a][i]]);
		}
		for(int i=0;i<g[a].size();i++){
			ret+=mm[g[a][i]]-tmp;
		}
	}
	mm[a]=tmp;
}
int main(){
	int a,b;scanf("%d%d",&a,&b);
	for(int i=0;i<a-1;i++){
		int s;scanf("%d",&s);
		g[s].push_back(i+1);
	}
	for(int i=0;i<b;i++){
		int p,q;scanf("%d%d",&p,&q);
		t[p]=q;
	}
	dfs(0);
	printf("%d\n",ret);
}
#include<stdio.h>
#include<algorithm>
using namespace std;
int g[30][30];
char A[2100];
char B[2100];
char ans[30];
int g2[30][30];
bool chk(){
	for(int k=0;k<26;k++)for(int i=0;i<26;i++)for(int j=0;j<26;j++)
		g2[i][j]|=(g2[i][k]&g2[k][j]);
	for(int i=0;i<26;i++)for(int j=i+1;j<26;j++)if(g2[i][j]&&g2[j][i])return false;
	return true;
}
int used[30];
int main(){
	int a;scanf("%d",&a);
	bool dame=false;
	for(int i=0;i<26;i++)g[i][i]=1;
	for(int i=0;i<a;i++){
		scanf("%s%s",A,B);
		for(int j=0;A[j];j++){
			if(!B[j]){
				dame=true;break;
			}
			if(A[j]!=B[j]){
				g[A[j]-'a'][B[j]-'a']=1;
				break;
			}
		}
	}
	if(dame){
		printf("-1\n");return 0;
	}
	for(int i=0;i<26;i++)for(int j=0;j<26;j++)g2[i][j]=g[i][j];
	if(!chk()){
		printf("-1\n");return 0;
	}
	for(int i=0;i<26;i++){
		for(int j=0;j<26;j++){
			if(used[j])continue;
			for(int I=0;I<26;I++)for(int J=0;J<26;J++)g2[I][J]=g[I][J];
			for(int k=0;k<26;k++){
				if(!used[k]&&j!=k)g2[j][k]=1;
			}
			if(chk()){
				used[j]=true;
				ans[i]='a'+j;
			//	printf("%c\n",ans[i]);
				break;
			}
		}
	}
	printf("%s\n",ans);
}

D:
適当なことをして座圧するだけ。

#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
char in[2];
vector<int>g[30];
long long x[30];
long long y[30];
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
long long p3[32];
void dfs(int a,int b,int c,long long X,long long Y,int d){
	x[a]=X;
	y[a]=Y;
	int t=0;
	for(int i=0;i<g[a].size();i++){
		if(b==g[a][i])continue;
		if(c==t)t++;
		dfs(g[a][i],a,t^2,X+p3[31-d]*dx[t],Y+p3[31-d]*dy[t],d+1);
		t++;
	}
}
long long zx[32];
long long zy[32];
int px[32];
int py[32];
char ret[120][120];
int S[30];
int T[30];
int main(){
	int a;scanf("%d",&a);
	for(int i=0;i<a-1;i++){
		scanf("%s",in);
		int p=in[0]-'A';
		scanf("%s",in);
		int q=in[0]-'A';
		g[p].push_back(q);
		g[q].push_back(p);
		S[i]=p;
		T[i]=q;
	}
	p3[0]=1;
	for(int i=1;i<32;i++)p3[i]=p3[i-1]*3;
	dfs(0,-1,-1,0LL,0LL,0);
	for(int i=0;i<a;i++){
		zx[i]=x[i];
		zy[i]=y[i];
	}
	std::sort(zx,zx+a);
	std::sort(zy,zy+a);
	for(int i=0;i<a;i++){
		px[i]=(lower_bound(zx,zx+a,x[i])-zx)*3;
		py[i]=(lower_bound(zy,zy+a,y[i])-zy)*3;
	}
	for(int i=0;i<100;i++)for(int j=0;j<100;j++)ret[i][j]='.';
	for(int i=0;i<a;i++){
		ret[px[i]][py[i]]='A'+i;
	}
	for(int i=0;i<a-1;i++){
		if(px[S[i]]==px[T[i]]){
			for(int j=min(py[S[i]],py[T[i]])+1;j<max(py[S[i]],py[T[i]]);j++)ret[px[S[i]]][j]='-';
		}else{
			for(int j=min(px[S[i]],px[T[i]])+1;j<max(px[S[i]],px[T[i]]);j++)ret[j][py[S[i]]]='|';
		}
	}
	printf("100 100\n");
	for(int i=0;i<100;i++)printf("%s\n",ret[i]);
}

E:
死ぬほど苦手。一生不可能。

#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
vector<pair<int,int> > g[110000];
int gcd(int a,int b){
	while(a){
		b%=a;
		int c=a;a=b;b=c;
	}
	return b;
}
int ABS(int a){return max(a,-a);}
int v[110000];
int d[110000];
int tmp=0;
void dfs(int a,int b,int c){
	//printf("%d %d %d\n",a,b,c);
	d[a]=b;
	v[a]=1;
	for(int i=0;i<g[a].size();i++){
		if(ABS(c)==ABS(g[a][i].second))continue;
		int ad=1;
		if(g[a][i].second<0)ad=-1;
		if(!v[g[a][i].first]){
			
			dfs(g[a][i].first,b+ad,g[a][i].second);
		}else{
		//	printf("%d %d %d %d\n",a,b+1,g[a][i].first,d[g[a][i].first]);
			tmp=gcd(tmp,ABS(b+ad-d[g[a][i].first]));
		}
	}
}
int main(){
	int a,b;scanf("%d%d",&a,&b);
	for(int i=0;i<b;i++){
		int p,q;scanf("%d%d",&p,&q);
		g[p].push_back(make_pair(q,i+1));
		g[q].push_back(make_pair(p,-i-1));
	}
	bool dame=false;
	int ret=0;
	for(int i=0;i<a;i++){
		if(v[i])continue;
		tmp=0;
		dfs(i,0,0);
		if(!tmp){dame=true;break;}
	//	printf("%d\n",tmp);
		ret+=tmp;
	}
	if(dame)printf("-1\n");
	else printf("%d\n",ret);
}

result:
4位(□ある人2位)

苦手セットなのに順位はよかったです。