扫描线模板全WA求助
查看原帖
扫描线模板全WA求助
239358
Velix楼主2020/8/1 21:17

样例过了,但一提交上去就惨不忍睹……

代码:

#include<bits/stdc++.h>
using namespace std;
int n,lx[1000001],ly[1000001],lxs,lys;
long long ans;
struct tree{
	int l,r,m;
	int cnt,len;
	#define l(x) seg[x].l
	#define r(x) seg[x].r
	#define m(x) seg[x].m
	#define cnt(x) seg[x].cnt
	#define len(x) seg[x].len
}seg[1000001];
struct q{int x1,x2,y,num;}raw[1000001];
bool o(q x,q y){return x.y<y.y;}
void build(int x,int l,int r)
{
	//cout<<x<<' '<<l<<' '<<r<<endl;
	if(r-l==1)return;
	l(x)=x*2;r(x)=x*2+1;m(x)=(l+r)/2;
	build(l(x),l,m(x));
	build(r(x),m(x),r);
}
void insert(int x,int l,int r,int L,int R,int num)
{
	//cout<<x<<' '<<l<<' '<<r<<' '<<L<<' '<<R<<' '<<num<<endl;
	if(l==L&&R==r) cnt(x)+=num;
	else if(R<=m(x)&&l(x)) insert(l(x),l,m(x),L,R,num);
	else if(L>=m(x)&&r(x)) insert(r(x),m(x),r,L,R,num);
	else if(r-l!=1)
	{
		insert(l(x),l,m(x),L,m(x),num);
		insert(r(x),m(x),r,m(x),R,num);
	}
	if(cnt(x)>0)len(x)=lx[r]-lx[l];
	else len(x)=len(l(x))+len(r(x));
}
int main()
{
	int x1,x2,y1,y2,x=1;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
		 lx[i*2-1]=x1;lx[i*2]=x2;
		 ly[i*2-1]=y1;ly[i*2]=y2;
		 raw[i*2-1]={x1,x2,y1,1};
		 raw[i*2]={x1,x2,y2,-1};
	}
	sort(lx+1,lx+n*2+1);
	lxs=unique(lx+1,lx+n*2+1)-lx-1;
	sort(ly+1,ly+n*2+1);
	lys=unique(ly+1,ly+n*2+1)-ly-1;
	for(int i=1;i<=2*n;i++)
	{
		raw[i].x1=lower_bound(lx+1,lx+lxs+1,raw[i].x1)-lx;
		raw[i].x2=lower_bound(lx+1,lx+lxs+1,raw[i].x2)-lx;
		raw[i].y=lower_bound(ly+1,ly+lys+1,raw[i].y)-ly;
	}
	sort(raw+1,raw+2*n+1,o);
	//for(int i=1;i<=lxs;i++)cout<<lx[i]<<' ';
	//cout<<endl;
	//for(int i=1;i<=lys;i++)cout<<ly[i]<<' ';
	//cout<<endl;
	//for(int i=1;i<=2*n;i++)
		//cout<<raw[i].x1<<' '<<raw[i].x2<<' '<<raw[i].y<<' '<<raw[i].num<<endl;
	build(1,1,2*n);
	while(x<2*n)
	{
		do
		{
		//cout<<x<<endl;
			insert(1,1,n*2,raw[x].x1,raw[x].x2,raw[x].num);
			x++;
		}while(raw[x].y==raw[x+1].y&&x<2*n);
		//cout<<len(1)*(ly[raw[x].y]-ly[raw[x-1].y])<<' '<<len(1)<<' '<<(ly[raw[x].y]-ly[raw[x-1].y])<<endl;
		ans+=len(1)*(ly[raw[x].y]-ly[raw[x-1].y]);
	}
	cout<<ans;
}

感觉自己的线段树写得比较玄学……

看记录输出十分玄学,甚至还有负数QAQ

2020/8/1 21:17
加载中...