Particle

競技プログラミングについての雑記

SRM 539Div2

Div1は550を誰かが解かないとノーコン(Div1)になるらしいです(2012/04/15 15:01)
問題見てみたいけど、Div2だと見れないみたいです。practiceに入りました。


Easy(174.03 / 250)
遺伝子の情報が与えられて、1つの家族として考えられるものの中で、最も人数の多いものを求める。

全探索すれば良い O(n^4)

class PlatypusPaternity{
	vector<string> f,m,s;
	int flen,mlen,slen,clen;
public:
	int solve(int a,int b){
		int ans = 0;
		vector<int> c(clen);
		for(int i = 0; i < clen; i++){
			c[i] = f[a][i] == 'Y' && m[b][i] == 'Y';
		}
		for(int i = 0; i < slen; i++){
			int res = 0;
			for(int j = 0; j < clen; j++){
				if(!c[j] && s[i][j] == 'Y'){
					res = 0;
					break;
				}
				if(c[j] && s[i][j] == 'Y')res++;
			}
			ans = max(ans,res);
		}
		return ans?ans+2:0;
	}
	
	int maxFamily(vector <string> femaleCompatibility, vector <string> maleCompatibility, vector <string> siblingGroups) {
		f = femaleCompatibility; m = maleCompatibility; s = siblingGroups;
		flen = f.size(); mlen = m.size(); slen = s.size(); clen = f[0].size();
		int ans = 0;
		for(int i = 0; i < flen; i++){
			for(int j = 0; j < mlen; j++){
				ans = max(ans,solve(i,j));
			}
		}
		return ans;
 	}
};

Medium(248.09 / 500)
デバッグに20分くらい使いました…。手元で実行したときのバグは取れませんでしたが、Arenaの方でtestしたら大丈夫だったから、そのまま投げました。
コードが少し冗長ですが、デバッグしてたらこうなってました。

a以上a+k以下の範囲が解に含まれる場所である場合
dp[a] = k+1
として、後で
dp[i] = max(dp[i],dp[i-1]-1)
とするとO(n)で数えることができます。2012年のJOI本戦にも同じ考え方で解ける問題があります。(因みに、その問題の他の解法をこの問題に使うこともできます)
いもす法で解いたと言ったが、いもす法では無かったかもしれない。
解いてないから分かりませんが、segtreeでも解けそうです。

int dp[16000000];

class Over9000Rocks{
public:
	int countPossibilities(vector <int> low, vector <int> up) {
		int len = low.size(),res = 0;
		for(int i = 1; i < (1<<len); i++){
			int l=0,u=0;
			for(int j = 0; j < len; j++){
				if(i&(1<<j)){
					l += low[j];
					u += up[j];
				}
			}
			l = max(l,9001);
			if(u>=l)dp[l] = max(dp[l],u-l+1);
		}
		
		for(int i = 9001; i < 16000000; i++){
				dp[i+1] = max(dp[i+1],dp[i]-1);
		}
		for(int i = 9001; i < 16000000; i++){
			if(dp[i]){
				res++;
				//cout<<i<<endl;
			}
		}
		return res;
 	}
};

Hard(Failed System Test / 1000)
Hardは初submit

全部'O'か全部'X'になるときだけ奇数になりそうだったから、それを実装したらWAでした。
そもそも嘘解法かもしれないし、問題を勘違いしていたり、見落としてることがあるかもしれない。

正解コードを見てもよく分からない…










3回challengeして1回だけ撃墜(TLE)できました。マイナスにならなくて良かった。
部屋内で自分以外はMediumを間違えてるのが分かっていたから、もう少し頑張りたかったです。

Score 422.12
Rating 1086 -> 1192