ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

李超线段树

2021-10-26 17:00:07  阅读:196  来源: 互联网

标签:nl int 线段 tree eps 李超 define


李超线段树可以用来维护平面上的线段(但是要求 \(x\) 或 \(y\) 其中一维比较小,在 \(10^5\) 及以内)。

称一条线段能成为区间 \([l,r]\) 中的最优线段,当且仅当:

  • 该线段的定义域完整覆盖了区间 \([l,r]\) ;

  • 该线段在区间中点处最优。

模板题:P4097 [HEOI2013]Segment

题意:给定平面上的一些线段,每次询问求出当前与 \(x=k\) 相交的线段中 \(y\) 值最大的线段编号。

直接按照题目题意来建立线段树并查询即可。

#define eps 1e-8
#define Maxn 100005
#define MAX 66005
#define mod 39989
#define pa pair<double,double>
#define fi first
#define se second
typedef long long ll;
int n,tot;
int tree[Maxn<<2];
pa Line[Maxn];
inline double f(pa y,int x) { return y.fi*x+y.se; }
inline int tomax(int a,int b,int x) { return (f(Line[a],x)>f(Line[b],x)+eps)?a:b; }
void add(int p,int nl,int nr,int k,int l,int r)
{
	 int mid=(nl+nr)>>1;
	 if(nl>=l && nr<=r)
	 {
	 	 if(f(Line[k],mid)>f(Line[tree[p]],mid)+eps) swap(tree[p],k);
	 	 if(f(Line[k],nl)>f(Line[tree[p]],nl)+eps) add(p<<1,nl,mid,k,l,r);
	 	 if(f(Line[k],nr)>f(Line[tree[p]],nr)+eps) add(p<<1|1,mid+1,nr,k,l,r);
		 return;
	 }
	 if(mid>=l) add(p<<1,nl,mid,k,l,r);
	 if(mid<r) add(p<<1|1,mid+1,nr,k,l,r);
}

int query(int p,int nl,int nr,int x)
{
	 if(nl==nr) return tree[p];
	 int mid=(nl+nr)>>1;
	 if(mid>=x) return tomax(tree[p],query(p<<1,nl,mid,x),x);
	 else return tomax(tree[p],query(p<<1|1,mid+1,nr,x),x);
	 return 0;
}
int main()
{
	 n=rd();
	 for(int i=1,opt,a1,b1,a2,b2,k,Last=0;i<=n;i++)
	 {
	 	 opt=rd();
	 	 if(opt==1)
	 	 {
	 	 	 a1=(rd()+Last-1)%mod+1,b1=(rd()+Last-1)%1000000000+1;
	 	 	 a2=(rd()+Last-1)%mod+1,b2=(rd()+Last-1)%1000000000+1;
	 	 	 if(a1==a2) Line[++tot]=pa(0.0,1.0*max(b1,b2));
	 	 	 else Line[++tot]=pa(1.0*(b2-b1)/(a2-a1),1.0*b1-1.0*(b2-b1)/(a2-a1)*a1);
	 	 	 add(1,1,MAX,tot,min(a1,a2),max(a1,a2));
		 }
		 else k=(rd()+Last-1)%mod+1,printf("%d\n",Last=query(1,1,MAX,k));
	 }
	 return 0;
}

标签:nl,int,线段,tree,eps,李超,define
来源: https://www.cnblogs.com/EricQian/p/15466616.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有