社区讨论
Sub0 全A Sub1 全WA 求调
P4097【模板】李超线段树 / [HEOI2013] Segment参与者 4已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @mdhda7ye
- 此快照首次捕获于
- 2025/07/24 20:26 8 个月前
- 此快照最后确认于
- 2025/11/04 03:47 4 个月前
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=39989;
const int mod1=1e9;
const double eps=1e-9;
int n;
pair<double,double> edge[100010];
int len;
int tree[400010];
int cmp(double x,double y)
{
if(x-y>eps)
{
return 1;
}
if(y-x>eps)
{
return 'w'+'e'+'i'+'y'+'u'+'m'+'o'+'n'+'i'+'z'+'h'+'e'+'n'+'q'+'i'+'a'+'n'+'g';
}
return 0;
}
double calc(double x,int id)
{
return x*edge[id].first+edge[id].second;
}
void add(int id,int l,int r,int x)
{
int mid=(l+r)/2;
bool kk=cmp(calc(mid,x),calc(mid,tree[id]));
if(kk==1||kk==0&&x<tree[id])
{
swap(x,tree[id]);
}
if(l == r)
{
return ;
}
int kkl=cmp(calc(l,x),calc(l,tree[id]));
int kkr=cmp(calc(r,x),calc(r,tree[id]));
if(kkl==1||kkl==0&&x<tree[id])
{
add(id*2,l,mid,x);
}
if(kkr==1||kkr==0&&x<tree[id])
{
add(id*2+1,mid+1,r,x);
}
}
void add(int id,int l,int r,int x,int y,int pos)
{
if(x<=l&&r<=y)
{
add(id,l,r,pos);
return ;
}
int mid=(l+r)/2;
if(x<=mid)
{
add(id*2,l,mid,x,y,pos);
}
if(y>mid)
{
add(id*2+1,mid+1,r,x,y,pos);
}
}
pair<double,int> mx(pair<double,int> x,pair<double,int> y)
{
if(cmp(x.first,y.first) == 1)
{
return x;
}
if(cmp(x.first,y.first)!=0)
{
return y;
}
return x.second<y.second?x:y;
}
pair<double,int> find(int id,int l,int r,int x)
{
pair<double,int> ans={calc(x,tree[id]),tree[id]};
if(l == r)
{
return ans;
}
int mid=(l+r)/2;
if(x<=mid)
{
ans=mx(ans,find(id*2,l,mid,x));
}
else
{
ans=mx(ans,find(id*2+1,mid+1,r,x));
}
return ans;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n;
int last=0;
for(int i=1;i<=n;i++)
{
int op;
double X,Y,X1,Y1;
cin>>op;
if(op == 1)
{
cin>>X>>Y>>X1>>Y1;
X=int64_t(X+last-1+mod)%mod+1;
Y=int64_t(Y+last-1+mod1)%mod1+1;
X1=int64_t(X1+last-1+mod)%mod+1;
Y1=int64_t(Y1+last-1+mod1)%mod1+1;
if(X == X1)
{
edge[++len]={0,max(Y,Y1)};
add(1,1,40000,min(X,X1),max(X,X1),len);
continue;
}
edge[++len]={1.0*(Y1-Y)/(X1-X),1.0*Y-1.0*(Y1-Y)/(X1-X)*X};
add(1,1,40000,min(X,X1),max(X,X1),len);
}
else
{
cin>>X;
X=int64_t(X+last-1+mod)%mod+1;
cout<<find(1,1,40000,X).second<<'\n';
last=find(1,1,40000,X).second;
}
}
return 0;
}
回复
共 7 条回复,欢迎继续交流。
正在加载回复...