Particle

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

AOJ 0509: Sheets

最大値の伝播で解くのは難しそうだったから、累積和で解きました。
少し枝刈りしましたが遅いです。

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

int g[10003][10003];
int n,r;

int main(){
	while(scanf("%d%d",&n,&r),n){
		memset(g,0,sizeof(g));
		int mx = 10001,Mx = 1,my = 10001,My = 1;
		for(int i = 0; i < n; i++){
			int a,b,c,d;
			scanf("%d%d%d%d",&a,&b,&c,&d);
			a++;b++;c++;d++;
			g[a][b]++; g[a][d]--;
			g[c][b]--; g[c][d]++;
			mx = min(mx,a);
			Mx = max(Mx,c);
			my = min(my,b);
			My = max(My,d);
		}
		
		for(int i = mx; i <= Mx; i++){
			int t = 0;
			for(int j = my; j <= My; j++){
				t += g[i][j];
				g[i][j] = t;
			}
		}
		
		int s = 0;
		for(int j = my; j <= My; j++){
			int t = 0;
			for(int i = mx; i <= Mx; i++){
				t += g[i][j];
				if(g[i][j] = t)s++;
			}
		}
		printf("%d\n",s);
		
		if(r==2){
			int l = 0;
			for(int i = mx; i <= Mx; i++){
				for(int j = my; j <= My; j++){
					if(g[i][j]){
						l += !g[i-1][j]+!g[i+1][j]+!g[i][j-1]+!g[i][j+1];
					}
				}
			}
			printf("%d\n",l);
		}
	}
	return 0;
}