Particle

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

SRM541 Div2

9thでした。Hardが簡単めだったので、解きたかったです。

Easy(215.96/250)
わぁい撃墜 あかり撃墜大好き(Easyでは撃墜していません)
色々面倒なだけ。

class AkariDaisukiDiv2{
public:
	int countTuples(string s) {
		int len = s.size(),ans=0;
		for(int i = 1; i < len-1; i++){
			for(int j = i+2; j < len-1; j++){
				if(s[i]==s[j]){
					for(int k = 0; j+k<len-1 && i+k<j-1; k++){
						if(s[i+k]==s[j+k])ans++;
						else break;
					}
				}
			}
		}
		return ans;
 	}
};

Medium(293.28/500)
座標が半整数の点で衝突する場合があるので、座標を2倍しておく。
2倍しなくてもサンプル通るので、2倍してない(且つ、0.5の点での衝突を考慮してない)ソースは撃墜しておく。

const int INF = 1e7;

class AntsMeet{
public:
	int countAnts(vector <int> x, vector <int> y, string s) {
		int n = s.size(),ans = n;
		for(int i = 0; i < n; i++){
			x[i] <<= 1;
			y[i] <<= 1;
		}
		
		for(int i = 1; i <= 4000; i++){
			map<pair<int,int>,int> g;
			for(int j = 0; j < n; j++){
				if(x[j]==INF)continue;
				if(s[j]=='N'){
					++y[j];
				}
				if(s[j]=='S'){
					--y[j];
				}
				if(s[j]=='E'){
					++x[j];
				}
				if(s[j]=='W'){
					--x[j];
				}
				++g[make_pair(x[j],y[j])];
			}
			
			for(int j = 0; j < n; j++){
				if(g[make_pair(x[j],y[j])]>=2){
					ans--;
					x[j] = y[j] = INF;
				}
			}
		}
		
		return ans;
 	}
};

Hard(-/1000)
あからさまにNails
合ってるか分からないけど、submitしておけば良かった。間違ってました。(範囲を超えるのと、制約を読み間違えて縦と横の長さが等しいと勘違いしていたこと)

解法は合っていたので、解けなければならなかった。
正しいソース

short g1[3500][3500],g2[3500][3500];

class NonXorLife{
public:
	int countAliveCells(vector <string> s, int K) {
		int ans = 0;
		int len = s.size(),len2 = s[0].size();
		
		for(int i = 0; i < len; i++){
			for(int j = 0; j < len2; j++){
				if(s[i][j]=='o'){
					g1[i+K+1550][j+1550] = K+1;
					g2[i-K+1550][j+1550] = K+1;
				}
			}
		}
		
		for(int i = 3395; i; i--){
			for(int j = 1; j < 3395; j++){
				g1[i][j] = max(max((int)g1[i][j],(int)g1[i+1][j]-1),max((int)g1[i+1][j-1],(int)g1[i+1][j+1])-1);
			}
		}
		
		for(int i = 1; i < 3395; i++){
			for(int j = 1; j < 3395; j++){
				g2[i][j] = max(max((int)g2[i][j],(int)g2[i-1][j]-1),max((int)g2[i-1][j-1],(int)g2[i-1][j+1])-1);
			}
		}
		
		for(int i = 0; i <= 3395; i++){
			for(int j = 0; j <= 3395; j++){
				if(g1[i][j]||g2[i][j])ans++;
			}
		}
		
		return ans;
 	}
};


Score 709.24 (challenge:50*4)
Rating 1128 -> 1281