0ptsMLE求条
查看原帖
0ptsMLE求条
1632799
QuakeHearts楼主2025/2/1 20:27
#include<bits/stdc++.h>

#define int long long
#define itn int
#define N 1000010
#define ret return

using namespace std;

inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-')	f=-1;
		ch=getchar();
	}
	while(isdigit(ch)){
		x=(x<<3)+(x<<1)+ch-'0';
		ch=getchar();
	}
	return x*f;
}

itn n,val[N],rk[N],cnt,ans;
struct edge{
	int x,y1,y2,k;
}e[N<<1];
struct node{
	itn cnt,len;
}tr[N<<3];

void pushup(itn l,int r,int p){
	if(tr[p].cnt)tr[p].len=val[r+1]-val[l];
	else tr[p].len=tr[p<<1].len+tr[p<<1|1].len;
}
#define mid ((l+r)<<1)
void ins(int wl,int wr,int l,int r,int p,int k){
	if(wl<=l&&r<=wr) return tr[p].cnt+=k,pushup(l,r,p),void();
	if(wl<=mid)ins(wl,wr,l,mid,p<<1,k);
	if(wr>mid)ins(wl,wr,mid+1,r,p<<1|1,k);
	pushup(l,r,p);
}
bool cmp(edge a,edge b){
	return (a.x!=b.x) ? a.x<b.x:a.k>b.k;
}
signed main(){
	n=read();
	for (int i=1,xa,xb,ya,yb;i<=n;++i){
		xa=read(),ya=read(),xb=read(),yb=read();
		e[(i<<1)-1]={xa,ya,yb,1};
		e[(i<<1)]={xb,ya,yb,-1};
		rk[++cnt]=ya;
		rk[++cnt]=yb;
	}
	n<<=1;
	sort(rk+1,rk+n+1);
	cnt=unique(rk+1,rk+n+1)-rk-1;
	for (int i=1;i<n;++i){
		int ya=lower_bound(rk+1,rk+n+1,e[i].y1)-rk;
		int yb=lower_bound(rk+1,rk+n+1,e[i].y2)-rk;
		val[ya]=e[i].y1;
		val[yb]=e[i].y2;
		e[i].y1=ya;
		e[i].y2=yb;
	}
	sort(e+1,e+n+1,cmp);
	for (int i=1;i<n;++i){
		ins(e[i].y1,e[i].y2-1,1,n,1,e[i].k);
		ans+=tr[1].len*(e[i+1].x-e[i].x);
	}
	cout << ans;
	return 0;
}

貌似是这里有问题

for (int i=1;i<n;++i){
		ins(e[i].y1,e[i].y2-1,1,n,1,e[i].k);
		ans+=tr[1].len*(e[i+1].x-e[i].x);
}
2025/2/1 20:27
加载中...