社区讨论

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 条回复,欢迎继续交流。

正在加载回复...