记录编号 156064 评测结果 AAAAA
题目名称 [IOI 1998] 矩形周长 最终得分 100
用户昵称 Gravatar天一阁 是否通过 通过
代码语言 C++ 运行时间 0.026 s
提交时间 2015-04-01 20:10:23 内存使用 10.23 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

#define INF 10000
#define Maxn 200010
#define l(x) (x<<1)
#define r(x) (x<<1|1)

using namespace std;

struct node{
	int lx,rx,h,s;
	inline bool operator<(const node& a)const{
		if(h==a.h) return s>a.s;
		return h<a.h;
	}
}line[Maxn],cut[Maxn];

int sum[Maxn],n,tot=0,cov[Maxn],lbd[Maxn],rbd[Maxn];
int cnt[Maxn];

int Abs(int x){
	if(x<0) return -x;
	return x;
}

void update(int o,int l,int r){
	if(cov[o]) sum[o]=r-l+1;
	else if(l==r) sum[o]=0;
	else sum[o]=sum[l(o)]+sum[r(o)];
}

void change(int o,int l,int r,int ql,int qr,int qv){
	if(ql<=l&&r<=qr){
		cov[o]+=qv; update(o,l,r);
		return;
	}
	int mid=(l+r)>>1;
	if(ql<=mid) change(l(o),l,mid,ql,qr,qv);
	if(mid<qr) change(r(o),mid+1,r,ql,qr,qv);
	update(o,l,r);
}

int x0,x1,y0,y1,ans=0,tot0=0,last;

int main(){
	freopen("picture.in","r",stdin);
	freopen("picture.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d%d%d",&x0,&y0,&x1,&y1);
		line[++tot]=(node){x0,x1,y0,1};
		cut[tot]=(node){y0,y1,x0,1};
		line[++tot]=(node){x0,x1,y1,-1};
		cut[tot]=(node){y0,y1,x1,-1};
	}
	sort(line+1,line+tot+1);
	sort(cut+1,cut+tot+1);
	last=0;
	memset(cov,0,sizeof(cov));
	memset(sum,0,sizeof(sum));
	for(int i=1;i<=tot;i++){
		change(1,-INF,INF,line[i].lx,line[i].rx-1,line[i].s);
		ans+=Abs(sum[1]-last); last=sum[1];
	}
	memset(cov,0,sizeof(cov));
	memset(sum,0,sizeof(sum));
	last=0;
	for(int i=1;i<=tot;i++){
		change(1,-INF,INF,cut[i].lx,cut[i].rx-1,cut[i].s);
		ans+=Abs(sum[1]-last); last=sum[1];
	}
	printf("%d\n",ans);
	return 0;
}