Luogu P4097 [HEOI2013]Segment 李超线段树
题目链接 \(Click\) \(Here\)
李超线段树的模板。但是因为我实在太\(Naive\)了,想象不到实现方法。
看代码就能懂的东西,放在这里用于复习。
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
#define ls (p << 1)
#define rs (p << 1 | 1)
#define mid ((l + r) >> 1)
struct Node {
int l, r, id;
double yl, yr;
Node (int x1 = 0, int y1 = 0, int x2 = 0, int y2 = 0, int i = 0) {
l = x1, r = x2, yl = y1, yr = y2, id = i;
if (l == r) {
yl = yr = max (yl, yr);
}
}
double get (int x) {return l == r ? yl : yl + (k () * (x - l));}
double k () {return (yr - yl) / (r - l);}
void lm (int x) {yl = get (x); l = x;}
void rm (int x) {yr = get (x); r = x;}
};
bool hei (Node a, Node b, int x) {
return a.get (x) == b.get (x) ? a.id < b.id : a.get (x) > b.get (x);
}
struct St {
Node tree[N << 2];
void build (int l, int r, int p) {
tree[p].l = l;
tree[p].r = r;
if (l == r) return;
build (l, mid, ls);
build (mid + 1, r, rs);
}
Node query (int t, int l, int r, int p) {
if (l == r) return tree[p];
Node res;
if (t <= mid) {
res = query (t, l, mid, ls);
} else {
res = query (t, mid + 1, r, rs);
}
return hei (res, tree[p], t) ? res : tree[p];
}
void update (int l, int r, Node k, int p) {
if (tree[p].l > k.l) k.lm (tree[p].l);
if (tree[p].r < k.r) k.rm (tree[p].r); //削足适履
if (hei (k, tree[p], mid)) swap (tree[p], k); //让tree[p]在mid上具有优势
if (min (tree[p].yl, tree[p].yr) >= max (k.yl, k.yr)) return; //如果完全覆盖
if (l == r) return; //如果大小为1
if (tree[p].k () <= k.k ()) {
update (mid + 1, r, k, rs); //如果k在后面有露出来的情况
} else {
update (l, mid, k, ls); //如果k在前面有露出来的情况
}
}
void insert (int l, int r, Node k, int p) {
if (k.l > r || k.r < l) return;
if (tree[p].l > k.l) k.lm (tree[p].l);
if (tree[p].r < k.r) k.rm (tree[p].r);
if (l == k.l && r == k.r) {
update (l, r, k, p);
return;
}
//把node一路传下去,对应区间就削成对应大小的线段
if (l == r) return;
insert (l, mid, k, ls);
insert (mid + 1, r, k, rs);
}
}T;
const int My = 1e9;
const int Mx = 39989;
int m, k, la, Ind, opt;
int main () {
T.build (1, Mx, 1);
cin >> m;
while (m--) {
cin >> opt;
if (opt == 0) {
cin >> k;
k = (k + la - 1) % Mx + 1;
la = T.query (k, 1, Mx, 1).id;
cout << la << endl;
} else {
int x0, x1, y0, y1;
cin >> x0 >> y0 >> x1 >> y1;
x0 = (x0 + la - 1) % Mx + 1;
x1 = (x1 + la - 1) % Mx + 1;
y0 = (y0 + la - 1) % My + 1;
y1 = (y1 + la - 1) % My + 1;
if (x0 > x1) {
swap (x0, x1);
swap (y0, y1);
}
Node res = Node (x0, y0, x1, y1, ++Ind);
T.insert (1, Mx, res, 1);
}
}
}
Luogu P4097 [HEOI2013]Segment 李超线段树的更多相关文章
- P4097 [HEOI2013]Segment 李超线段树
$ \color{#0066ff}{ 题目描述 }$ 要求在平面直角坐标系下维护两个操作: 在平面上加入一条线段.记第 i 条被插入的线段的标号为 i 给定一个数 k,询问与直线 x = k 相交的线 ...
- 【洛谷P4097】Segment 李超线段树
题目大意:维护一个二维平面,给定若干条线段,支持询问任意整数横坐标处对应的纵坐标最靠上的线段的 id,相同高度取 id 值较小的,强制在线. 题解:初步学习了李超线段树.李超线段树的核心思想在于通过标 ...
- BZOJ3165: [Heoi2013]Segment(李超线段树)
题意 题目链接 Sol 李超线段树板子题.具体原理就不讲了. 一开始自己yy着写差点写自闭都快把叉积搬出来了... 后来看了下litble的写法才发现原来可以写的这么清晰简洁Orz #include& ...
- 【BZOJ 3165】 [Heoi2013]Segment 李超线段树
所谓李超线段树就是解决此题一类的问题(线段覆盖查询点最大(小)),把原本计算几何的题目变成了简单的线段树,巧妙地结合了线段树的标记永久化与标记下传,在不考虑精度误差的影响下,打法应该是这样的. #in ...
- BZOJ3165[Heoi2013]Segment——李超线段树
题目描述 要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段.记第i条被插入的线段的标号为i. 2.给定一个数k,询问与直线 x = k相交的线段中,交点最靠上的线段的编号. 输入 第一行 ...
- BZOJ.3165.[HEOI2013]Segment(李超线段树)
BZOJ 洛谷 对于线段,依旧是存斜率即可. 表示精度误差一点都不需要管啊/托腮 就我一个人看成了mod(10^9+1)吗.. //4248kb 892ms #include <cstdio&g ...
- 【BZOJ-3165】Segment 李超线段树(标记永久化)
3165: [Heoi2013]Segment Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 368 Solved: 148[Submit][Sta ...
- 【题解】Luogu P4097 [HEOI2013]Segment
原题传送门 这珂以说是李超线段树的模板题 按着题意写就行了,时间复杂度为\(O(n\log^2n)\) #include <bits/stdc++.h> #define N 40005 # ...
- 2019.02.11 bzoj3165: [Heoi2013]Segment(线段树)
传送门 题意简述:要求支持两种操作: 插入一条线段. 询问与直线x=kx=kx=k相交的线段中,交点最靠上的线段的编号. 思路: 直接上李超线段树即可. 代码: #include<bits/st ...
随机推荐
- Git拉取项目时报错“remote: HTTP Basic: Access denied”解决方法
问题: Git拉取项目时报错“remote: HTTP Basic: Access denied”,此问题多为本地密码与远端密码不符导致. 解决方法: 在下载地址中加上用户名和密码即可,如下: htt ...
- Hack You CTF 2014: NotEasyTask
exe文件,运行后闪退,peid查一下,发现是是c#写的 Reflector打开 找到Main: private static void Main(string[] args) { string ho ...
- layui弹窗 之 iframe关闭
1)关闭特定iframe //当在iframe页面关闭自身时,在iframe页执行以下js脚本 var index = parent.layer.getFrameIndex(window.name); ...
- Lodop纯文本英文-等符号自动换行问题
ADD_PRINT_TEXT纯文本,宽度不够,高度足够,超宽会自动换行,高度不够会隐藏后面的内容.在超宽自动换行的时候,如果有-或()之类的,英文单词不拆分,或其他一些认为是不拆分的情况,会造成还没有 ...
- JS实现控制HTML5背景音乐播放暂停
首先在网页中嵌入背景音乐,html5代码为: <script src="http://wuover.qiniudn.com/jquery.js"></script ...
- 微信小程序——使用vue构建小程序【外传】
文档 http://mpvue.com/mpvue/ 根据文档构建完成的页面如下 更多的,还要继续看下文档~
- P1427 小鱼念数字
P1427 题目描述 小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字(长度不一定,以0结束,最多不超过100个,数字不超过2^32-1),记住了然后反着念出来(表示结束的数字0就不要念出来了) ...
- 洛谷P3953 逛公园(NOIP2017)(最短/长路,拓扑排序,动态规划)
洛谷题目传送门 又是一年联赛季.NOIP2017至此收官了. 这个其实是比较套路的图论DP了,但是细节有点恶心. 先求出\(1\)到所有点的最短路\(d1\),和所有点到\(n\)的最短路\(dn\) ...
- 安卓Q | 诸多本地文件找不到?应用文件存储空间沙箱化适配指导
上期我们针对Android Q 版本中对设备存储空间进行的限制.新特性变更引发的兼容性问题及原因分析推出了<安卓 Q | 8大场景全面解析应用存储沙箱化>文章,本期文章我们将手把手指导各位 ...
- Android assets的一个bug
摘要 Android assets目录下资源文件超过1MB的问题. 由于要显示一些奇奇怪怪的日文字符,我们在应用里放了一个字库文件,譬如叫做jp.ttf,放在assets目录下打包. 开发.调试一切正 ...