WA 0 求调
查看原帖
WA 0 求调
444707
Alphys楼主2023/7/4 19:19

没加离散化之前可以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;
}

求助

2023/7/4 19:19
加载中...