社区讨论

30pts,求条玄关

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mhjoivqe
此快照首次捕获于
2025/11/04 05:55
4 个月前
此快照最后确认于
2025/11/04 05:55
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n;
int root;
int cnt=0;
int lastans=0;
struct tree{
	int lid,rid;
	int left,right;
	long double k,b;
	int num=0;
}leaf[200010];
int chx(int x){
	return (x+lastans-1)%39989+1;
}
int chy(int y){
	return (y+lastans-1)%1000000000+1;
}
int build_tree(int l,int r){
	int id=++cnt;
	leaf[id].left=l,leaf[id].right=r;
	if(l==r)
		return id;
	int mid=(l+r)>>1;
	leaf[id].lid=build_tree(l,mid);
	leaf[id].rid=build_tree(mid+1,r);
	return id;
}
void insert(int l,int r,long double k,long double b,int num,int id){
	int mid=(leaf[id].left+leaf[id].right)>>1;
	if(l<=leaf[id].left and r>=leaf[id].right){
		if(b+k*mid>(leaf[id].b+leaf[id].k*mid)){
			swap(b,leaf[id].b);
			swap(k,leaf[id].k);
			swap(num,leaf[id].num);
		}
		if(leaf[id].left==leaf[id].right)return;
		if(leaf[id].left!=leaf[id].right){
			if(b+k*leaf[id].left>(leaf[id].b+leaf[id].left*leaf[id].k))
				insert(l,r,k,b,num,leaf[id].lid);
			else if(b+k*leaf[id].right>(leaf[id].b+leaf[id].right*leaf[id].k))
				insert(l,r,k,b,num,leaf[id].rid);
		}
	}else{
		if(mid>=l)
			insert(l,r,k,b,num,leaf[id].lid);
		if(mid<r)
			insert(l,r,k,b,num,leaf[id].rid);
	}
	return ;
}
struct ANS{
	long double top;
	int num;
};
ANS read_tree(int x,int id){
	ANS ans={leaf[id].b+leaf[id].k*x,leaf[id].num};
	int mid=(leaf[id].left+leaf[id].right)>>1;
	if(leaf[id].left==leaf[id].right)return ans;
	if(x<=mid){
		ANS ans1=read_tree(x,leaf[id].lid);
		if(ans1.top>ans.top)
			swap(ans,ans1);
	}else{
		ANS ans1=read_tree(x,leaf[id].rid);
		if(ans1.top>ans.top)
			swap(ans,ans1);
	}
	return ans;
}
int main(){
	cin>>n;
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	root=build_tree(1,40000);
	for(int i=1,j=0;i<=n;i++){
		int op;
		cin>>op;
		if(op==1){
			int xa,xb,ya,yb;
			cin>>xa>>ya>>xb>>yb;
			xa=chx(xa),xb=chx(xb);
			ya=chy(ya),yb=chy(yb);
			long double k,b;
			if(xa>xb){
				swap(xa,xb);
				swap(ya,yb);
			}
			if(xa==xb){
				b=max(ya,yb);
				k=0;
			}
			else{
				k=(yb-ya)/(xb-xa);
				b=ya-k*xa;
			}
			insert(xa,xb,k,b,++j,root);
		}
		if(op==0){
			int x;
			cin>>x;
			x=chx(x);
			lastans=read_tree(x,root).num;
			cout<<lastans<<endl;
		}
	}
} 

回复

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

正在加载回复...