题目链接 \(Click\) \(Here\)

李超线段树的模板。但是因为我实在太\(Naive\)了,想象不到实现方法。

看代码就能懂的东西,放在这里用于复习。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 100010;
  4. #define ls (p << 1)
  5. #define rs (p << 1 | 1)
  6. #define mid ((l + r) >> 1)
  7. struct Node {
  8. int l, r, id;
  9. double yl, yr;
  10. Node (int x1 = 0, int y1 = 0, int x2 = 0, int y2 = 0, int i = 0) {
  11. l = x1, r = x2, yl = y1, yr = y2, id = i;
  12. if (l == r) {
  13. yl = yr = max (yl, yr);
  14. }
  15. }
  16. double get (int x) {return l == r ? yl : yl + (k () * (x - l));}
  17. double k () {return (yr - yl) / (r - l);}
  18. void lm (int x) {yl = get (x); l = x;}
  19. void rm (int x) {yr = get (x); r = x;}
  20. };
  21. bool hei (Node a, Node b, int x) {
  22. return a.get (x) == b.get (x) ? a.id < b.id : a.get (x) > b.get (x);
  23. }
  24. struct St {
  25. Node tree[N << 2];
  26. void build (int l, int r, int p) {
  27. tree[p].l = l;
  28. tree[p].r = r;
  29. if (l == r) return;
  30. build (l, mid, ls);
  31. build (mid + 1, r, rs);
  32. }
  33. Node query (int t, int l, int r, int p) {
  34. if (l == r) return tree[p];
  35. Node res;
  36. if (t <= mid) {
  37. res = query (t, l, mid, ls);
  38. } else {
  39. res = query (t, mid + 1, r, rs);
  40. }
  41. return hei (res, tree[p], t) ? res : tree[p];
  42. }
  43. void update (int l, int r, Node k, int p) {
  44. if (tree[p].l > k.l) k.lm (tree[p].l);
  45. if (tree[p].r < k.r) k.rm (tree[p].r); //削足适履
  46. if (hei (k, tree[p], mid)) swap (tree[p], k); //让tree[p]在mid上具有优势
  47. if (min (tree[p].yl, tree[p].yr) >= max (k.yl, k.yr)) return; //如果完全覆盖
  48. if (l == r) return; //如果大小为1
  49. if (tree[p].k () <= k.k ()) {
  50. update (mid + 1, r, k, rs); //如果k在后面有露出来的情况
  51. } else {
  52. update (l, mid, k, ls); //如果k在前面有露出来的情况
  53. }
  54. }
  55. void insert (int l, int r, Node k, int p) {
  56. if (k.l > r || k.r < l) return;
  57. if (tree[p].l > k.l) k.lm (tree[p].l);
  58. if (tree[p].r < k.r) k.rm (tree[p].r);
  59. if (l == k.l && r == k.r) {
  60. update (l, r, k, p);
  61. return;
  62. }
  63. //把node一路传下去,对应区间就削成对应大小的线段
  64. if (l == r) return;
  65. insert (l, mid, k, ls);
  66. insert (mid + 1, r, k, rs);
  67. }
  68. }T;
  69. const int My = 1e9;
  70. const int Mx = 39989;
  71. int m, k, la, Ind, opt;
  72. int main () {
  73. T.build (1, Mx, 1);
  74. cin >> m;
  75. while (m--) {
  76. cin >> opt;
  77. if (opt == 0) {
  78. cin >> k;
  79. k = (k + la - 1) % Mx + 1;
  80. la = T.query (k, 1, Mx, 1).id;
  81. cout << la << endl;
  82. } else {
  83. int x0, x1, y0, y1;
  84. cin >> x0 >> y0 >> x1 >> y1;
  85. x0 = (x0 + la - 1) % Mx + 1;
  86. x1 = (x1 + la - 1) % Mx + 1;
  87. y0 = (y0 + la - 1) % My + 1;
  88. y1 = (y1 + la - 1) % My + 1;
  89. if (x0 > x1) {
  90. swap (x0, x1);
  91. swap (y0, y1);
  92. }
  93. Node res = Node (x0, y0, x1, y1, ++Ind);
  94. T.insert (1, Mx, res, 1);
  95. }
  96. }
  97. }

Luogu P4097 [HEOI2013]Segment 李超线段树的更多相关文章

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

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

  2. 【洛谷P4097】Segment 李超线段树

    题目大意:维护一个二维平面,给定若干条线段,支持询问任意整数横坐标处对应的纵坐标最靠上的线段的 id,相同高度取 id 值较小的,强制在线. 题解:初步学习了李超线段树.李超线段树的核心思想在于通过标 ...

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

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

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

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

  5. BZOJ3165[Heoi2013]Segment——李超线段树

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

  6. BZOJ.3165.[HEOI2013]Segment(李超线段树)

    BZOJ 洛谷 对于线段,依旧是存斜率即可. 表示精度误差一点都不需要管啊/托腮 就我一个人看成了mod(10^9+1)吗.. //4248kb 892ms #include <cstdio&g ...

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

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

  8. 【题解】Luogu P4097 [HEOI2013]Segment

    原题传送门 这珂以说是李超线段树的模板题 按着题意写就行了,时间复杂度为\(O(n\log^2n)\) #include <bits/stdc++.h> #define N 40005 # ...

  9. 2019.02.11 bzoj3165: [Heoi2013]Segment(线段树)

    传送门 题意简述:要求支持两种操作: 插入一条线段. 询问与直线x=kx=kx=k相交的线段中,交点最靠上的线段的编号. 思路: 直接上李超线段树即可. 代码: #include<bits/st ...

随机推荐

  1. centos无网络问题

  2. 学习 Spring (十) 注解之 @Bean, @ImportResource, @Value

    Spring入门篇 学习笔记 @Bean @Bean 标识一个用于配置和初始化一个由 Spring IoC 容器管理的新对象的方法,类似于 XML 配置文件的 可以在 Spring 的 @Config ...

  3. How to execute a Stored Procedure with Entity Framework Code First

    Recently I worked on a project, which I started as code first and then I forced to switch to Databas ...

  4. Html5 拖拽api

    拖拽要有两个元素,一个是要拖动的元素,一个是要放置到的元素. 1, 在默认情况下, 只有图片和文字是可以拖拽的,其它元素都不可以.因此要想使一个元素可拖动,必须设置它的draggable 属性为tru ...

  5. 洛谷 P3951 小凯的疑惑

    题目链接 一开始看到这题,我的内心是拒绝的. 以为是同余类bfs,一看数据1e9,发现只能允许O(1)的算法,数学还不太好,做不出来,其实应该打表找规律. 看到网上的题解,如果两个都必须拿,结果一定是 ...

  6. 18mysql3

    一.内外连接全连接,左右连接   █▓        通过两张表查找其对应的记录. 隐式 内连接 select * from a,b where a.列名 = b.列名   █▓        左连接 ...

  7. DRF 解析器和渲染器

    一,DRF 解析器 根据请求头 content-type 选择对应的解析器就请求体内容进行处理. 1. 仅处理请求头content-type为application/json的请求体 from dja ...

  8. 自学Python4.2-装饰器

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

  9. 浏览器在DPI缩放时变化问题

    在高分辨笔记本电脑上,如果使用了"放大".那么原来在笔记本上很小的字和图就看起来大很多了.看起来舒服. 这个笔记本电脑是 1920 1080 装W10,系统推荐说125%佳.于是设 ...

  10. luogu3292 幸运数字 (点分治+线性基)

    首先第一眼是一个倍增套线性基,但是$O(Qlog^2Vlog^N)=10^{10}$的复杂度... 即使是st表也只是变成了$O(Nlog^2Vlog^N)$啊 考虑点分治,相对于倍增显著减少了线性基 ...