扫描线求调
  • 板块学术版
  • 楼主KidA
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/1/21 20:17
  • 上次更新2024/1/21 22:53:53
查看原帖
扫描线求调
542221
KidA楼主2024/1/21 20:17

P5490。样例没过求调 qwq

#include<bits/stdc++.h>
#define o(x) (x<<1-1)
#define p(x) (x<<1)
#define q(x) (x<<1+1)
using namespace std;

int n;
const int N=1e5+31;
map<double,int> val;
double raw[N<<1];
struct node{ double x,y,z; int k; }a[N<<1];
struct segment_tree{ int l,r,cnt; double len; }t[N<<3];
bool cmp(node u,node v){ return u.x<v.x; }

void bld(int x,int l,int r){
	t[x].l=l,t[x].r=r,t[x].cnt=t[x].len=0;
	if(l==r) return;
	int mid=(t[x].l+t[x].r)>>1;
	bld(p(x),l,mid),bld(q(x),mid+1,r);
}
void upd(int x,int l,int r,double v){
	if(l<=t[x].l&&t[x].r<=r)
		return t[x].len=((t[x].cnt+=v)?raw[t[x].r+1]-raw[t[x].l]:(t[x].l==t[x].r?0:t[p(x)].len+t[q(x)].len)),void();
	int mid=(t[x].l+t[x].r)>>1;
	if(l<=mid) upd(p(x),l,r,v);
	if(r>mid) upd(q(x),l,r,v);
	t[x].len=(t[x].cnt?raw[t[x].r+1]-raw[t[x].l]:t[p(x)].len+t[q(x)].len);
}

int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		double yy,zz;
		cin>>a[o(i)].x>>yy>>a[p(i)].x>>zz,
		raw[o(i)]=a[o(i)].y=a[p(i)].y=yy;
		raw[p(i)]=a[o(i)].z=a[p(i)].z=zz;
		a[o(i)].k=1,a[p(i)].k=-1;
	}
	n<<=1;
	sort(raw+1,raw+n+1);
	int m=unique(raw+1,raw+n+1)-raw-1;
	for(int i=1;i<=m;i++) val[raw[i]]=i;
	sort(a+1,a+n+1,cmp),bld(1,1,m-1);
	double ans=0;
	for(int i=1;i<n;i++){
		upd(1,val[a[i].y],val[a[i].z]-1,a[i].k);
		ans+=t[1].len*(a[i+1].x-a[i].x);
	}
	cout<<ans;
	return 0;
}
2024/1/21 20:17
加载中...