tozangezan's diary

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

SRM 540 Div1

ゴミすぎ…

250: WolfSequence
最後のreturn文でオーバーフローする自分の屑さにあきれる

public class ImportantSequence{
	public int getCount(int[]a,String b){
		boolean ok=false;
		for(int i=0;i<b.length();i++)if(b.charAt(i)=='+')ok=true;
		if(!ok)return -1;
		long L[]=new long[a.length+1];
		long R[]=new long[a.length+1];
		L[a.length]=1;
		R[a.length]=100000000000000L;
		for(int i=a.length-1;i>=0;i--){
			if(b.charAt(i)=='+'){
				L[i]=Math.max(1,(long)a[i]-R[i+1]);
				R[i]=(long)a[i]-L[i+1];
			}else{
				L[i]=Math.max(1,L[i+1]+a[i]);
				R[i]=R[i+1]+a[i];
			}
			System.out.println(L[i]+" "+R[i]);
		}
		return Math.max(0,(int)R[0]-(int)L[0]+1);
//本当は return (int)Math.max(0,R[0]-L[0]+1); こうしないといけない
	}
}

550:WolfColoring
配る確率DPを芋酢法を使ってオーダー1つか2つか3つ削る。
書くの遅すぎ…なんとかならないの

public class RandomColoring{
	double sum[][][];int R,G,B;
	double dp[][][][];
	void set(int a){

		for(int i=0;i<=R;i++){
			for(int j=0;j<=G;j++){
				double S=0;
				for(int k=0;k<=B;k++){
					sum[i][j][k]=(S+=sum[i][j][k]);
				}
			}
			for(int j=0;j<=B;j++){
				double S=0;
				for(int k=0;k<=G;k++){
					sum[i][k][j]=(S+=sum[i][k][j]);
				}
			}
		}
		for(int i=0;i<=G;i++){
			for(int j=0;j<=B;j++){
				double S=0;
				for(int k=0;k<=R;k++)
					sum[k][i][j]=(S+=sum[k][i][j]);
			}
		}
}
	void add(int a,int b,int c,int d,int e,int f,double ADD){
		d++;e++;f++;
		double ret=0;
		sum[a][b][c]+=ADD;
		sum[a][b][f]-=ADD;
		sum[d][b][c]-=ADD;
		sum[a][e][c]-=ADD;
		sum[a][e][f]+=ADD;
		sum[d][e][c]+=ADD;
		sum[d][b][f]+=ADD;
		sum[d][e][f]-=ADD;
	//	return ret;
	}
	public double getProbability(int a,int r,int g,int b,int sr,int sg,int sb,int d,int e){
		R=r;G=g;B=b;d--;
		dp=new double[a][r][g][b];
		dp[0][sr][sg][sb]=1.0;
		sum=new double[r+1][g+1][b+1];
		//sum[sr+1][sg+1][sb+1]=1.0;
		for(int i=0;i<a-1;i++){
			//set(i-1);
			for(int j=0;j<r;j++){
				for(int k=0;k<g;k++){
					for(int l=0;l<b;l++){
						int masu=(Math.min(r-1,j+e)+1-Math.max(0,j-e))*(Math.min(g-1,k+e)+1-Math.max(0,k-e))*(Math.min(b-1,l+e)+1-Math.max(0,l-e));
						if(d>=0)masu-=(Math.min(r-1,j+d)+1-Math.max(0,j-d))*(Math.min(g-1,k+d)+1-Math.max(0,k-d))*(Math.min(b-1,l+d)+1-Math.max(0,l-d));;
						if(masu==0)continue;
					//	System.out.println(dp[i][j][k][l]+" "+masu);
						add(Math.max(0,j-e),Math.max(0,k-e),Math.max(0,l-e),Math.min(r-1,j+e),Math.min(g-1,k+e),Math.min(b-1,l+e),dp[i][j][k][l]/masu);
						if(d>=0)add(Math.max(0,j-d),Math.max(0,k-d),Math.max(0,l-d),Math.min(r-1,j+d),Math.min(g-1,k+d),Math.min(b-1,l+d),-dp[i][j][k][l]/masu);
					}
				}
			}
			set(i);
			for(int j=0;j<r;j++)
				for(int k=0;k<g;k++)
					for(int l=0;l<b;l++){
						dp[i+1][j][k][l]=sum[j][k][l];
						//System.out.println(j+" "+k+" "+l+" :"+dp[i+1][j][k][l]);

					}
			for(int j=0;j<=r;j++)
				for(int k=0;k<=g;k++)
					for(int l=0;l<=b;l++)sum[j][k][l]=0;
		}
		//set(a-1);
		double ret=0;
		for(int i=0;i<r;i++)
			for(int j=0;j<g;j++)
				for(int k=0;k<b;k++)
					if((d==-1||Math.abs(sr-i)>d||Math.abs(sg-j)>d||Math.abs(sb-k)>d)&&Math.abs(sr-i)<=e&&Math.abs(sg-j)<=e&&Math.abs(sb-k)<=e)ret+=dp[a-1][i][j][k];
		return 1.0-ret;
	}
}

950: Wolfなんとか
知らない

Challenge Phase:
答えが負の変な数になりそうなものを1つ落とす。

Systest:
落ちる

Result:
0 + 239.43 + 0 + 50 = 289.43 (55th)
Rating:
1835 -> 1959 (+124)

なんだかんだ言って初めての2桁順位でした。