记录编号 |
156064 |
评测结果 |
AAAAA |
题目名称 |
[IOI 1998] 矩形周长 |
最终得分 |
100 |
用户昵称 |
天一阁 |
是否通过 |
通过 |
代码语言 |
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;
}