社区讨论
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 条回复,欢迎继续交流。
正在加载回复...