题目大意:维护一个二维平面,给定若干条线段,支持询问任意整数横坐标处对应的纵坐标最靠上的线段的 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 李超线段树的更多相关文章

  1. Luogu P4097 [HEOI2013]Segment 李超线段树

    题目链接 \(Click\) \(Here\) 李超线段树的模板.但是因为我实在太\(Naive\)了,想象不到实现方法. 看代码就能懂的东西,放在这里用于复习. #include <bits/ ...

  2. 【BZOJ-3165】Segment 李超线段树(标记永久化)

    3165: [Heoi2013]Segment Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 368  Solved: 148[Submit][Sta ...

  3. Segment 李超线段树

    题目大意: 要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段.记第 i 条被插入的线段的标号为 i 2.给定一个数 k,询问与直线 x = k 相交的线段中,交点最靠上的线段的编号. 若 ...

  4. BZOJ3165: [Heoi2013]Segment(李超线段树)

    题意 题目链接 Sol 李超线段树板子题.具体原理就不讲了. 一开始自己yy着写差点写自闭都快把叉积搬出来了... 后来看了下litble的写法才发现原来可以写的这么清晰简洁Orz #include& ...

  5. 【BZOJ 3165】 [Heoi2013]Segment 李超线段树

    所谓李超线段树就是解决此题一类的问题(线段覆盖查询点最大(小)),把原本计算几何的题目变成了简单的线段树,巧妙地结合了线段树的标记永久化与标记下传,在不考虑精度误差的影响下,打法应该是这样的. #in ...

  6. P4097 [HEOI2013]Segment 李超线段树

    $ \color{#0066ff}{ 题目描述 }$ 要求在平面直角坐标系下维护两个操作: 在平面上加入一条线段.记第 i 条被插入的线段的标号为 i 给定一个数 k,询问与直线 x = k 相交的线 ...

  7. 【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)

    Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...

  8. 洛谷题解P4314CPU监控--线段树

    题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...

  9. 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)

    洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; l ...

随机推荐

  1. Error【0007】:zabbix中因为curl版本过低而无法发送邮件

    1. 错误背景 在centos6.5上,源码部署zabbix最新版本zabbix-3.2.14.部署后之后,在配置邮件发送报警时出错 2. 错误提示 3. 原因分析 从网上检索的结果是说,系统中的cu ...

  2. CSS 内边距 (padding) 实例

    CSS 内边距 (padding) 实例元素的内边距在边框和内容区之间.控制该区域最简单的属性是 padding 属性. CSS padding 属性定义元素边框与元素内容之间的空白区域.CSS 内边 ...

  3. HTTP 及相关知识

    什么是HTTP.流程? 什么是AJAX.方法.状态码?

  4. 个人阅读作业 final

    前两次阅读作业链接: http://www.cnblogs.com/SteelPillar/p/4027877.html http://www.cnblogs.com/SteelPillar/p/40 ...

  5. Notes of Daily Scrum Meeting(12.24)

    平安夜了,我们还在这里辛苦地赶代码,整个人都不好了... 今天的团队任务总结如下: 团队成员 今日团队工作 陈少杰 寻找大神帮助,调试网络连接 王迪 建立搜索的UI界面,把算法加入进去 金鑫 调试网络 ...

  6. 关于在VB.NET中调用使用VC++编写的类库dll的一点笔记

    前言 结对作业要求一出来,我就立刻想到了把“计算核心”封装成dll,然后使用vb.net编写UI调用dll的思路.然而在实现过程中却遇到了很多的问题. 我在这个过程中是负责使用vb.net编写UI并调 ...

  7. [BUAA软工]第二次博客作业---结对编程

    [BUAA软工]结对作业 项目 内容 这个作业属于哪个课程 北航软工 这个作业的要求在哪里 2019年软件工程基础-结对项目作业 我在这个课程的目标是 学习如何以团队的形式开发软件,提升个人软件开发能 ...

  8. 【实践报告】Linux实践三

    Linux实践——程序破解 一.掌握NOP.JNE.JE.JMP.CMP汇编指令的机器码 NOP:NOP指令即“空指令”.执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP ...

  9. package.json中的几种依赖注册对象解析

    本博文根据官网+google翻译+自己的理解,欢迎指出翻译的不到位的地方. package.json的重要性不言而喻,一直以来对几种依赖注册对象的区别和作用不是很了解,今日一探究竟. dependen ...

  10. oracle alter

    ALTER TABLE (表名) ADD CONSTRAINT (索引名);ALTER TABLE (表名) DROP CONSTRAINT (索引名); ALTER TABLE (表名) ADD ( ...