社区讨论

李超线段树80pts求调

P4097【模板】李超线段树 / [HEOI2013] Segment参与者 3已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@m1yru6oz
此快照首次捕获于
2024/10/07 16:50
去年
此快照最后确认于
2025/11/04 17:42
4 个月前
查看原帖
C
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod1=39989;
const int mod2=1e9;
const int N=40000;
const double eps=1e-9;
struct line{
	double k,b;
};
double kth(double x0,double y0,double x1,double y1){
	if(fabs(x0-x1)<=eps)return 0;
	return (y0-y1)/(x0-x1);
}
double bth(double x0,double y0,double x1,double y1){
	if(fabs(x0-x1)<=eps)return max(y0,y1);
	return y0-x0*kth(x0,y0,x1,y1);
}
double get(double x,double k,double b){
	return k*x+b;
}
struct segtree{
	int sum[N<<2];
	line lazy[N<<2];
	bool used[N<<2];
	int check(int p,int l,int r,double k1,double b1,double k2,double b2){
		if(!used[p])return 1;
		if(l==r){
			if(get(l,k1,b1)-get(l,k2,b2)>eps)return 1;
			else return -1;
		}
		int l1=get(l,k1,b1);
		int r1=get(r,k1,b1);
		int l2=get(l,k2,b2);
		int r2=get(r,k2,b2);
		if(fabs(l1-l2)<=eps&&fabs(r1-r2)<=eps)return -1;
		if(l1-l2>eps&&r1-r2>eps)return 1;
		else if((l1-l2<-eps&&r1-r2>eps)||(l1-l2>eps&&r1-r2<-eps))return 0;
		else if((fabs(l1-l2)<=eps&&r1-r2>eps)||(l1-l2>eps&&fabs(r1-r2)<=eps))return 0;
		else return -1;
	}
	void upd(int p,int l,int r,double k,double b,int id){
		if(check(p,l,r,k,b,lazy[p].k,lazy[p].b)==1){
			lazy[p].k=k;
			lazy[p].b=b;
			sum[p]=id;
			used[p]=1;
			return ;
		}
		if(l==r)return ;
		int mid=(l+r)>>1;
		if(check(p*2,l,mid,k,b,lazy[p].k,lazy[p].b)>=0)upd(p*2,l,mid,k,b,id);
		if(check(p*2+1,mid+1,r,k,b,lazy[p].k,lazy[p].b)>=0)upd(p*2+1,mid+1,r,k,b,id);
	}
	void push_down(int p,int l,int r){
		if(!used[p])return ;
		int mid=(l+r)>>1;
		upd(p*2,l,mid,lazy[p].k,lazy[p].b,sum[p]);
		upd(p*2+1,mid+1,r,lazy[p].k,lazy[p].b,sum[p]);
		lazy[p].k=lazy[p].b=sum[p]=0;
		used[p]=0;
	}
	void add(int p,int l,int r,int x,int y,double k,double b,int id){
		if(l>=x&&r<=y){
			upd(p,l,r,k,b,id);
			return ;
		}
		int mid=(l+r)>>1;
		push_down(p,l,r);
		if(mid>=x)add(p*2,l,mid,x,y,k,b,id);
		if(mid<y)add(p*2+1,mid+1,r,x,y,k,b,id);
	}
	int query(int p,int l,int r,int x){
		if(l==r)return sum[p];
		int mid=(l+r)>>1;
		push_down(p,l,r);
		if(mid>=x)return query(p*2,l,mid,x);
		else return query(p*2+1,mid+1,r,x);
	}
}st;
signed main(){
	int q,lastans=0,n=mod1,cnt=0;
	cin>>q;
	while(q--){
		int op,k,x0,y0,x1,y1;
		cin>>op;
		if(op==0){
			cin>>k;
			k=(k+lastans-1)%mod1+1;
			lastans=st.query(1,1,n,k);
			cout<<lastans<<"\n";
		}
		else {
			cnt++;
			cin>>x0>>y0>>x1>>y1;
			x0=(x0+lastans-1)%mod1+1;
			x1=(x1+lastans-1)%mod1+1;
			y0=(y0+lastans-1)%mod2+1;
			y1=(y1+lastans-1)%mod2+1;
			if(x0>x1){
				swap(x0,x1);
				swap(y0,y1);
			}
			long double k=kth(x0,y0,x1,y1);
			long double b=bth(x0,y0,x1,y1);
			st.add(1,1,n,x0,x1,k,b,cnt);
		}
	}
}
WA on #2 #5 #6 #14 #17

回复

7 条回复,欢迎继续交流。

正在加载回复...