Particle

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

AOJ 0574: Nails

最大値の伝播です。正方形型にメモリを確保してしまうと、半分くらい無駄になってMLEしてしまうので、三角形にします。

(こんな感じに)

(-1, 0)
( 0, 0) ( 0, 1)
( 1, 0) ( 1, 1) ( 1, 2)
( 2, 0) ( 2, 1) ( 2, 2) ( 2, 3)
...

この図で、輪ゴムにかかる可能性があるマスは( 1, 1), ( 2, 1), ( 2, 2)で、見向きもされないマスは(-1, 0)です。また、( x, y)は0-indexedで( (x+1)(x+2)/2 + y )番目です。

#include <cstdio>
#include <algorithm>
using namespace std;

int m,n,tr[12512502],x,y,s,ans;//f(5000,5000) == 12512501

int f(int i, int j){
	return (i+1)*(i+2)/2+j;
}

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