求助,WA20分
查看原帖
求助,WA20分
305891
Eraine楼主2022/2/15 18:58

看了讨论区,一大堆WA20的,我也20了……为什么……

根本找不到BUG啊?

太菜了……

#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#include<algorithm>
#define ll long long
using namespace std;
struct node{
	int l,r;
	ll h;
	int flag;
	friend bool operator<(node x,node y){
		return x.h<y.h;
	}
}edge[200005];
struct segTree{
	int l,r;
	int vis;
	int sum;
	int len;
}tree[800005];
int a[200005];
void build(int id,int l,int r){
	tree[id].l=l;
	tree[id].r=r;
	tree[id].len=a[r+1]-a[l];
	tree[id].vis=0;
	tree[id].sum=0;
	if(l==r)
		return;
	int mid,lc,rc;
	mid=(l+r)/2;
	lc=2*id,rc=2*id+1;
	build(lc,l,mid);
	build(rc,mid+1,r);
}
void pushup(int id){
	if(tree[id].vis)
		tree[id].sum=tree[id].len;
	else
		tree[id].sum=tree[2*id].sum+tree[2*id+1].sum;
}
void update(int id,int l,int r,int val){
	if(l<=tree[id].l&&r>=tree[id].r){
		tree[id].vis+=val;
		pushup(id);
		return;
	}
	int mid,lc,rc;
	mid=(tree[id].l+tree[id].r)/2;
	lc=2*id,rc=2*id+1;
	if(l<=mid)
		update(lc,l,r,val);
	if(r>mid)
		update(rc,l,r,val);
	pushup(id);
}
map<int,int>mp;
int main(){
	int n;
	scanf("%d",&n);
	int p=0,q=0;
	for(int i=1;i<=n;i++){
		int x1,y1,x2,y2;
		scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
		a[++p]=x1,a[++p]=x2;
		edge[++q]={x1,x2,y1,1},edge[++q]={x1,x2,y2,-1};
	}
	sort(a+1,a+p+1);
	sort(edge+1,edge+q+1);
	p=unique(a+1,a+p+1)-a;
	build(1,1,p-1);
	for(int i=1;i<=p;i++)
		mp[a[i]]=i;
	ll ans=0;
	for(int i=1;i<=q;i++){
		update(1,mp[edge[i].l],mp[edge[i].r]-1,edge[i].flag);
		if(edge[i+1].h!=edge[i].h)
			ans+=(ll)(tree[1].sum)*(ll)(edge[i+1].h-edge[i].h);
	}
	printf("%lld\n",ans);
	return 0; 
}
2022/2/15 18:58
加载中...