【BZOJ 3165】 [Heoi2013]Segment 李超线段树
所谓李超线段树就是解决此题一类的问题(线段覆盖查询点最大(小)),把原本计算几何的题目变成了简单的线段树,巧妙地结合了线段树的标记永久化与标记下传,在不考虑精度误差的影响下,打法应该是这样的。
#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 李超线段树的更多相关文章
- BZOJ.3165.[HEOI2013]Segment(李超线段树)
BZOJ 洛谷 对于线段,依旧是存斜率即可. 表示精度误差一点都不需要管啊/托腮 就我一个人看成了mod(10^9+1)吗.. //4248kb 892ms #include <cstdio&g ...
- Luogu P4097 [HEOI2013]Segment 李超线段树
题目链接 \(Click\) \(Here\) 李超线段树的模板.但是因为我实在太\(Naive\)了,想象不到实现方法. 看代码就能懂的东西,放在这里用于复习. #include <bits/ ...
- BZOJ3165: [Heoi2013]Segment(李超线段树)
题意 题目链接 Sol 李超线段树板子题.具体原理就不讲了. 一开始自己yy着写差点写自闭都快把叉积搬出来了... 后来看了下litble的写法才发现原来可以写的这么清晰简洁Orz #include& ...
- P4097 [HEOI2013]Segment 李超线段树
$ \color{#0066ff}{ 题目描述 }$ 要求在平面直角坐标系下维护两个操作: 在平面上加入一条线段.记第 i 条被插入的线段的标号为 i 给定一个数 k,询问与直线 x = k 相交的线 ...
- BZOJ3165[Heoi2013]Segment——李超线段树
题目描述 要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段.记第i条被插入的线段的标号为i. 2.给定一个数k,询问与直线 x = k相交的线段中,交点最靠上的线段的编号. 输入 第一行 ...
- 【BZOJ-3165】Segment 李超线段树(标记永久化)
3165: [Heoi2013]Segment Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 368 Solved: 148[Submit][Sta ...
- Bzoj 3165 [Heoi2013]Segment题解
3165: [Heoi2013]Segment Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 668 Solved: 276[Submit][Sta ...
- bzoj 3165: [Heoi2013]Segment 动态凸壳
3165: [Heoi2013]Segment Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 202 Solved: 89[Submit][Stat ...
- BZOJ 3165: [Heoi2013]Segment
3165: [Heoi2013]Segment Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 465 Solved: 187[Submit][Sta ...
随机推荐
- typecho博客组插件:openSug.js百度搜索框下拉提示免费代码
Typecho候选搜索增强插件:安装openSug插件即可获得带有“搜索框提示”功能的搜索框,让Typecho搜索更便捷! 支持百度.谷歌.雅虎.Yandex.360好搜.UC神马.酷狗.优酷.淘 ...
- Win7下如何安装python pygame的whl包
看了小甲鱼的python教程,对那个python版本的打飞机游戏很感兴趣,尝试运行,居然报错了,提示缺少pygame包: 仔细一看需要安装一个pygame的包,默认安装好python是不包括这个包的, ...
- C++拷贝构造函数 的理解
#include <iostream> using namespace std; //拷贝构造函数的理解 class Point { public: Point(); Point(int ...
- 005---基于UDP的套接字
基于UDP的套接字 udp不同于tcp协议:不需要经过三次握手.四次挥手.直接发送数据就行. 服务端 import socket ip_port = ('127.0.0.1', 8001) buffe ...
- java 第三章 流程控制语句
1.条件语句 (1)if 语句 ( 单一条件) if (表达式){ 执行语句块 } (2)执行流程 · if 语句 条件表达式可以是任何一种逻辑表达式 如果表达式值为true,则执行花括号的内容后 ...
- hdu1233 继续畅通工程 (最小生成树——并查集)
还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- C#的特性Attribute
一.什么是特性 特性是用于在运行时传递程序中各种元素(比如类.方法.结构.枚举.组件等)的行为信息的声明性标签,这个标签可以有多个.您可以通过使用特性向程序添加声明性信息.一个声明性标签是通过放置在它 ...
- Ubuntu server中 samba的安装和简单配置
samba是Linux系统上的一种文件共享协议,可以实现Windows系统访问Linux系统上的共享资源,现在介绍一下如何在Ubuntu 14.04上安装和配置samba 工具/原料 Ubuntu ...
- 初步学习pg_control文件之二
接前文:初步认识pg_control文件 继续学习,pg_control文件在何处形成的?是在initdb的时候,运用的函数如下: /* * This func must be called ONCE ...
- android去掉button默认的点击阴影
查了资料,发现别人都是说加一个style属性. style="?android:attr/borderlessButtonStyle" 加上了确实管用,但是我绝不是不求甚解的人.追 ...