【洛谷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 ...
随机推荐
- LVM : 扩展文件系统的容量
如果发现文件系统的容量不足了,可以通过 LVM 轻松的进行扩展(当然也可以进行缩减操作).本文将紧接前文中的 demo 详细的介绍扩展文件系统的操作过程.说明:本文的演示环境为 ubuntu 16.0 ...
- CentOS7下单机部署RabbltMQ环境的操作记录
一.RabbitMQ简单介绍在日常工作环境中,你是否遇到过两个(多个)系统间需要通过定时任务来同步某些数据?你是否在为异构系统的不同进程间相互调用.通讯的问题而苦恼.挣扎?如果是,那么恭喜你,消息服务 ...
- 网页录像录音功能的实现之MediaRecorder的使用
前面介绍了通过H5实现在网页内打开摄像头和麦克风,实现截图和图像预览的相关知识. getUserMedia API及HTML5 调用摄像头和麦克风 一个简单的demo 实现摄像头的调用及视频录制,截 ...
- Python_复习_习题_29
# 之前做得的题 以后再遇到能保证会# 下周二考 :所有的知识# 面试题:认真对待## 三元运算符# 接收结果的变量 = 条件为真的结果 if 条件 else 条件为假的结果# 接收结果的变量 = “ ...
- sublime text3 安装package control 出现问题解决过程记录
1.安装package control 失败 通过最简单的自动安装 package control 失败(详见package control官网). 报错展示: File "./python ...
- 多校寒训TaoTao要吃鸡dp
题目描述 Taotao的电脑带不动绝地求生,所以taotao只能去玩pc版的荒野行动了, 和绝地求生一样,游戏人物本身可以携带一定重量m的物品,装备背包 之后可以多携带h(h为0代表没有装备背包)重量 ...
- <软件体系结构>实验框架选择及其说明
一.框架选择 本次实验,我所采取的框架是SSH框架.那么首先,我想简单的说明一下SSH框架,一方面给自己复习一下知识,另一方面也能使自己在以后看这篇博客的时候不至于太费力. SSH不是一个框架,而是S ...
- BETA 版冲刺前准备
任务博客 组长博客 总的来讲Alpha阶段我们计划中的工作是如期完成的.不过由于这样那样的原因,前后端各个任务完成度不算非常高,距离完成一个真正好用.完美的软件还有所差距. 过去存在的问题 测试工作未 ...
- PHP 闭包获取外部变量和global关键字声明变量的区别
最近在学习workerman的时候比较频繁的接触到回调函数,使用中经常会因为worker的使用方式不同,会用这两种不同的方式去调用外部的worker变量,这里就整理一下PHP闭包获取外部变量和glob ...
- Rabbitmq vs. kafka
https://mp.weixin.qq.com/s/2i_9TWoF3TsJvG6Dj_75vw http://www.cnblogs.com/valor-xh/p/6348009.html htt ...