题意

李超树板子题。

对每个区间维护该区间中点\(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的更多相关文章

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

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

  2. 【BZOJ3165】[HEOI2013]Segment(李超线段树)

    [BZOJ3165][HEOI2013]Segment(李超线段树) 题面 BZOJ 洛谷 题解 似乎还是模板题QwQ #include<iostream> #include<cst ...

  3. 洛谷 P4097 [HEOI2013]Segment 解题报告

    P4097 [HEOI2013]Segment 题目描述 要求在平面直角坐标系下维护两个操作: 在平面上加入一条线段.记第 \(i\) 条被插入的线段的标号为 \(i\) 给定一个数 \(k\),询问 ...

  4. BZOJ 3165: [Heoi2013]Segment

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

  5. Bzoj 3165 [Heoi2013]Segment题解

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

  6. HEOI2013 Segment

    传说中的“李超树”. 大意:给你若干线段,试求横坐标x上的最上方一条线段的编号.无则输出零. 解:用线段树维护. 插入的时候保存自己这个区间上可能成为最大值的线段,被抛弃的则看情况下放. 查询时从最底 ...

  7. BZOJ3165 : [Heoi2013]Segment

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

  8. 【题解】Luogu P4097 [HEOI2013]Segment

    原题传送门 这珂以说是李超线段树的模板题 按着题意写就行了,时间复杂度为\(O(n\log^2n)\) #include <bits/stdc++.h> #define N 40005 # ...

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

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

随机推荐

  1. 201871010126 王亚涛《面向对象程序设计 JAVA》 第十三周学习总结

      内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/ ...

  2. 查看oracle表空间内存

    查看oracle表空间内存 SELECT a.tablespace_name "表空间名", total "表空间大小", free "表空间剩余大小 ...

  3. 数位DP入门详解+题目推荐

    \(update:2019-9-6\) 博客里某些东西没有解释清楚,完善了对应的解释 在开始之前,我们先来看一道题--题目链接 题目要求,相邻两位的差大于等于2,那么我们先来构造一个试一试. 比如说\ ...

  4. [题解向] Manacher简单习题

    \(1\) LG1659 [国家集训队]拉拉队排练 求前\(k\)大的奇数长度回文串的长度之积. \(\rm |S|\leq 1e6,K\leq 1e12\) --一开始觉得挺水,就开始二分最少长度能 ...

  5. OpenDaylight开发hello-world项目之代码框架搭建

    OpenDaylight开发hello-world项目之开发环境搭建 OpenDaylight开发hello-world项目之开发工具安装 OpenDaylight开发hello-world项目之代码 ...

  6. Filter 原理

    二.Filter 原理 2.1 Filter 概述 Filter(过滤器)是 DirectShow 中最基本的概念.DirectShow 是通过 Filter Graph 来管理 Filter 的.F ...

  7. python做中学(七)ord() 函数

    描述 ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII ...

  8. Jenkins—Master/Slave模式

    Jenkins可部署在windows或者linux平台上,项目系统的用户多数为windows系统.如果Jenkins部署在linux上,而自动化任务要在windows平台执行,那么就需要使用Jenki ...

  9. Selenium+java - 关于富文本编辑器的处理

    什么是富文本编辑器? 富文本编辑器,Rich Text Editor, 简称 RTE, 是一种可内嵌于浏览器,所见即所得的文本编辑器.具体长啥样,如下图: 通过自动化操作富文本编辑器 模拟场景:在富文 ...

  10. Generating a new SSH key

    Open Git Bash. Paste the text below, substituting in your GitHub email address. $ ssh-keygen -t rsa ...