JOI2016 予選

最後のJOI予選、やるだけセットやったのに誤読で時間消費してデバッグギリギリ間に合わんかった。
しかもバグは2箇所!が|になってただけ。クソクソクソクソ。死にたい。
f:id:okuraofvegetable:20151213234736p:plain
本選、春まで死ぬ気で問題解きまくる。
予選満点ちゃうかっても代表にはなったるからな。

1
int main(){
	vector<int> a(4),b(2);
	for(int i=0;i<4;i++)scanf("%d",&a[i]);
	for(int i=0;i<2;i++)scanf("%d",&b[i]);
	sort(all(a),greater<int>());
	sort(all(b),greater<int>());
	int ans = 0;
	for(int i=0;i<3;i++)ans += a[i];
	ans += b[0];
	printf("%d\n",ans);
	return 0;
}
2
int N,M;
int A[105];
int main(){
	scanf("%d %d",&N,&M);
	for(int i=0;i<N;i++)scanf("%d",&A[i]);
	for(int i=1;i<=M;i++){
		for(int j=0;j<N-1;j++){
			if(A[j]%i>A[j+1]%i)swap(A[j],A[j+1]);
		}
	}
	for(int i=0;i<N;i++)printf("%d\n",A[i]);
	return 0;
}
3
int N,M;
string s[55];
int culc(int u,int d){
	int res = 0;
	for(int i=0;i<N;i++){
		for(int j=0;j<M;j++){
			if(i<=u&&s[i][j]!='W')res++;
			if(i>u&&i<=d&&s[i][j]!='B')res++;
			if(i>d&&s[i][j]!='R')res++;
		}
	}
	return res;
}
int main(){
	scanf("%d %d",&N,&M);
	for(int i=0;i<N;i++)cin >> s[i];
	int ans = INF;
	for(int i=0;i<N-2;i++){
		for(int j=i+1;j<N-1;j++){
			ans = min(ans,culc(i,j));
		}
	}
	printf("%d\n",ans);
	return 0;
}
4
int N,Q,D[100100],X[1010];
ll T,A[100100];
int east[100100],west[100100];
int main(){
	scanf("%d %lld %d",&N,&T,&Q);
	memset(east,-1,sizeof(east));
	memset(west,-1,sizeof(west));
	for(int i=0;i<N;i++){
		scanf("%lld %d",&A[i],&D[i]);
		if(D[i]==1)east[i]=i;
		else west[i]=i;
	}
	for(int i=1;i<N;i++)east[i]=(east[i]==-1)?east[i-1]:east[i];
	for(int i=N-2;i>=0;i--)west[i]=(west[i]==-1)?west[i+1]:west[i];
	//for(int i=0;i<N;i++)printf("%d%c",east[i],(i==N-1)?'\n':' ');
	//for(int i=0;i<N;i++)printf("%d%c",west[i],(i==N-1)?'\n':' ');
	for(int i=0;i<Q;i++){
		scanf("%d",&X[i]);
		X[i]--;
	}
	for(int i=0;i<Q;i++){
		if(D[X[i]]==1){
			int a = west[X[i]];
			if(a==-1){
				printf("%lld\n",A[X[i]]+T);
				continue;
			}
			int b = east[a];
			ll crash = A[a]/2ll+A[b]/2ll;
			printf("%lld\n",min(A[X[i]]+T,crash));
		}else{
			int a = east[X[i]];
			if(a==-1){
				printf("%lld\n",A[X[i]]-T);
				continue;
			}
			int b = west[a];
			ll crash = A[a]/2ll+A[b]/2ll;
			printf("%lld\n",max(A[X[i]]-T,crash));
		}
	}
	return 0;
}
5
int N,M,K,S;
ll p,q;
int C[100100];
vector<int> g[100100];
struct edge{
	int to;
	ll cost;
	edge(int to,ll cost):to(to),cost(cost){}
};
vector<edge> G[100100];
int a[200100],b[200100];
ll d[100100];
void dijkstra(){
	for(int i=0;i<N;i++)d[i]=INF;
	priority_queue<P,vector<P>,greater<P> > q;
	for(int i=0;i<K;i++){
		d[C[i]]=0;
		q.push(P(0,C[i]));
	}
	while(!q.empty()){
		P a = q.top();
		q.pop();
		int v = a.sec;
		if(d[v]<a.fi)continue;
		for(int i=0;i<g[v].size();i++){
			int to = g[v][i];
			if(d[to]>d[v]+1){
				d[to]=d[v]+1;
				q.push(P(d[to],to));
			}
		}
	}
	/*for(int i=0;i<N;i++)printf("%d ",d[i]);
	printf("\n");*/
}
ll D[100100];
void dijkstra2(){
	for(int i=0;i<N;i++)D[i]=LLINF;
	priority_queue<P,vector<P>,greater<P> > Q;
	Q.push(P(0ll,0));
	D[0]=0ll;
	while(!Q.empty()){
		P a = Q.top();
		Q.pop();
		int v = a.sec;
		if(D[v]<a.fi)continue;
		for(int i=0;i<G[v].size();i++){
			edge e = G[v][i];
			if(D[e.to]>D[v]+e.cost){
				D[e.to]=D[v]+e.cost;
				Q.push(P(D[e.to],e.to));
			}
		}
	}
}
int main(){
	scanf("%d %d %d %d",&N,&M,&K,&S);
	scanf("%lld %lld",&p,&q);
	for(int i=0;i<K;i++){
		scanf("%d",&C[i]);
		C[i]--;
	}
	for(int i=0;i<M;i++){
		scanf("%d %d",&a[i],&b[i]);
		a[i]--;b[i]--;
		g[a[i]].pb(b[i]);
		g[b[i]].pb(a[i]);
	}
	dijkstra();
	for(int i=0;i<M;i++){
		if(d[a[i]]==0||d[b[i]]==0)continue;
		if(d[a[i]]<=S)G[b[i]].pb(edge(a[i],q));
		else G[b[i]].pb(edge(a[i],p));
		if(b[i]==N-1)G[a[i]].pb(edge(b[i],0ll));
		else if(d[b[i]]<=S)G[a[i]].pb(edge(b[i],q));
		else G[a[i]].pb(edge(b[i],p));
	}
	dijkstra2();
	printf("%lld\n",D[N-1]);
	return 0;
}
6
int H,W;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int dp[1050][1050][32];
int f[1050][1050];
int cost(int i,int j,int k,int m){
	int c = 0;
	if(!(k&16))c+=f[i][j];
	if(m!=0)c+=f[i][j+1];
	if(m!=1)c+=f[i+1][j];
	if(m!=2&&!(k&2))c+=f[i][j-1];
	if(m!=3&&!(k&4))c+=f[i-1][j];
	return c;
}
int moved(int k,int m){
	int nk = 0;
	if(k&1)nk|=2;
	nk|=4;
	if(m!=0)nk|=8;
	if(m!=1)nk|=16;
	return nk;
}
int mover(int k,int m){
	int nk = 0;
	if(k&8)nk|=4;
	nk|=2;
	if(m!=1)nk|=1;
	if(m!=0)nk|=16;
	return nk;
}
int main(){
	scanf("%d %d",&H,&W);
	for(int i=0;i<H;i++){
		string s;
		cin >> s;
		for(int j=0;j<W;j++){
			if(s[j]=='.')f[i+1][j+1]=0;
			else f[i+1][j+1]=(int)(s[j]-'0');
		}
	}
	for(int i=1;i<=H;i++)for(int j=1;j<=W;j++)for(int k=0;k<32;k++)dp[i][j][k]=INF;
	dp[1][1][0]=0;
	for(int i=1;i<=H;i++){
		for(int j=1;j<=W;j++){
			//printf("%d %d : ",i,j);
			for(int k=0;k<32;k++){
				if(dp[i][j][k]==INF)continue;
				//printf("%d ",dp[i][j][k]);
				for(int m=0;m<4;m++){
					int c = cost(i,j,k,m);
					int dk = moved(k,m);
					int rk = mover(k,m);
					//if(i==1)printf("%d %d %d\n",c,dk,rk);
					dp[i+1][j][dk]=min(dp[i+1][j][dk],dp[i][j][k]+c);
					dp[i][j+1][rk]=min(dp[i][j+1][rk],dp[i][j][k]+c);
				}
			}
			//printf("\n");	
		}
	}
	int ans = INF;
	for(int i=0;i<32;i++)ans=min(ans,dp[H][W][i]);
	printf("%d\n",ans);
	return 0;
}