社区讨论
求助(玄关)
P1856[IOI 1998 / USACO5.5] 矩形周长 Picture参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m4xsdcw4
- 此快照首次捕获于
- 2024/12/21 14:16 去年
- 此快照最后确认于
- 2025/11/04 12:33 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y,q;
bool p;
}h[2][100005];
bool cmp(node a,node b){
return a.q==b.q?a.p>b.p:a.q<b.q;
}
const int maxn=800000;
int n,l[maxn],ls[maxn],rs[maxn],c[maxn],mxr=10000,mxl=-10000,tot;
void f(int w){
if(!ls[w])ls[w]=++tot;
if(!rs[w])rs[w]=++tot;
int v=l[w];
c[ls[w]]+=v;
l[ls[w]]+=v;
c[rs[w]]+=v;
l[rs[w]]+=v;
l[w]=0;
}
void find(int w,int lc,int rc,int x,int y,int v){
if(x<=lc&&y>=rc){
c[w]+=v;
l[w]+=v;
return;
}
if(l[w]!=0)f(w);
int mid=(lc+rc)>>1;
if(x<mid){
if(!ls[w])ls[w]=++tot;
find(ls[w],lc,mid,x,y,v);
}
if(y>mid){
if(!rs[w])rs[w]=++tot;
find(rs[w],mid,rc,x,y,v);
}
}
int gs(int w,int lc,int rc){
if(rc-lc!=1||((!ls[w])&&(!rs[w])))return (c[w]>0)*(rc-lc);
if(l[w]!=0)f(w);
int mid=(lc+rc)>>1,tmp;
if(ls[w])tmp+=gs(ls[w],lc,mid);
if(rs[w])tmp+=gs(rs[w],mid,rc);
return tmp;
}
int main(){
int ans=0,a,b,c2,d,lt,o;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a>>b>>c2>>d;
h[0][2*i-1].p=h[1][2*i-1].p=false;
h[0][2*i].p=h[1][2*i].p=true;
h[0][2*i-1].x=h[0][2*i].x=a;
h[0][2*i-1].y=h[0][2*i].y=c2;
h[0][2*i].q=b;
h[0][2*i-1].q=d;
h[1][2*i-1].x=h[1][2*i].x=b;
h[1][2*i-1].y=h[1][2*i].y=d;
h[1][2*i].q=a;
h[1][2*i-1].q=c2;
}
n*=2;
sort(h[0]+1,h[0]+n+1,cmp);
sort(h[1]+1,h[1]+n+1,cmp);
for(int i=0;i<2;i++){
memset(ls,0,sizeof(ls));
memset(rs,0,sizeof(rs));
memset(c,0,sizeof(c));
memset(l,0,sizeof(l));
tot=1;
lt=0;
for(int j=1;j<=n;j++){
if(h[i][j].p)find(1,mxl,mxr,h[i][j].x,h[i][j].y,1);
else find(1,mxl,mxr,h[i][j].x,h[i][j].y,-1);
o=gs(1,mxl,mxr);
ans+=abs(o-lt);
lt=o;
}
}
cout<<ans;
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...