luoguP4097 [HEOI2013]Segment
题意
李超树板子题。
对每个区间维护该区间中点\(mid\)的最优线段。
插入一个线段:
求出这个线段的斜率和截距,注意特判无斜率的情况,得到\(y=kx+b\)。
之后开始在线段树上插入,假设当前节点\(p\)区间为\([l,r]\)包含在插入区间内,那么比较插入的线段\(id\)与当前维护的线段\(pos\),分类讨论:
1.\(id\)完全优于\(pos\):直接替换。
2.\(id\)完全劣于\(pos\):什么也不做。
3.找到在\(mid\)优的那条线段,将劣的那条下放到左右儿子中,那边有优势(相较于在\(mid\)更优的那条)下放哪边。
查询:
查到叶子节点后回溯,不断当前节点维护的(我们插入时把劣的那条下放,因此叶子结点不一定最优)比较。
code:
#include<bits/stdc++.h>
using namespace std;
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
const int maxn=40000;
const int maxm=1e5+10;
const double eps=1e-8;
int n,m,lastans,cnt;
int maxpos[maxn<<2];
double k[maxm],b[maxm];
inline int read()
{
char c=getchar();int res=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')res=res*10+c-'0',c=getchar();
return res*f;
}
inline double f(int x,int id){return k[id]*x+b[id];}
inline bool check(int a,int b,int x){return fabs(f(x,a)-f(x,b))>eps?f(x,a)<f(x,b):a>b;}
void insert(int p,int l,int r,int ql,int qr,int id)
{
int mid=(l+r)>>1;
if(l>=ql&&r<=qr)
{
if(check(id,maxpos[p],l)&&check(id,maxpos[p],r))return;
if(!check(id,maxpos[p],l)&&!check(id,maxpos[p],r)){maxpos[p]=id;return;}
if(!check(id,maxpos[p],mid))swap(id,maxpos[p]);
if(!check(id,maxpos[p],l))insert(ls(p),l,mid,ql,qr,id);
else insert(rs(p),mid+1,r,ql,qr,id);
return;
}
if(ql<=mid)insert(ls(p),l,mid,ql,qr,id);
if(qr>mid)insert(rs(p),mid+1,r,ql,qr,id);
}
int query(int p,int l,int r,int pos)
{
if(l==r)return maxpos[p];
int mid=(l+r)>>1,res;
res=pos<=mid?query(ls(p),l,mid,pos):query(rs(p),mid+1,r,pos);
res=check(res,maxpos[p],pos)?maxpos[p]:res;
return res;
}
int main()
{
n=read();
for(int i=1;i<=n;i++)
{
int op=read();
if(!op)
{
int k=(read()+lastans-1)%39989+1;
printf("%d\n",lastans=query(1,1,40000,k));
}
else
{
int x0=(read()+lastans-1)%39989+1,y0=(read()+lastans-1)%1000000000+1,x1=(read()+lastans-1)%39989+1,y1=(read()+lastans-1)%1000000000+1;
cnt++;
if(x1<x0)swap(x0,x1),swap(y0,y1);
if(x0==x1)k[cnt]=0,b[cnt]=max(y0,y1);
else k[cnt]=1.0*(y1-y0)/(x1-x0),b[cnt]=1.0*y0-1.0*k[cnt]*x0;
insert(1,1,40000,x0,x1,cnt);
}
}
return 0;
}
luoguP4097 [HEOI2013]Segment的更多相关文章
- bzoj 3165: [Heoi2013]Segment 动态凸壳
3165: [Heoi2013]Segment Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 202 Solved: 89[Submit][Stat ...
- 【BZOJ3165】[HEOI2013]Segment(李超线段树)
[BZOJ3165][HEOI2013]Segment(李超线段树) 题面 BZOJ 洛谷 题解 似乎还是模板题QwQ #include<iostream> #include<cst ...
- 洛谷 P4097 [HEOI2013]Segment 解题报告
P4097 [HEOI2013]Segment 题目描述 要求在平面直角坐标系下维护两个操作: 在平面上加入一条线段.记第 \(i\) 条被插入的线段的标号为 \(i\) 给定一个数 \(k\),询问 ...
- BZOJ 3165: [Heoi2013]Segment
3165: [Heoi2013]Segment Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 465 Solved: 187[Submit][Sta ...
- Bzoj 3165 [Heoi2013]Segment题解
3165: [Heoi2013]Segment Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 668 Solved: 276[Submit][Sta ...
- HEOI2013 Segment
传说中的“李超树”. 大意:给你若干线段,试求横坐标x上的最上方一条线段的编号.无则输出零. 解:用线段树维护. 插入的时候保存自己这个区间上可能成为最大值的线段,被抛弃的则看情况下放. 查询时从最底 ...
- BZOJ3165 : [Heoi2013]Segment
建立线段树,每个节点维护该区间内的最优线段. 插入线段时,在线段树上分裂成$O(\log n)$棵子树,若与当前点的最优线段不相交,那么取较优的,否则暴力递归子树. 查询时在叶子到根路径上所有点的最优 ...
- 【题解】Luogu P4097 [HEOI2013]Segment
原题传送门 这珂以说是李超线段树的模板题 按着题意写就行了,时间复杂度为\(O(n\log^2n)\) #include <bits/stdc++.h> #define N 40005 # ...
- BZOJ3165[Heoi2013]Segment——李超线段树
题目描述 要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段.记第i条被插入的线段的标号为i. 2.给定一个数k,询问与直线 x = k相交的线段中,交点最靠上的线段的编号. 输入 第一行 ...
随机推荐
- day83_11_1 阿里配python使用。
一.环境准备. 1.首先需要在支付包中注册开发者模式,并注册沙箱,模拟支付过程. https://openhome.alipay.com/platform/appDaily.htm?tab=info ...
- 3. 语法"陷阱"
1. C运算符优先级 运算符(优先级从高到低) 结合律 ++(后置).--(后置).()(函数调用).[].{}.(复合字面量).. .-> 从左往右 ++(前置).--(前置).-.+.~.! ...
- vue中template的作用及使用
先来看一个需求:下图div用v-for做了列表循环,现在想要span也一起循环,应该怎么做? 有3种方法可以实现 ①:直接用v-for对span也循环一次(该方法虽然可以使用,但不要用这种方式,因为 ...
- ubuntu 16.04上源码编译和安装cgal并编写CMakeLists.txt | compile and install cgal on ubuntu 16.04
本文首发于个人博客https://kezunlin.me/post/39ab7ed9/,欢迎阅读最新内容! compile and install cgal on ubuntu 16.04 Guide ...
- php使用supervisor管理进程脚本
supervisor是用python开发的一个在linux系统下的进程管理工具,可以方便的监听,启动,停止一个或多个进程.当一个进程被意外杀死后,supervisor监听到后,会自动重新拉起进程. 一 ...
- SpringCloud的入门学习之Netflix-eureka(Eureka的集群版搭建)
1.Eureka单机版的话,可能会出现单点故障,所以要保障Eureka的高可用,那么可以进行搭建Eureka的集群版. 高可用的Eureka的注册中心,将注册中心服务部署到多台物理节点上,形成一个集群 ...
- WPF自定义控件的制作
因为有时候需要定制化的控件,需要多个控件的组合及复杂功能的集成,这样可以考虑自定义用户控件.下面分享一个简单的数值增减功能的自定义控件作为说明. 效果图如下: 1.创建自定义用户控件(添加->新 ...
- Razor_06 列表的查询
Razor_06 列表的查询 列表的查询 同步/AJAX 查询 分局部视图[强类型] system.text.Json Ajax 返回 Json 数据 , System.Text.Json .循环引 ...
- C#用Call代替CallVirt之后的测试用例
一. C# 原始代码和直接结果 测试 C# 代码: class Program { static void Main(string[] args) { A c1 = new C(); c1.Foo() ...
- java核心技术第五篇之事务和MVC模式
第一部分:事务1.事务的简介: 1.1 在一组操作中(比如增加操作,修改操作),只有增加和修改操作都成功之后,这两个操作才能真正的成功. ,如果这两个操作中,有一个失败了,这两个操作都失败了. 1.2 ...