Particle

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

昨日のコードの修正

流石に遅すぎるので書き直した。採点したいけど、データが多すぎてどうすればちょっと困惑してる。スクリプトとか書けません。採点が終わったら、下の方に書いておきます

本選
2.
Bのi番目のカードから考えて得点が最大になるようにする。バグは取ったつもりだけど、まだ残ってたら恥ずかしい。O(n^2)だと思う。

int a,b,A[5000],B[5000],ans;

int f(int s){
	int k = 0;
	for(int i = s; i < b; i++){
		while(k<a && A[k] != B[i]) k++;
		if(k>=a) return i-s;
		k++;
	}
	return b-s;
}

int main(){
	scanf("%d %d",&a,&b);
	for(int i = 0; i < a; i++) scanf("%d",&A[i]);
	for(int i = 0; i < b; i++) scanf("%d",&B[i]);

	for(int i = 0; i < b; i++){
		ans = max(ans,f(i));
	}
	printf("%d",ans);
	return 0;
}

4.
点だけ記録しておいて、最後にO(n^2)で塗りつぶす。よく分からないけどメモリの使いすぎ?メモリで落ちるのでダメらしい。メモリ確保ミスでした

int n,m,tr[3001][3001],y,x,s,ans;//tr[5001][5001]にする

int main(){
	cin>>n>>m;
	for(int i = 0; i < m; i++){
		scanf("%d %d %d",&x,&y,&s);
		tr[x][y] = s+1;
	}
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= i; j++){
			tr[i][j] = max(tr[i][j],max(tr[i-1][j],tr[i-1][j-1])-1);
		}
	}
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= i; j++){
			if(tr[i][j])ans++;
		}
	}
	cout<<ans;
	return 0;
}

点数(配点は推測)
1.100点
2.100点
3.10点 -> 100点
4.20点 -> 100点
5.0点
240点取っても意味ないですが、240点取っておきたかったです
240点超えました。

追記
3も解けましたが、ちょっと直すだけでした。