tozangezan's diary

勝手にソースコードをコピペして利用しないでください。

Revenge of JOI2011 予選

選手時代の参加記はここです

スクリーンキャストをしようと思ったので、4年前に解いたセットをもう一度といてみました。

スクリーンキャストはここです

前回に比べて6の方針がすっきりしたと思います。

1: (01:28)

#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){
	int a,b,c,d,e;
	scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
	printf("%d\n",min(a,min(b,c))+min(d,e)-50);
}

2: (04:32)

#include<stdio.h>
#include<algorithm>
using namespace std;
int p[200];
int main(){
	int a;
	scanf("%d",&a);
	for(int i=0;i<(a*(a-1)/2);i++){
		int b,c,d,e;
		scanf("%d%d%d%d",&b,&c,&d,&e);
		b--;c--;
		if(d>e)p[b]+=3;
		else if(e>d)p[c]+=3;
		else {p[b]++;p[c]++;}
	}
	for(int i=0;i<a;i++){
		int num=1;
		for(int j=0;j<a;j++){
			if(p[j]>p[i])num++;
		}
		printf("%d\n",num);
	}
}

3: (07:38)

#include<stdio.h>
#include<algorithm>
using namespace std;
int e[1100];
int main(){
	int a;scanf("%d",&a);
	int b,c;scanf("%d%d",&b,&c);
	int d;scanf("%d",&d);
	for(int i=0;i<a;i++){
		scanf("%d",e+i);
	}
	std::sort(e,e+a);
	int ret=d/b;
	int now=d;
	int cost=b;
	for(int i=a-1;i>=0;i--){
		now+=e[i];
		cost+=c;
		ret=max(ret,now/cost);
	}
	printf("%d\n",ret);
}

4: (12:02)

#include<stdio.h>
#include<algorithm>
using namespace std;
int mod=10000;
int dp[110][3][3];
int p[110];
int main(){
	int a,b;
	scanf("%d%d",&a,&b);
	for(int i=0;i<110;i++)p[i]=-1;
	for(int i=0;i<b;i++){
		int s,t;scanf("%d%d",&s,&t);
		s--;t--;
		p[s]=t;
	}
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			if(p[0]!=-1&&p[0]!=i)continue;
			if(p[1]!=-1&&p[1]!=j)continue;
			dp[2][i][j]=1;
		}
	}
	for(int i=2;i<a;i++){
		for(int j=0;j<3;j++)for(int k=0;k<3;k++)for(int l=0;l<3;l++){
			if(j==k&&k==l)continue;
			if(p[i]!=-1&&l!=p[i])continue;
			dp[i+1][k][l]=(dp[i+1][k][l]+dp[i][j][k])%mod;
		}
	}
	int ret=0;
	for(int i=0;i<3;i++)for(int j=0;j<3;j++){
		ret=(ret+dp[a][i][j])%mod;
	}
	printf("%d\n",ret);
}

5: (21:36)

#include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;
int c[1100][1100];
int bfs[1100][1100];
int dx[2][6]={{-1,0,1,1,0,-1},{0,1,1,0,-1,-1}};
int dy[2][6]={{0,1,0,-1,-1,-1},{1,1,0,-1,0,1}};
int main(){
	int a,b;scanf("%d%d",&a,&b);
	for(int i=0;i<b;i++)for(int j=0;j<a;j++){
		scanf("%d",&c[i+1][j+1]);
	}
	queue<pair<int,int> > Q;
	Q.push(make_pair(0,0));
	while(Q.size()){
		int row=Q.front().first;
		int col=Q.front().second;
		Q.pop();
		for(int i=0;i<6;i++){
			int tr=row+dx[row%2][i];
			int tc=col+dy[row%2][i];
			if(tr<0||tc<0||tr>=b+2||tc>=a+2)continue;
			if(c[tr][tc])continue;
			if(bfs[tr][tc])continue;
			bfs[tr][tc]=1;
			Q.push(make_pair(tr,tc));
		}
	}
	//for(int i=1;i<=b;i++){
	//	for(int j=1;j<=a;j++)printf("%d ",bfs[i][j]);
	//	printf("\n");
	//}
	int ret=0;
	for(int i=1;i<=b;i++){
		for(int j=1;j<=a;j++){
			if(!c[i][j])continue;
			for(int k=0;k<6;k++){
				int tr=i+dx[i%2][k];
				int tc=j+dy[i%2][k];
				if(bfs[tr][tc])ret++;
			}
		}
	}
	printf("%d\n",ret);
}

6: (40:16) +2 MLE

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
char A[1100];
char B[1100];
int mod=10000;
short int dp[2][520][3][11][11];
char tc[1100];
int c;
int calc(){
	int n=strlen(tc);
	for(int i=0;i<2;i++)for(int j=0;j<520;j++)for(int k=0;k<3;k++)
		for(int l=0;l<11;l++)for(int m=0;m<11;m++)
			dp[i][j][k][l][m]=0;
	dp[0][0][1][10][10]=1;
	int ret=0;
	for(int i=0;i<n;i++){
		int t=i%2;
		for(int j=0;j<520;j++)for(int k=0;k<3;k++)
		for(int l=0;l<11;l++)for(int m=0;m<11;m++)
			dp[!t][j][k][l][m]=0;
		for(int j=0;j<c;j++){
			for(int k=0;k<3;k++)for(int l=0;l<11;l++)for(int m=0;m<11;m++){
				if(!dp[t][j][k][l][m])continue;
				for(int n=0;n<10;n++){
					if(i==0&&n==0)continue;
					if(m==n)continue;
					int tm=(j*10+n)%c;
					int tk=k;
					if(tk==1&&n<tc[i]-'0')tk=0;
					if(tk==1&&n>tc[i]-'0')tk=2;
					if(l<10&&m<10&&(l-m)*(n-m)<=0)continue;
					dp[!t][tm][tk][m][n]=(dp[!t][tm][tk][m][n]+dp[t][j][k][l][m])%mod;
				}
			}
		}
		for(int j=0;j<3;j++){
			for(int k=0;k<11;k++)for(int l=0;l<11;l++){
				if(i+1==n&&j==2)continue;
				ret=(ret+dp[!t][0][j][k][l])%mod;
			}
		}
	}
	return ret;
}
int main(){
	scanf("%s%s",A,B);
	scanf("%d",&c);
	for(int i=0;i<1100;i++)tc[i]=B[i];
	int ret=calc();
	for(int i=0;i<1100;i++)tc[i]=A[i];
	ret=(ret+mod-calc())%mod;
	int now=0;
	bool ok=true;
	for(int i=0;A[i];i++){
		now*=10;
		now+=A[i]-'0';
		now%=c;
		if(i>=1&&A[i]==A[i-1])ok=false;
		if(i>=2&&(A[i]-A[i-1])*(A[i-2]-A[i-1])<=0){
			ok=false;
		}
	}
	if(ok&&now==0)ret=(ret+1)%mod;
	printf("%d\n",ret);
}