SRM 638

300: 例のアレ

{"YNY","YYY","YYY"}
{"YNY","YYY","YYY"} → "Possible"
{"YNY","YYY","YYY"}

やるだけ(ちゃんとサボらずやるということが本質)。

// I like wolves!!
#include <vector>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <queue>
#include <string.h>
#include <complex>
using namespace std;

class ShadowSculpture {
	public:
	int dx[6]={1,-1,0,0,0,0};
	int dy[6]={0,0,1,-1,0,0};
	int dz[6]={0,0,0,0,1,-1};
	int v[12][12][12];
	int w[12][12][12];
	
	string possible(vector <string> XY, vector <string> YZ, vector <string> ZX) {
		int n=XY.size();
		for(int i=0;i<n;i++)for(int j=0;j<n;j++)for(int k=0;k<n;k++)v[i][j][k]=1;
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				if(XY[i][j]=='N'){for(int k=0;k<n;k++)v[i][j][k]=0;}
				if(YZ[i][j]=='N'){for(int k=0;k<n;k++)v[k][i][j]=0;}
				if(ZX[i][j]=='N'){for(int k=0;k<n;k++)v[j][k][i]=0;}
			}
		}
		bool zentei=false;
		for(int i=0;i<n;i++)for(int j=0;j<n;j++){
			if(XY[i][j]=='Y')zentei=true;
			if(YZ[i][j]=='Y')zentei=true;
			if(ZX[i][j]=='Y')zentei=true;
			
		}
		if(!zentei)return "Possible";
		for(int i=0;i<n;i++)for(int j=0;j<n;j++)for(int k=0;k<n;k++){
			if(v[i][j][k]){
				for(int x=0;x<n;x++)for(int y=0;y<n;y++)for(int z=0;z<n;z++)w[x][y][z]=0;
				queue<pair<int,pair<int,int> > >Q;
				Q.push(make_pair(i,make_pair(j,k)));
				w[i][j][k]=1;
				while(Q.size()){
					int X=Q.front().first;
					int Y=Q.front().second.first;
					int Z=Q.front().second.second;
					Q.pop();
					for(int l=0;l<6;l++){
						int tx=X+dx[l];
						int ty=Y+dy[l];
						int tz=Z+dz[l];
						if(0<=tx&&tx<n&&0<=ty&&ty<n&&0<=tz&&tz<n&&!w[tx][ty][tz]&&v[tx][ty][tz]){
							w[tx][ty][tz]=1;
							Q.push(make_pair(tx,make_pair(ty,tz)));
						}
					}
				}
				bool ok=true;
				for(int p=0;p<n;p++)for(int q=0;q<n;q++){
					if(XY[p][q]=='Y'){
						bool OK=false;
						for(int k=0;k<n;k++)if(w[p][q][k])OK=true;
						if(!OK)ok=false;
					}if(YZ[p][q]=='Y'){
						bool OK=false;
						for(int k=0;k<n;k++)if(w[k][p][q])OK=true;
						if(!OK)ok=false;
					}if(ZX[p][q]=='Y'){
						bool OK=false;
						for(int k=0;k<n;k++)if(w[q][k][p])OK=true;
						if(!OK)ok=false;
					}
				}
				if(ok)return "Possible";
			}
		}
		return "Impossible";
	}
};

600: cgyさん渾身のオオカミ出題
ついにcgy回にwolfが出てきた。
やるだけ。450でも簡単すぎると思う。

// I like wolves!!
import java.util.*;
import java.util.regex.*;
import java.text.*;
import java.math.*;
import java.awt.geom.*;

public class NarrowPassage2{
	public int count(int[] a, int b){
		int n=a.length;
		long ret=1;
		int v[]=new int[n];
		long mod=1000000007;
		for(int i=0;i<n;i++){
			int at=0;
			int val=1010101010;
			for(int j=0;j<n;j++){
				if(v[j]==0&&val>a[j]){
					val=a[j];at=j;
				}
			}
			v[at]=1;
			int has=1;
			for(int j=at-1;j>=0;j--){
				if(v[j]==1)continue;
				if(a[j]+val>b){
					break;
				}
				has++;
			}
			for(int j=at+1;j<n;j++){
				if(v[j]==1)continue;
				if(a[j]+val>b)break;
				has++;
			}
			ret=ret*has%mod;
		}
		return (int)ret;
	}
}
//Powered by [KawigiEdit] 2.0!

800: 木
解法はそんなに難しくなさそうだけど大変そう。

Challenge Phase:
ひたすら落ちそうなものに{"YNY","YYY","YYY"}{"YNY","YYY","YYY"}{"YNY","YYY","YYY"}を
投げまくる。のにまだ落とし残しがたくさんあった。

266.12 + 531.60 + 0 + 425 = 1222.72 (2nd)
Rating: 2366 -> 2516

過去最高順位。変な回に限ってレートが上がる。