萌新18pts求调
查看原帖
萌新18pts求调
554644
汪汪队队长1楼主2024/11/25 07:02

rt,思路和题解不太一样,维护的最小值和最小值对应的长度。

#include<bits/stdc++.h>
#define int long long
#define mid ((l+r)>>1)
#define ls (p<<1)
#define rs (ls|1)
using namespace std;
const int N=1e5+10,M=998244353;
int n,z,ans,b[N<<1],la[N<<3];
struct op{
	int y,l,r,k;
	bool operator<(const op&a)const{
		return y<a.y;
	}
}q[N<<1];
struct node{
	int s,mn,mns;
}t[N<<3];
void up(int p){
	t[p].s=t[ls].s+t[rs].s;
	t[p].mn=min(t[ls].mn,t[rs].mn);
	t[p].mns=(t[ls].mn==t[p].mn)*t[ls].mns+(t[rs].mn==t[p].mn)*t[rs].mns;
}
void dd(int p,int d){
	la[p]+=d;
	if(!t[p].mn)
		t[p].s+=t[p].mns;
	t[p].mn+=d;
	if(!t[p].mn)
		t[p].s-=t[p].mns;
}
void down(int p){
	if(la[p])
		dd(ls,la[p]),
		dd(rs,la[p]),
		la[p]=0;
}
void add(int p,int l,int r,int x,int y,int d){
	if(x<=l&&r<=y)
		return dd(p,d);
	down(p);
	if(x<=mid)
		add(ls,l,mid,x,y,d);
	if(y>mid)
		add(rs,mid+1,r,x,y,d);
	up(p);
}
void build(int p,int l,int r){
	if(l==r){
		t[p].mn=0;
		t[p].mns=b[l]-b[l-1];
		return;
	}
	build(ls,l,mid);
	build(rs,mid+1,r);
	up(p);
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
//	freopen("P5490_3.in","r",stdin);
	cin>>n;
	for(int i=1,xl,xr,yl,yr;i<=n;i++)
		cin>>xl>>yl>>xr>>yr,
		q[++z]={min(yl,yr),min(xl,xr),max(xl,xr),1},
		b[z]=min(xl,xr),
		q[++z]={max(yl,yr),min(xl,xr),max(xl,xr),-1},
		b[z]=max(xr,xl);
	n=z;
	sort(b+1,b+1+n);
	sort(q+1,q+1+n);
	z=unique(b+1,b+1+z)-b-1;
	build(1,1,n);
	q[n+1].y=q[n].y;
	for(int i=1;i<=z;i++){
		add(1,1,n,upper_bound(b+1,b+1+z,q[i].l)-b,lower_bound(b+1,b+1+z,q[i].r)-b,q[i].k);
		if(q[i+1].y!=q[i].y)
			ans+=t[1].s*(q[i+1].y-q[i].y);
	}
	cout<<ans;
	return 0;
}
2024/11/25 07:02
加载中...