P1856
本来MAXN应该是5005的,结果MLE,我为了验证把MAXN改成5怎么还是MLE,我这里也没用到动态的容器啊,这代码是怎么达到125Mb的
#include<bits/stdc++.h>
#define getmid int mid=(l+r)/2
#define lch (pos<<1)
#define rch (pos<<1|1)
const int MAXN=5;
using namespace std;
int n,cnt=0,num[MAXN<<3],tag[MAXN<<3],len[MAXN<<3],ans=0;
pair<bool,bool>iscvr[MAXN<<3];//iscover<l,r>
struct LINE{
int l,r,y,inout;
}line[MAXN<<1];
bool cmp(LINE x,LINE y){
return x.y<y.y;
}
inline void pushup(int pos,int l,int r){
if(tag[pos]){
iscvr[pos].first=iscvr[pos].second=1;
len[pos]=r-l+1;
num[pos]=1;
}
else if(l==r) len[pos]=num[pos]=iscvr[pos].first=iscvr[pos].second=0;
else{
iscvr[pos].first=iscvr[lch].first;
iscvr[pos].second=iscvr[rch].second;
len[pos]=len[lch]+len[rch];
num[pos]=num[lch]+num[rch];
if(iscvr[rch].first&&iscvr[lch].second) num[pos]-=1;
}
}
void update(int pos,int l,int r,int ll,int rr,int val){
if(r<ll || l>rr) return;
if(ll<=l && r<=rr){
tag[pos]+=val;
pushup(pos,l,r);
return;
}
getmid;
if(ll<=mid) update(lch,l,mid,ll,rr,val);
if(mid<rr) update(rch,mid+1,r,ll,rr,val);
pushup(pos,l,r);
}
int main(){
cin>>n;
int minx=1e4,maxx=-1e4,lastlen=0;
for(int i=1,xx1,xx2,yy1,yy2;i<=n;i++){
cin>>xx1>>yy1>>xx2>>yy2;
minx=min(minx,xx1);
maxx=max(maxx,xx2);
line[++cnt]={xx1,xx2,yy1,1};
line[++cnt]={xx1,xx2,yy2,-1};
}
sort(line+1,line+1+cnt,cmp);
line[0].y=0;
for(int i=1;i<=cnt;i++){
// if(line[i].l<line[i].r)
update(1,minx,maxx-1,line[i].l,line[i].r-1,line[i].inout);
// cout<<num[1]<<' '<<line[i+1].y<<' '<<line[i].y<<endl;
ans+=num[1]*2*(line[i+1].y-line[i].y);
// cout<<abs(len[1]-lastlen)<<endl;
ans+=abs(len[1]-lastlen);
lastlen=len[1];
}
cout<<ans<<endl;
return 0;
}