传送门

题意简述:要求支持两种操作:

  1. 插入一条线段。
  2. 询问与直线x=kx=kx=k相交的线段中,交点最靠上的线段的编号。

思路:

直接上李超线段树即可。

代码:

  1. #include<bits/stdc++.h>
  2. #define ri register int
  3. using namespace std;
  4. typedef long long ll;
  5. typedef double db;
  6. const int mod=1e9+7,N=40005,M=100005;
  7. inline int read(){
  8. int ans=0;
  9. char ch=getchar();
  10. while(!isdigit(ch))ch=getchar();
  11. while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
  12. return ans;
  13. }
  14. struct Line{int l,r,id;db k,b;}a[M];
  15. const db eps=1e-6;
  16. inline bool check(const int&x,const int&y,const int&z){
  17. if(!x)return 1;
  18. double t1=a[x].k*z+a[x].b,t2=a[y].k*z+a[y].b;
  19. return fabs(t1-t2)<=eps?x<y:t1<t2;
  20. }
  21. inline double calc(int x,int y){return (a[y].b-a[x].b)/(a[x].k-a[y].k);}
  22. namespace SGT{
  23. #define lc (p<<1)
  24. #define rc (p<<1|1)
  25. #define mid (l+r>>1)
  26. int id[N<<2];
  27. inline void change(int p,int l,int r,int k){
  28. if(!id[p])id[p]=k;
  29. int l1=id[p],l2=k;
  30. if(check(l1,l2,l))swap(l1,l2);
  31. if(l==r||fabs(a[l1].k-a[l2].k)<=eps){id[p]=l1;return;}
  32. db x=calc(l1,l2);
  33. if(x<l||x>r){id[p]=l1;return;}
  34. if(x<=mid)return id[p]=l2,change(lc,l,mid,l1);
  35. return id[p]=l1,change(rc,mid+1,r,l2);
  36. }
  37. inline void update(int p,int l,int r,int k){
  38. if(a[k].l<=l&&r<=a[k].r)return change(p,l,r,k);
  39. if(a[k].r<=mid)update(lc,l,mid,k);
  40. else if(a[k].l>mid)update(rc,mid+1,r,k);
  41. else update(lc,l,mid,k),update(rc,mid+1,r,k);
  42. }
  43. inline int query(int p,int l,int r,int k){
  44. if(l==r)return id[p];
  45. int ret=k<=mid?query(lc,l,mid,k):query(rc,mid+1,r,k);
  46. return check(ret,id[p],k)?id[p]:ret;
  47. }
  48. }
  49. int main(){
  50. for(ri lastans=0,cnt=0,a0,a1,b0,b1,tt=read(),op;tt;--tt){
  51. op=read();
  52. if(!op)a0=(read()+lastans-1)%39989+1,cout<<(lastans=SGT::query(1,1,40000,a0))<<'\n';
  53. else{
  54. a0=(read()+lastans-1)%39989+1;
  55. b0=(read()+lastans-1)%1000000000+1;
  56. a1=(read()+lastans-1)%39989+1;
  57. b1=(read()+lastans-1)%1000000000+1;
  58. if(a0>a1)swap(a0,a1),swap(b0,b1);
  59. if(a0==a1)++cnt,a[cnt]=(Line){a0,a1,cnt,0,max(b0,b1)};
  60. else ++cnt,a[cnt]=(Line){a0,a1,cnt,(db)(b0-b1)/(db)(a0-a1),(db)((ll)a0*b1-(ll)a1*b0)/(db)(a0-a1)};
  61. SGT::update(1,1,40000,cnt);
  62. }
  63. }
  64. return 0;
  65. }

2019.02.11 bzoj3165: [Heoi2013]Segment(线段树)的更多相关文章

  1. 2019.02.26 bzoj4311: 向量(线段树分治+凸包)

    传送门 题意: 支持插入一个向量,删去某一个现有的向量,查询现有的所有向量与给出的一个向量的点积的最大值. 思路: 考虑线段树分治. 先对于每个向量处理出其有效时间放到线段树上面,然后考虑查询:对于两 ...

  2. bzoj 3165: [Heoi2013]Segment 线段树

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

  3. BZOJ_3165_[Heoi2013]Segment_线段树

    BZOJ_3165_[Heoi2013]Segment_线段树 Description 要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段.记第i条被插入的线段的标号为i. 2.给定一个数 ...

  4. 2019.02.11 bzoj1568: [JSOI2008]Blue Mary开公司(线段树)

    传送门 题意简述:维护整体加一条线段,求单点极值. 思路: 直接上李超线段树维护即可. 代码: #include<bits/stdc++.h> #define ri register in ...

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

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

  6. codeforces 22E XOR on Segment 线段树

    题目链接: http://codeforces.com/problemset/problem/242/E E. XOR on Segment time limit per test 4 seconds ...

  7. BZOJ3165 : [Heoi2013]Segment

    建立线段树,每个节点维护该区间内的最优线段. 插入线段时,在线段树上分裂成$O(\log n)$棵子树,若与当前点的最优线段不相交,那么取较优的,否则暴力递归子树. 查询时在叶子到根路径上所有点的最优 ...

  8. Codeforces Round #149 (Div. 2) E. XOR on Segment (线段树成段更新+二进制)

    题目链接:http://codeforces.com/problemset/problem/242/E 给你n个数,m个操作,操作1是查询l到r之间的和,操作2是将l到r之间的每个数xor与x. 这题 ...

  9. codeforces 242E. XOR on Segment 线段树

    题目链接 给n个数, 两种操作, 一种是求区间内的数的和, 一种是将区间内的数异或x. 异或x没有什么思路, 单个异或肯定超时, 区间异或也没有办法做....后来才知道可以按位建线段树, 这样建20棵 ...

随机推荐

  1. 知识点:spring 完全手册

    什么是spring spring是一个开源框架,为简化企业级开发而生,使用spring可以使简单的java bean 实现以前只有EJG才能实现的功能. Spring是一个轻量级的控制反转(IoC)和 ...

  2. [图文教程]VS2017搭建opencv & C++ 开发环境

    首先从官网下载OpenCV最新版本 截至我写这文章,4.0已经发布预览版了,不过在这是没有的,只能用3.4.2: https://opencv.org/releases.html 一:安装 安装过程不 ...

  3. Java笔试面试题整理第七波

    转载至:http://blog.csdn.net/shakespeare001/article/details/51388516 作者:山代王(开心阳) 1.super的作用     在Java中su ...

  4. Nginx 安装配置教程

    1.安装 Nginx 的先决条件 依赖库:GCC, PCRE, zlib, OpenSSL . * GCC (Nginx 由 C 语言编写,因此需要在系统上安装一个编译工具) 基本上 Linux 自带 ...

  5. Spring的生命周期

    转:https://blog.csdn.net/liuxilil/article/details/4676088 Spring的生命周期. 容器启动,实例化所有实现了BeanFactoyPostPro ...

  6. 63.(原65)纯 CSS 创作一个摇摇晃晃的 loader

    原文地址:https://segmentfault.com/a/1190000015424389 修改后地址:https://scrimba.com/c/cqKv4VCR HTML code: < ...

  7. Selenium IDE录制脚本时弹出窗口的完美处理

    很多朋友录制脚本时新打开弹出窗口后无法定位元素,我也遇到同样的问题,国内没有什么好的资料,于是就阅读英文,不断尝试,感觉那个selectWindow(title)什么就是个坑,我用这种方法成功处理后得 ...

  8. leetcode238

    public class Solution { public int[] ProductExceptSelf(int[] nums) { int[] result = new int[nums.Len ...

  9. jeecg开源项目的IDEA的部署

    JEECG采用了SpringMVC + Hibernate + Minidao(类Mybatis) + Easyui(UI库)+ Jquery + Boostrap + Ehcache + Redis ...

  10. 将LinkedHashMap转换为需要的对象

    项目中,在获取json数据转换为list类型以后,本来以为可以直接使用,结果在使用中报错“java.lang.ClassCastException: java.util.LinkedHashMap c ...