没加离散化之前可以AC P8648 [蓝桥杯 2017 省 A] 油漆面积 也就是此题的弱化版
#include<bits/stdc++.h>
#define int long long
#define MAXN (int)(2e5+10)
using namespace std;
int ret,n,m,h[MAXN];
int x1[MAXN],x2[MAXN],Y1[MAXN],y2[MAXN];
pair<int,int>e[MAXN*2];
struct node{
int l,r,val,cov,tag;
}seg[MAXN*8];
int lst[MAXN*4];
int len(int x){
int r=lst[seg[x].r];
int l=lst[seg[x].l];
return r-l+1;
}
void pushup(int u){
seg[u].cov=min(seg[u*2].cov,seg[u*2+1].cov);
seg[u].val=(seg[u*2].cov>seg[u].cov?len(u*2):seg[u*2].val)+
(seg[u*2+1].cov>seg[u].cov?len(u*2+1):seg[u*2+1].val);
}
void pushdown(int u){
if(seg[u].tag){
seg[u*2].cov+=seg[u].tag;
seg[u*2].tag+=seg[u].tag;
seg[u*2+1].cov+=seg[u].tag;
seg[u*2+1].tag+=seg[u].tag;
seg[u].tag=0;
}
}
void update(int u,int l,int r,int x){
if(l<=seg[u].l&&seg[u].r<=r){
seg[u].cov+=x;
seg[u].tag+=x;
return;
}
pushdown(u);
int mid=(seg[u].l+seg[u].r)/2;
if(l<=mid)update(u*2,l,r,x);
if(r>mid)update(u*2+1,l,r,x);
pushup(u);
}
void build(int u,int l,int r){
seg[u].l=l,seg[u].r=r;
if(l==r)return;
int mid=(l+r)/2;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
}
int maxn=0,tot;
signed main(){
scanf("%lld", &n);
for(int i=1;i<=n;i++){
scanf("%lld%lld%lld%lld", &x1[i], &Y1[i], &x2[i], &y2[i]);
e[++m]=make_pair(x1[i],i);
e[++m]=make_pair(x2[i],-i);
}
for(int i=1;i<=n;i++){
lst[++tot]=Y1[i];
lst[++tot]=y2[i];
lst[++tot]=Y1[i]-1;
lst[++tot]=y2[i]-1;
}
sort(lst+1,lst+tot+1);
tot=unique(lst+1,lst+tot+1)-lst-1;
for(int i=1;i<=n;i++){
Y1[i]=lower_bound(lst,lst+tot+1,Y1[i])-lst;
y2[i]=lower_bound(lst,lst+tot+1,y2[i])-lst;
maxn=max(maxn,y2[i]);
}
build(1,0,maxn);
sort(e+1,e+m+1);
for(int j=1;j<=m;j++){
if(e[j].second>0){
int i=e[j].second;
update(1,Y1[i],y2[i]-1,1);
}
else {
int i=-e[j].second;
update(1,Y1[i],y2[i]-1,-1);
}
if(j<m)ret+=(e[j+1].first-e[j].first)*seg[1].val;
}
printf("%lld", ret);
return 0;
}
求助