现在的位置: 首页 > 综合 > 正文

zoj 3540 Adding New Machine

2012年11月28日 ⁄ 综合 ⁄ 共 1897字 ⁄ 字号 评论关闭

=。=!

全STL搞的。。

离散化后扫描线+Set..

#include <iostream>
#include <set>
#include <stdio.h>
#include <algorithm>

using namespace std;
#define mp(a,b) make_pair(a,b)

typedef long long LL;

const int MAXN = 100010;
struct Edge{
	int h,l;
	int flag;
	friend bool operator < (const Edge &now,const Edge &other){
		if(now.flag!=other.flag)
			return now.flag > other.flag;
		else
			return now.l < other.l;
	}
};

int R[MAXN][4];
int X[MAXN];
int w,h,n,m;
set<Edge> S[MAXN];
set<Edge>::iterator it;
set<pair<int,int> > line;
set<pair<int,int> >::iterator its;
void getData(){
	int i,j;
	for(i=0;i<n;i++)
		for(j=0;j<4;j++)
			scanf("%d",&R[i][j]);
}

LL run(){
	int i,j,idx;
	int ncnt=0;
	Edge now;
	for(i=0;i<n;i++){
		X[ncnt++] = R[i][0];
		X[ncnt++] = R[i][2];
	}
	X[ncnt++] = 1;
	X[ncnt++] = w;
	sort(X,X+ncnt);
	ncnt = unique(X,X+ncnt)-X;
	for(i=0;i<ncnt;i++ ) S[i].clear();
	for(i=0;i<n;i++){
		now.l = R[i][1];
		now.h = R[i][3];
		idx = lower_bound(X,X+ncnt,R[i][0]) - X;
		now.flag = 1;
		S[idx].insert(now);
		idx = lower_bound(X,X+ncnt,R[i][2]) - X;
		now.flag = -1;
		S[idx].insert(now);
	}
	line.clear();
	line.insert(mp(0,0));
	line.insert(mp(h+1,h+1));
	LL px = 1;
	LL base = h-m+1,sum=0,ll,hh,ts,wi,len;
	for(i=0;i<ncnt;i++){
		wi = X[i] - px - 1;//间隔
		px = X[i];
		if(wi>0)
			sum += wi*base;
		//bool mark = true;
		len = base;
		for(it=S[i].begin(); it != S[i].end(); it ++){
			now = *it;
			if(now.flag==1){//add edge
				line.insert(mp(now.l,now.h));
				its = line.find(mp(now.l,now.h));
				its --;
				ll = (*its).second;
				its ++; its ++;
				hh = (*its).first;
				ts = hh-ll-1;
				if(ts >= m){
					base -= (ts-m+1);
					ts = now.l - ll -1;
					if(ts >= m)
						base += (ts-m+1);
					ts = hh - now.h - 1;
					if(ts >= m)
						base += (ts-m+1);
				}
				len = base;
			} else {
				its = line.find(mp(now.l,now.h));
				its --;
				ll = (*its).second;
				its ++; its ++;
				hh = (*its).first;
				ts = hh-ll-1;
				if(ts >= m){
					base += (ts-m+1);
					ts = now.l - ll -1;
					if(ts >= m)
						base -= (ts-m+1);
					ts = hh - now.h - 1;
					if(ts >= m)
						base -= (ts-m+1);
				}
				line.erase(mp(now.l,now.h));
			}
		}
		sum += len;
	}
	return sum;
}

void rotate(){
	int i;
	swap(w,h);
	for(i=0;i<n;i++){
		swap(R[i][0],R[i][1]);
		swap(R[i][2],R[i][3]);
	}
}

int main(){
	while(scanf("%d%d%d%d",&w,&h,&n,&m)!=EOF){
		getData();
		LL ans = run();
		if(m!=1){
			rotate();
			ans += run();
		}
		printf("%lld\n",ans);
	}
	return 0;
}
/*
3 3 3 2
2 2 2 2
3 1 3 1
3 2 3 2
*/

抱歉!评论已关闭.