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

#include <cstdio>
#include <cstring>
#include <algorithm>
#define mid(a,b) ((a+b)>>1)
typedef long double ld;
const int Inf_x=39989;
const int Inf_y=1000000000;
int cnt,sz;
struct Line{ld k,b;int id;inline ld f(int x){return k*x+b;}inline ld point(Line a){return (b-a.b)/(a.k-k);}
};
struct lcSegment_Tree{lcSegment_Tree *ch[2];Line line;
}seg[Inf_x<<4],*root;
void pushdown(lcSegment_Tree *p,int l,int r,Line line){ld a1=p->line.f(l),a2=line.f(l),b1=p->line.f(r),b2=line.f(r);if(a1<=a2&&b1<=b2){p->line=line;return;}if(a1>a2&&b1>b2)return;ld x=line.point(p->line);if(x<=mid(l,r)){if(a1>a2)pushdown(p->ch[0],l,mid(l,r),p->line),p->line=line;else pushdown(p->ch[0],l,mid(l,r),line);}else{if(a1>a2)pushdown(p->ch[1],mid(l,r)+1,r,line);else pushdown(p->ch[1],mid(l,r)+1,r,p->line),p->line=line;}
}
void build(lcSegment_Tree *&p,int l,int r){p=seg+sz,++sz;if(l==r)return;build(p->ch[0],l,mid(l,r));build(p->ch[1],mid(l,r)+1,r);
}
void insert(lcSegment_Tree *p,int l,int r,int z,int y,Line line){if(z<=l&&r<=y){pushdown(p,l,r,line);return;}if(z<=mid(l,r))insert(p->ch[0],l,mid(l,r),z,y,line);if(mid(l,r)<y)insert(p->ch[1],mid(l,r)+1,r,z,y,line);
}
void query(lcSegment_Tree *p,int l,int r,int pos,ld last,int &ans){if(p->line.f(pos)>last||(p->line.f(pos)==last&&p->line.id<ans))ans=p->line.id,last=p->line.f(pos);if(l==r)return;if(pos<=mid(l,r))query(p->ch[0],l,mid(l,r),pos,last,ans);else query(p->ch[1],mid(l,r)+1,r,pos,last,ans);
}
int main(){int T,opt,zzh1,zzh2,wq1,wq2,lastans=0,x;Line temp;scanf("%d",&T),build(root,1,Inf_x);while(T--){scanf("%d",&opt);if(opt){scanf("%d%d%d%d",&zzh1,&zzh2,&wq1,&wq2);zzh1=(zzh1+lastans-1)%Inf_x+1,zzh2=(zzh2+lastans-1)%Inf_y+1,wq1=(wq1+lastans-1)%Inf_x+1,wq2=(wq2+lastans-1)%Inf_y+1;if(wq1>zzh1)wq1^=zzh1^=wq1^=zzh1,wq2^=zzh2^=wq2^=zzh2;if(wq1==zzh1)temp.k=0.,temp.b=std::max(wq2,zzh2);else temp.k=(ld)(zzh2-wq2)/(zzh1-wq1),temp.b=zzh2-temp.k*zzh1;temp.id=++cnt,insert(root,1,Inf_x,wq1,zzh1,temp);}else{scanf("%d",&x),x=(x+lastans-1)%Inf_x+1,lastans=0;query(root,1,Inf_x,x,0.,lastans);printf("%d\n",lastans);}}return 0;
}

转载于:https://www.cnblogs.com/TSHugh/p/7601879.html

【BZOJ 3165】 [Heoi2013]Segment 李超线段树相关推荐

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

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

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

    传送门 文章目录 题意: 思路: 题意: 实现以下两个操作: (1)(1)(1)在平面上加入一条线段.记第iii条被插入的线段的标号为iii (2)(2)(2)给定一个数kkk,询问与直线x=kx=k ...

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

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

  4. BZOJ 3165 Heoi2013 Segment 线段树

    题目大意:给定一个平面,多次插入一条线段,以及询问某个x值能截到的最大纵坐标 OTZ 一份详细的网址:http://hi.baidu.com/wyl8899/item/2deafd3a376ef2d4 ...

  5. 李超线段树 [Heoi2013]Segment

    问题 D: [Heoi2013]Segment 时间限制: 4 Sec 内存限制: 256 MB 题目描述 要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段.记第i条被插入的线段的标号为 ...

  6. BZOJ 3165 李超线段树

    思路: 李超线段树 我是把线段转成斜率的形式搞得 不知道有没有更简单的方法 //By SiriusRen #include <cmath> #include <cstdio> ...

  7. 【李超线段树】BZOJ3165 [Heoi2013]Segment

    题面在这里 李超线段树的裸题,不解释 示例程序: #include<cstdio> #include<cmath> #include<algorithm> usin ...

  8. BZOJ.3938.Robot(李超线段树)

    BZOJ UOJ 以时间\(t\)为横坐标,位置\(p\)为纵坐标建坐标系,那每个机器人就是一条\(0\sim INF\)的折线. 用李超线段树维护最大最小值.对于折线分成若干条线段依次插入即可. 最 ...

  9. 【BZOJ3165】Segment(李超线段树)

    题目来源:BZOJ3165 考虑以横坐标为下标维护线段树. 在每个结点维护一个标记,表示覆盖整个结点的最高线段,注意这个标记对整个区间都有作用,无需下传. 因为只有单点询问,所以可以不用维护区间的最高 ...

最新文章

  1. Python 关键字 global、nonlocal、yield用法
  2. java 穷举 排列组合,JavaScript递归穷举所有排列组合并找出重复值
  3. OUYA设备的购买和安装
  4. VTK:几何对象之TessellatedBoxSource
  5. CentOS 快速安装pip
  6. 可重入锁 不可重入锁_什么是可重入锁?
  7. java各种的不好_译文《最常见的10种Java异常问题》
  8. 学习php有多难,1.3 使用和学习PHP有多难
  9. mysql 禁用swap_MySQL如何避免使用swap
  10. 吃欢天面皮的26种吃法,中国人的福音!
  11. 知识表示的方法(1)——产生式表示法
  12. acx_pthread.m4
  13. 关于Diy51单片机的趣事
  14. Java统一日志处理
  15. 数组排序之后相邻数的最大差值
  16. 来电设置小技巧 拒收垃圾短信 拒接不想接的电话
  17. YDOOK: ANSYS Maxwell 19 教程11:Maxwell 2D 静电场怎样设置激励源
  18. 【面试系列】=>补充 以及ESLint
  19. shell怎么使用制表符_shell中vi替换特殊字符(制表符\t等)的方法
  20. 利用Freemarker模板引擎发送邮件

热门文章

  1. 防火墙(13)——实现路由转发功能(1)
  2. java hashmap 输出_JAVA如何把HashMap内容输出到文本文件
  3. 关于将struts2框架下,使自定义过滤器对部分的action(一个action或多个action)请求忽略的方法
  4. 如何安装 Linux 下的 Adobe Reader
  5. POJ 3046 Ant Counting
  6. mysql更新视图的时候有时候可以不满足视图条件的值也能更新成功
  7. CentOS 7.6 下安装 MySQL8.0.13
  8. ubuntu 18.04安装jdk8和eclipse
  9. CMake 进行调试
  10. [攻防世界 pwn]——time_formatter(内涵peak小知识)