李超线段树 [Heoi2013]Segment

问题 D: [Heoi2013]Segment
时间限制: 4 Sec 内存限制: 256 MB
题目描述
要求在平面直角坐标系下维护两个操作:
1.在平面上加入一条线段。记第i条被插入的线段的标号为i。
2.给定一个数k,询问与直线 x = k相交的线段中,交点最靠上的线段的编号。

输入

第一行一个整数n,表示共n 个操作。
接下来n行,每行第一个数为0或1。

若该数为 0,则后面跟着一个正整数 k,表示询问与直线
x = ((k +lastans–1)%39989+1)相交的线段中交点(包括在端点相交的情形)最靠上的线段的编号,其中%表示取余。若某条线段为直线的一部分,则视作直线与线段交于该线段y坐标最大处。若有多条线段符合要求,输出编号最小的线段的编号。
若该数为 1,则后面跟着四个正整数 x0, y0, x 1, y 1,表示插入一条两个端点为
((x0+lastans-1)%39989+1,(y0+lastans-1)%10^9+1)和((x
1+lastans-1)%39989+1,(y1+lastans-1)%10^9+1) 的线段。
其中lastans为上一次询问的答案。初始时lastans=0。

输出
对于每个 0操作,输出一行,包含一个正整数,表示交点最靠上的线段的编号。若不存在与直线相交的线段,答案为0。

样例输入
6
1 8 5 10 8
1 6 7 2 6
0 2
0 9
1 4 7 6 7
0 5
样例输出
2
0 3
提示
对于100%的数据,1 ≤ n ≤ 10^5 , 1 ≤ k, x0, x1 ≤ 39989, 1 ≤ y0 ≤ y1 ≤ 10^9。

其实这道题就是个板子,李超线段树。(这个板子就是为了解决这个问题,只不过板子太难了而已,汗颜)

就题论算法把,李超线段树用来处理向一个区间加有斜率的线段,之后判断某位置权值最大的线段是哪条之类的问题。而最重要的是多了的insert函数。当分到的区间已属于这条线段覆盖的区间是,就要进行更神奇的操作了,去比较当前节点所存的最优线段。先附上代码。

void insert(int l,int r,int x,int k)
{if(!t[x].h)t[x].h=k;if(cmp(t[x].h,k,l))swap(t[x].h,k);if(l==r||a[t[x].h].k==a[k].k)return;int mid=(l+r)/2;double g=(double)(a[t[x].h].b-a[k].b)/(a[k].k-a[t[x].h].k);if(g<l||g>r)return;if(g<=mid)insert(l,mid,x*2,t[x].h),t[x].h=k;else insert(mid+1,r,x*2+1,k);
}

因为比较分为两种情况,完全压制和在区间内有交点。完全压制不动或直接修改后返回就好了。而对于相交的就必须求出交点,根据交点的位置(其实也就是判断那条线段在交点那一边处于优势)去修改子区间。
对于这段代码理解还是有点困难(本蒟蒻太水,自己口胡。。)要把本区间右侧较大的线段置成本区间最优(我也不是太懂为什么。。望神犇来解释),若不懂,手动模拟一下过程即可。
还要注意一些细节:直线斜率是否存在,以及两条线是否平行。。(RE到死)

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 101000
#define ll long long
using namespace std;
struct node
{int l,r,id;double k,b;
}a[N];
struct tree{int l,r,h;}t[50000*4];
int n,m;
void build(int l,int r,int x)
{t[x].l=l;t[x].r=r;if(l==r){t[x].h=0;return;}int mid=(l+r)/2;build(l,mid,x*2);build(mid+1,r,x*2+1);
}
bool cmp(int x,int y,double l)
{if(!x)return 1;double l1=a[x].k*l+a[x].b,l2=a[y].k*l+a[y].b;return l1!=l2?l1<l2:x<y;
}
int q(int k,int x)
{if(t[x].l==t[x].r)return t[x].h;int mid=(t[x].l+t[x].r)/2,tmp;if(k<=mid)tmp=q(k,x*2);else tmp=q(k,x*2+1);return cmp(t[x].h,tmp,k)?tmp:t[x].h;
}
void insert(int l,int r,int x,int k)
{if(!t[x].h)t[x].h=k;if(cmp(t[x].h,k,l))swap(t[x].h,k);if(l==r||a[t[x].h].k==a[k].k)return;int mid=(l+r)/2;double g=(double)(a[t[x].h].b-a[k].b)/(a[k].k-a[t[x].h].k);if(g<l||g>r)return;if(g<=mid)insert(l,mid,x*2,t[x].h),t[x].h=k;else insert(mid+1,r,x*2+1,k);
}
void c(int k,int x)
{if(t[x].l>=a[k].l&&t[x].r<=a[k].r){insert(t[x].l,t[x].r,x,k);return;}int mid=(t[x].l+t[x].r)/2;if(a[k].l<=mid)c(k,x*2);if(a[k].r>mid)c(k,x*2+1);
}
int main()
{scanf("%d",&n);int x1,x2,y1,y2,z,ans=0;build(1,50000,1);while(n--){scanf("%d",&z);if(z==0){scanf("%d",&x1);x1=(x1+ans-1)%39989+1;//out<<x1<<endl;ans=q(x1,1);printf("%d\n",ans);}else{m++;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);x1=(x1+ans-1)%39989+1;x2=(x2+ans-1)%39989+1;y1=(y1+ans-1)%1000000000+1;y2=(y2+ans-1)%1000000000+1;//cout<<x1<<" "<<x2<<" "<<y1<<" "<<y2<<endl;if(x1>x2)swap(x1,x2),swap(y1,y2);if(x1==x2)a[m].k=0,a[m].b=max(y1,y2);else{a[m].k=(double)(y1-y2)/(x1-x2);a[m].b=(double)y1-a[m].k*x1;}a[m].l=x1;a[m].r=x2;a[m].id=m;c(m,1);}}
}

转载于:https://www.cnblogs.com/QTY2001/p/7632656.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/415697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 城市选择,热门城市,全部城市(美团、滴滴、淘宝)

demo链接&#xff1a;https://download.csdn.net/download/meixi_android/10819638 实现效果&#xff1a; 实现方法&#xff1a;非常简洁快速&#xff0c;三步集成实现地区选择器 1、导入city.module module导入方法&#xff1a;https://blog.csdn.net/meixi_android/articl…

虚拟化资料

很感谢 http://pan.baidu.com/netdisk/extractpublic?uk503876868#dir

汽车列表 车型选择 源码备忘

因为版权问题&#xff0c;选汽车的时候不能显示汽车自己真实的图片&#xff0c;下面我需要改成列表形式&#xff0c;下面记录一下代码 1、实现效果 2、源码 <div class"car-brand-list"><div v-for"(brand,index) in brandList" :key"inde…

Android View生命周期

View的关键生命周期为&#xff1a;> 构造View() --> onFinishInflate() --> onAttachedToWindow() --> onMeasure() --> onSizeChanged() --> onLayout() --> onDraw() --> onDetackedFromWindow()Creation&#xff08;创建&#xff09;Constructors&a…

oracle数据库安装过程中出现主目录不兼容的问题

今天是不顺利的一天&#xff0c;一大早机器就开不了机&#xff0c;结果是硬盘坏了。 网管安装好系统后&#xff0c;剩下的工作就要我完成了&#xff0c;刚开始远程桌面时&#xff0c;就出现了登录后系统反应超慢&#xff0c;根本没办法操作&#xff0c;一直是卡起的&#xff0…

mock 生成在线图片

1、需要用到库mockjs yarn add mockjs2、引入 const Random require(mockjs).Random;3、生成一张图片 Random.image(200x100);返回结果是url格式&#xff1a;http://dummyimage.com/200x100 4、主要的配置参数 Random.image( size?, background?, foreground?, format?…

android base64encoder 不存在

下载jar包:https://pan.baidu.com/s/1TxnW8DqEgRvIL4Urqlnzyw 在线回复密码&#xff1a;QQ1085220040 把jar包添加到libs下并且add as Lib /*** 利用MD5进行加密** param str* 待加密的字符串* return 加密后的字符串* throws NoSuchAlgorithmException* …

获取鼠标句柄

&#xff08;1&#xff09;引用 using System.Runtime.InteropServices; (2)调用方法 1、获取窗口标题 [DllImport( "user32.dll" )]   public static extern int GetWindowText( IntPtr hWnd, StringBuilder lpString,int nMaxCount ); 注&#xff1a;hWnd 窗口句…

WIN2003 X64 系统上安装sql server 2000 的步骤

SQL Server 2000 安装要在 64 位操作系统上安装此应用程序&#xff0c;请使用以下步骤&#xff1a; 浏览至 SQL Server 2000 安装点 安装 SQL Server 2000&#xff1a; 双击“x86\setup”子文件夹中的 setupsql.exe。 安装 SQL Server 2000 分析服务&#xff1a; 双击…

windows 环境下 0x色彩对应表

RGB颜色查询对照表0xFFFFFF 0xFFFFF0 0xFFFFE0 0xFFFF00 0xFFFAFA 0xFFFAF0 0xFFFACD 0xFFF8DC 0xFFF68F 0xFFF5EE 0xFFF0F5 0xFFEFDB 0xFFEFD5 0xFFEC8B 0xFFEBCD 0xFFE7BA 0xFFE4E1 0xFFE4C4 0xFFE4B5 0xFFE1FF 0xFFDEAD 0xFFDAB9 0xFFD700 0xFFD39B 0xFFC1C1 0xFFC125 0xFFC…

小程序 上拉刷新 下拉加载 代码备忘

使用wux-refresher扩展实现上拉刷新&#xff0c;下拉加载&#xff0c;再配合上小程序原生的scroll-view感觉很完美了。 核心代码如下&#xff1a; <div class"m-active-list"><wux-refresher id"wux-refresher" loadmore"more" refres…

oracle 10.2.0.1升级到10.2.0.4

--********************************* -- Oracle 10.2.0.1 升级到 10.2.0.4 --********************************* 本文是基于LINUX环境下的ORACLE&#xff0c;不过和WIN差别不是很大&#xff0c;命令等都是一样的。我升级时也是参照此文档执行。所以可执行性比较强。 数据…

[JSOI2007]麻将

[JSOI2007]麻将 题目 麻将是中国传统的娱乐工具之一。麻将牌的牌可以分为字牌&#xff08;共有东、南、西、北、中、发、白七种&#xff09;和序数牌&#xff08;分为条子、饼子、万子三种花色&#xff0c;每种花色各有一到九的九种牌&#xff09;&#xff0c;每种牌各四张。在…

获取颜色值 抓取颜色值 获取颜色代码RGB

搜索 FastStone Capture 下载 FastStone Capture 链接&#xff1a;https://download.csdn.net/download/meixi_android/11016008 http://www.fixdown.com/faststonecapture.htm 下载完&#xff0c;解压即可使用&#xff0c;获取颜色值颜色代码 这是网上找的注册码&#x…

mongoose $sum

_id:... Segment:[{ field: "S1", value: 1 },{ field: "S2", value: 5 },{ field: "Sn", value: 10 }, ]查询方式 db.collection.aggregate( [{ $unwind: "$Segment" },{ $group: {_id: $_id, sum: { $sum: $Segment.value } } } ]…

前端学习(2609):vuex的使用步骤

1导入vue 2创建一个vuex的存储对象 3注册插件 4导出 5导入vuex的存储对象 6建立一个组件