求救!!
查看原帖
求救!!
436389
Vidoliga楼主2021/12/20 20:31

调了好久,全wa!

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const int N=1e5+20;
inline void swap(int &a,int &b){a^=b^=a^=b;}
inline int read(){
	register int d=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){d=(d<<1)+(d<<3)+(ch^48);ch=getchar();}
	return d*f;
}
inline int qpow(int a,int b,int p){
	int res=1;b%=p-1;
	while(b){
		if(b&1) res=1ll*res*a%p;
		a=1ll*a*a%p;
		b>>=1;
	}
	return res;
}
int n;
int lazy[N<<4];
double s[N<<4];
struct Node{
	double l,r,sum;
}tree[N<<4];
struct Point{
	double x,y1,y2;
	int flag;
}point[N<<4];
inline bool cmp(Point a,Point b){return a.x<b.x;}
inline void pushup(int rt){
	if(lazy[rt]>0) tree[rt].sum=tree[rt].r-tree[rt].l;
	else tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
}
void build(int rt,int l,int r){
	if(r-l<=1){
		tree[rt].l=s[l];tree[rt].r=s[r];
		tree[rt].sum=0;
		return ;
	}
	int mid=(l+r)>>1;
	tree[rt].l=s[l];tree[rt].r=s[r];
	build(rt<<1,l,mid);
	build(rt<<1|1,mid,r);
	pushup(rt);
}
void update(int rt,double y1,double y2,int flag){
	if(tree[rt].l==y1&&tree[rt].r==y2){
		lazy[rt]+=flag;
		pushup(rt);return ;
	}
	else{
		if(tree[rt<<1].r>y1) update(rt<<1,y1,min(tree[rt<<1].r,y2),flag);
		if(tree[rt<<1|1].l<y2) update(rt<<1|1,max(tree[rt<<1|1].l,y1),y2,flag);
		pushup(rt);
	}
}
signed main(){
	n=read();
	double x1,x2,y1,y2,ans=0;
	for(int i=0;i<n;i++){
		scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
		point[i].x=x1;point[i].y1=y1;point[i].y2=y2;point[i].flag=1;
		point[i+n].x=x2;point[i+n].y1=y1;point[i+n].y2=y2;point[i+n].flag=-1;
		s[i+1]=y1;s[i+n+1]=y2;
	}
	sort(s+1,s+(n<<1)+1);
	sort(point,point+(n<<1),cmp);
	build(1,1,(n<<1));
	memset(lazy,0,sizeof(lazy));
	update(1,point[0].y1,point[0].y2,point[0].flag);
	for(int i=1;i<(n<<1);i++){
		ans+=(point[i].x-point[i-1].x)*tree[1].sum;
		update(1,point[i].y1,point[i].y2,point[i].flag);
	}
	printf("%.0f\n",ans);
	return 0;
}

样例跑过去了

2021/12/20 20:31
加载中...