【洛谷P4097】Segment 李超线段树
题目大意:维护一个二维平面,给定若干条线段,支持询问任意整数横坐标处对应的纵坐标最靠上的线段的 id,相同高度取 id 值较小的,强制在线。
题解:初步学习了李超线段树。李超线段树的核心思想在于通过标记永久化的方式来维护斜率。
代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
const double eps=1e-6;
inline int read(){
int x=0,f=1;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
return f*x;
}
int n,lastans,cnt;
struct line{double k,b;int id;};
struct node{
#define ls(x) t[x].lc
#define rs(x) t[x].rc
int lc,rc;bool tag;line s;
}t[maxn];
int tot,root;
void pushdown(int o,int l,int r,line now){
if(!t[o].tag){t[o].s=now,t[o].tag=1;return;}
double l1=now.k*l+now.b,r1=now.k*r+now.b;
double l2=t[o].s.k*l+t[o].s.b,r2=t[o].s.k*r+t[o].s.b;
if(l2>=l1&&r2>=r1)return;
else if(l1>=l2&&r1>=r2){t[o].s=now;return;}
else{
double pos=(now.b-t[o].s.b)/(t[o].s.k-now.k);
int mid=l+r>>1;
if(pos<=mid)pushdown(ls(o),l,mid,r1>r2?t[o].s:now);
else pushdown(rs(o),mid+1,r,r1>r2?now:t[o].s);
if((l1>l2&&pos>mid)||(pos<=mid&&r1>r2))t[o].s=now;
}
}
int build(int l,int r){
int x=++tot;
if(l==r)return x;
int mid=l+r>>1;
ls(x)=build(l,mid),rs(x)=build(mid+1,r);
return x;
}
void modify(int o,int l,int r,int x,int y,line now){
if(l==x&&r==y){pushdown(o,l,r,now);return;}
int mid=l+r>>1;
if(y<=mid)modify(ls(o),l,mid,x,y,now);
else if(x>mid)modify(rs(o),mid+1,r,x,y,now);
else modify(ls(o),l,mid,x,mid,now),modify(rs(o),mid+1,r,mid+1,y,now);
}
line query(int o,int l,int r,int pos){
if(l==r)return t[o].tag?t[o].s:line{0,0,0};
int mid=l+r>>1;
line res=pos<=mid?query(ls(o),l,mid,pos):query(rs(o),mid+1,r,pos);
if(!t[o].tag)return res;
double v1=t[o].s.k*pos+t[o].s.b,v2=res.k*pos+res.b;
if(!res.id||v1>v2||(fabs(v1-v2)<eps&&t[o].s.id<res.id))res=t[o].s;
return res;
}
void solve(){
n=read();
root=build(1,39989);
while(n--){
int opt=read();
if(opt==0){
int pos=(read()+lastans-1)%39989+1;
printf("%d\n",lastans=query(root,1,39989,pos).id);
}else{
int x0=read(),y0=read(),x1=read(),y1=read();
x0 = (x0 + lastans - 1) % 39989 + 1;
x1 = (x1 + lastans - 1) % 39989 + 1;
y0 = (y0 + lastans - 1) % (int) (1e9) + 1;
y1 = (y1 + lastans - 1) % (int) (1e9) + 1;
if(x0==x1)modify(root,1,39989,x0,x1,line{0.0,max(y0,y1),++cnt});
else{
if(x0>x1)swap(x0,x1),swap(y0,y1);
double k=(double)(y0-y1)/(x0-x1),b=(double)y0-k*x0;
modify(root,1,39989,x0,x1,line{k,b,++cnt});
}
}
}
}
int main(){
solve();
return 0;
}
【洛谷P4097】Segment 李超线段树的更多相关文章
- Luogu P4097 [HEOI2013]Segment 李超线段树
题目链接 \(Click\) \(Here\) 李超线段树的模板.但是因为我实在太\(Naive\)了,想象不到实现方法. 看代码就能懂的东西,放在这里用于复习. #include <bits/ ...
- 【BZOJ-3165】Segment 李超线段树(标记永久化)
3165: [Heoi2013]Segment Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 368 Solved: 148[Submit][Sta ...
- Segment 李超线段树
题目大意: 要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段.记第 i 条被插入的线段的标号为 i 2.给定一个数 k,询问与直线 x = k 相交的线段中,交点最靠上的线段的编号. 若 ...
- BZOJ3165: [Heoi2013]Segment(李超线段树)
题意 题目链接 Sol 李超线段树板子题.具体原理就不讲了. 一开始自己yy着写差点写自闭都快把叉积搬出来了... 后来看了下litble的写法才发现原来可以写的这么清晰简洁Orz #include& ...
- 【BZOJ 3165】 [Heoi2013]Segment 李超线段树
所谓李超线段树就是解决此题一类的问题(线段覆盖查询点最大(小)),把原本计算几何的题目变成了简单的线段树,巧妙地结合了线段树的标记永久化与标记下传,在不考虑精度误差的影响下,打法应该是这样的. #in ...
- P4097 [HEOI2013]Segment 李超线段树
$ \color{#0066ff}{ 题目描述 }$ 要求在平面直角坐标系下维护两个操作: 在平面上加入一条线段.记第 i 条被插入的线段的标号为 i 给定一个数 k,询问与直线 x = k 相交的线 ...
- 【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)
Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...
- 洛谷题解P4314CPU监控--线段树
题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...
- 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)
洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; l ...
随机推荐
- Nextcloud私有云盘在Centos7下的部署笔记
搭建个人云存储一般会想到ownCloud,堪称是自建云存储服务的经典.而Nextcloud是ownCloud原开发团队打造的号称是“下一代”存储.初一看觉得“口气”不小,刚推出来就重新“定义”了Clo ...
- Nginx+upstream针对后端服务器容错的运维笔记
熟练掌握Nginx负载均衡的使用对运维人员来说是极其重要的!下面针对Nignx负载均衡upstream容错机制的使用做一梳理性说明: 一.nginx的upstream容错 1)nginx 判断节点失效 ...
- iOS实时查看App运行日志
前言: 本文讨论如何实时查看输出在console控制台的日志. 一.Xcode 通过Window->Devices打开devices界面,选择我们的手机,也能看到手机中运行的进程输出的日志.如图 ...
- ul ol li的序号编号样式
序号样式例子,下面是html代码(做参考) <ol> <li>列表内容列表内容列表内容列表</li> <li>列表内容列表内容列表内容列表</li ...
- HDU-6440-费马小定理
亏我前几天还学数论呢...没有深入研究费马小定理这个东西...做事情一定要静下心来啊... 题目要求满足(m+n)^p=m^p+n^p,要你定义一个封闭的新的加法和乘法运算 我们知道费马小定理中有两种 ...
- [BUAA软工]第一次博客作业---阅读《构建之法》
[BUAA软工]第一次博客作业 项目 内容 这个作业属于哪个课程 北航软工 这个作业的要求在哪里 第1次个人作业 我在这个课程的目标是 学习如何以团队的形式开发软件,提升个人软件开发能力 这个作业在哪 ...
- 《Linux内核分析》 第八节 进程的切换和一般的执行过程
张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核分析 第八 ...
- github的使用心得
我的github地址:https://github.com/gaino1/test GitHub 是一个用于使用Git版本控制系统的项目的基于互联网的存取服务. GitHub可以托管各种git库,并提 ...
- answer my questions from the book<构建之法>.
1)何为文档:文档时在一个项目进行的一生中所有记忆的集合.有需求分析.功能设计.在实现功能过程中也可以有一系列文档记录.测试文档等等. 2)结对工作等找队友会花费大量时间致耽误项目否:正如老师所讲,从 ...
- 第三个spring冲刺总结(附团队贡献分)
基于调查需求下完成的四则运算,我们完成了主要的3大功能. 第一,普通的填空题运算,这个是传统的运算练习方式,团队都认为这个选项是必要的,好的传统要留下来,在个人经历中,填空练习是一个不错的选择. 第二 ...