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

#include <cstdio>
#include <cstring>
#include <algorithm>
#define mid(a,b) ((a+b)>>1)
typedef long double ld;
const int Inf_x=;
const int Inf_y=;
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[];
Line line;
}seg[Inf_x<<],*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[],l,mid(l,r),p->line),p->line=line;
else pushdown(p->ch[],l,mid(l,r),line);
}else{
if(a1>a2)pushdown(p->ch[],mid(l,r)+,r,line);
else pushdown(p->ch[],mid(l,r)+,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[],l,mid(l,r));
build(p->ch[],mid(l,r)+,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[],l,mid(l,r),z,y,line);
if(mid(l,r)<y)insert(p->ch[],mid(l,r)+,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[],l,mid(l,r),pos,last,ans);
else query(p->ch[],mid(l,r)+,r,pos,last,ans);
}
int main(){
int T,opt,zzh1,zzh2,wq1,wq2,lastans=,x;Line temp;
scanf("%d",&T),build(root,,Inf_x);
while(T--){
scanf("%d",&opt);
if(opt){
scanf("%d%d%d%d",&zzh1,&zzh2,&wq1,&wq2);
zzh1=(zzh1+lastans-)%Inf_x+,zzh2=(zzh2+lastans-)%Inf_y+,
wq1=(wq1+lastans-)%Inf_x+,wq2=(wq2+lastans-)%Inf_y+;
if(wq1>zzh1)wq1^=zzh1^=wq1^=zzh1,wq2^=zzh2^=wq2^=zzh2;
if(wq1==zzh1)temp.k=.,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,,Inf_x,wq1,zzh1,temp);
}else{
scanf("%d",&x),x=(x+lastans-)%Inf_x+,lastans=;
query(root,,Inf_x,x,.,lastans);
printf("%d\n",lastans);
}
}return ;
}

【BZOJ 3165】 [Heoi2013]Segment 李超线段树的更多相关文章

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

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

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

    题目链接 \(Click\) \(Here\) 李超线段树的模板.但是因为我实在太\(Naive\)了,想象不到实现方法. 看代码就能懂的东西,放在这里用于复习. #include <bits/ ...

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

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

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

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

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

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

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

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

  7. Bzoj 3165 [Heoi2013]Segment题解

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

  8. bzoj 3165: [Heoi2013]Segment 动态凸壳

    3165: [Heoi2013]Segment Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 202  Solved: 89[Submit][Stat ...

  9. BZOJ 3165: [Heoi2013]Segment

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

随机推荐

  1. 10.1.5 Comment类型【JavaScript高级程序设计第三版】

    注释在DOM中是通过Comment 类型来表示的.Comment 节点具有下列特征: nodeType 的值为8: nodeName 的值为"#comment": nodeValu ...

  2. ORB-SLAM 代码笔记(三)tracking原理

    ORB视觉里程计主体在tracking线程中

  3. 高德API+Python解决租房问题(.NET版)

    源码地址:https://github.com/liguobao/58HouseSearch 在线地址:58公寓高德搜房(全国版):http://codelover.link:8080/ 周末闲着无事 ...

  4. error LNK2001: unresolved external symbol "public: __thiscall ControllerInterface::ControllerInterface(class QObject *)" (??0ControllerInterface@@QAE@PAVQObject@@@Z) downloadcontroller.obj

    前几天刚遇到这个问题,但是今天再碰到就又要思考怎么解决.这次特别记录一下,以防下次碰到再手足无措: 1.看到这个报错第一感觉LNK关键字,表示连接错误,这种错误有几个可以下手的点 1)函数声明和定义是 ...

  5. jmeter完成CAS登录,并获取token(原创)

    思路: 1.系统完成CAS登录需要验证用户名/密码,以及动态授权参数 2.先通过指定url用正则提取出动态授权参数 3.完成登录需要cookie,需用正则提取出对应的cookie,已完成参数化的自动登 ...

  6. Python 3基础教程18-获取用户键盘输入

    有时候,我们需要获取用户的键盘输入的信息,然后得到信息,拿去做一些事情. 请看下面的demo.py # 练习如何通过键盘获取用户输入 x = input('What is your name?') p ...

  7. Django学习笔记(一):环境安装与简单实例

    Django学习笔记(一):环境安装与简单实例 通过本文章实现: Django在Windows中的环境安装 Django项目的建立并编写简单的网页,显示欢迎语与当前时间 一.环境安装 结合版本兼容性等 ...

  8. tp5 项目实战 初级 文字步骤

    项目实战 环境搭建 新建模块  admin 新建文件夹 controller   model  view View   中新建 user  index 相关样式  js   图片     放入publ ...

  9. 关于iframe的使用 以及自适应页面高度

    1. <a href="port" target="frame_view">港口资料</a> <iframe id="e ...

  10. redis-Windows下安装与操作

    Redis windows下安装 1.安装 (1)windows把redisbin_x32安装包放在电脑任意的盘里 (2)通过cmd找到对应目录:  D\redisbin_x32 (3)开始安装 D\ ...