(neng了好久好久才糊弄懂得知识点...)

一、李超线段树

    在线动态维护一个二维平面直角坐标系,

    支持插入一条线段,

    询问与直线x = x0相交的所有线段中,交点y的最大/小值

    (若有多条线段符合条件,输出编号最小的线段的编号)

洛谷板子题-Segment[HEOI2013]-洛谷T4097

二、add操作

整个李超线段树的核心就是add操作

1.特判 l == r

已经到了一个点

如果该点之前没有维护线段,直接维护现在的线段

如果该点已经维护过,选择纵坐标靠上的直线(点),纵坐标相同,选择编号较小的

2.如果没有恰好放在区间里

如果不过mid,根据与mid关系左右查找

如果过mid,劈两半分别查找

3.如果找到了恰好的区间

如果该区间没有维护线段,维护该线段

如果有,

(1).如果中点处新的有,留下新的,把旧的中,稍大的一般留下(全劣则淘汰),下放到对应的子区间。

(2).如果中点处值相同。一般情况选择新的劈断的下放(省的建线段)。但是当新的编号较小,并且新的线段的右端点的纵坐标大于等于旧的,将旧的右半部分下放(使mid处一定取得的使新的线段,也就是编号较小的)

(3).如果中点处旧的优,同理...

//李超线段树
#include<cstdio>
#include<algorithm>
using namespace std; inline int read()
{
int sum = ,p = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-')
p = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
(sum *= ) += ch - '';
ch = getchar();
}
return sum * p;
} #define mid ((l + r)>>1)
#define lson l,mid,o<<1
#define rson mid + 1,r,o<<1|1 const int mod1 = ,mod2 = 1e9,N = ;;
int n,ans,lastans,id;//ans实际答案,lastans上次查询的答案,id给函数编的号
int sx1[N << ],sx2[N << ],sy1[N << ],sy2[N << ],sum[N << ];
bool vis[N << ];
double tval; //求节点储存的原函数的o点的值
double G(int o,int x1,int y1,int x2,int y2)
{
if(x1 == x2)
return y2;
else
return 1.0 *(o - x2) *(y1 - y2)/(x1 - x2) +y2;
} //当新加入的函数是一条垂直于x轴的直线时 的修改操作
void change(int x,int v,int tot,int l,int r,int o)
{
if(l == r)
{
if(!vis[o])
{
sx1[o] = sx2[o] = l;
sy1[o] = sy2[o] = v;
sum[o] = tot;
vis[o] = true;
}
else
{
double cnt = G(x,sx1[o],sy1[o],sx2[o],sy2[o]);
if(cnt > v || (cnt == v && tot < sum[o]))
{
sx1[o] = sx2[o] = l;
sy1[o] = sy2[o] = v;
sum[o] = tot;
}
}
return;
}
if(mid >= x)
change(x,v,tot,lson);
else
change(x,v,tot,rson);
} //求两个函数的交点
double Inter(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4)
{
double a,b,c,d,g,h,f,t,s;
a = x2 - x1;
b = x3 - x4;
c = y2 - y1;
d = y3 - y4;
g = x3 - x1;
h = y3 - y1;
f = a *d - b * c;
t = (d * g - b * h)/f;
return x1 +t * (x2 - x1);
} void update(int ql,int qr,int x1,int y1,int x2,int y2,int tot,int l,int r,int o)
{
if(ql <= l && r <= qr)
{
if(!vis[o])
{
sx1[o] = x1,sy1[o] = y1,sx2[o] = x2,sy2[o] = y2;
sum[o] = tot;
vis[o] = true;
}
else
{
double f1,f2,f3,f4;
f1 = G(l,x1,y1,x2,y2);
f2 = G(l,sx1[o],sy1[o],sx2[o],sy2[o]);
f3 = G(r,x1,y1,x2,y2);
f4 = G(r,sx1[o],sy1[o],sx2[o],sy2[o]);
if(f1 <= f2 && f3 <= f4)
return;
else if(f1 >= f2 && f3 >= f4)
{
sx1[o] = x1,sy1[o] = y1,sx2[o] = x2,sy2[o] = y2;
sum[o] = tot;
}
else
{
double spot = Inter(x1,y1,x2,y2,sx1[o],sy1[o],sx2[o],sy2[o]);
if(f1 >= f2)
{
if(spot <= mid)
update(ql,qr,x1,y1,x2,y2,tot,lson);
else
{
update(ql,qr,sx1[o],sy1[o],sx2[o],sy2[o],sum[o],rson);
sx1[o] = x1,sy1[o] = y1,sx2[o] = x2,sy2[o] = y2;
sum[o] = tot;
}
}
else
{
if(spot > mid)
update(ql,qr,x1,y1,x2,y2,tot,rson);
else
{
update(ql,qr,sx1[o],sy1[o],sx2[o],sy2[o],sum[o],lson);
sx1[o] = x1,sy1[o] = y1,sx2[o] = x2,sy2[o] = y2;
sum[o] = tot;
}
}
}
}
return;
}
if(ql <= mid)
update(ql,qr,x1,y1,x2,y2,tot,lson);
if(qr > mid)
update(ql,qr,x1,y1,x2,y2,tot,rson);
} void query(int x,int l,int r,int o)
{
if(vis[o])
{
double cnt = G(x,sx1[o],sy1[o],sx2[o],sy2[o]);
if(cnt > tval || cnt == tval && sum[o] < ans)
{
tval = cnt;
ans = sum[o];
}
}
if(l == r)
return;
if(mid >= x)
query(x,lson);
else
query(x,rson);
} int main()
{
n = read();
while(n--)
{
int opt = read();
if(!opt)
{
int x = read();
x = (x + lastans - )%mod1 + ;
ans = ;
tval = ;
query(x,,,);
printf("%d\n",ans);
lastans = ans;
}
else
{
int x1 = read(),y1 = read(),x2 = read(),y2 = read();
x1 = (x1 + lastans - )%mod1 + ;
y1 = (y1 + lastans - )%mod2 + ;
x2 = (x2 + lastans - )%mod1 + ;
y2 = (y2 + lastans - )%mod2 + ;
if(x1 > x2)
{
swap(x1,x2);
swap(y1,y2);
}
if(x1 == x2)
change(x1,max(y1,y2),++id,,,);
else
update(x1,x2,x1,y1,x2,y2,++id,,,);
}
}
return ;
}

李超线段树(segment[HEOI2013]-洛谷T4097)的更多相关文章

  1. 2018.07.23 洛谷P4097 [HEOI2013]Segment(李超线段树)

    传送门 给出一个二维平面,给出若干根线段,求出x" role="presentation" style="position: relative;"&g ...

  2. 洛谷P4097 [HEOI2013]Segment(李超线段树)

    题面 传送门 题解 调得咱自闭了-- 不难发现这就是个李超线段树,不过因为这里加入的是线段而不是直线,所以得把线段在线段树上对应区间内拆开之后再执行李超线段树的操作,那么复杂度就是\(O(n\log^ ...

  3. 【洛谷P4097】Segment 李超线段树

    题目大意:维护一个二维平面,给定若干条线段,支持询问任意整数横坐标处对应的纵坐标最靠上的线段的 id,相同高度取 id 值较小的,强制在线. 题解:初步学习了李超线段树.李超线段树的核心思想在于通过标 ...

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

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

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

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

  6. 洛谷P4069 [SDOI2016]游戏(李超线段树)

    题意 题目链接 Sol 这题细节好多啊qwq..稍不留神写出一个小bug就要调1h+.. 思路就不多说了,把询问区间拆成两段就是李超线段树板子题了. 关于dis的问题可以直接维护. // luogu- ...

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

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

  8. 洛谷P4069 [SDOI2016]游戏(李超线段树)

    题面 传送门 题解 如果我们把路径拆成两段,那么这个路径加可以看成是一个一次函数 具体来说,设\(dis_u\)表示节点\(u\)到根节点的距离,那么\((x,lca)\)这条路径上每个节点的权值就会 ...

  9. 洛谷P4254 [JSOI2008]Blue Mary开公司(李超线段树)

    题面 传送门 题解 李超线段树板子 具体可以看这里 //minamoto #include<bits/stdc++.h> #define R register #define fp(i,a ...

随机推荐

  1. java基础之 java注释

    JAVA里有2中注释风格. 一种以 "/*" 开始以 "*/" 结尾,另一种是以 "//" 起头的. 被注释的内容不会被java虚拟机编译, ...

  2. open函数 文件设置缓冲

    # 注释 将文件写入硬件设备时,使用系统调用,这类I/O操作一般时间很长 # 为了减少I/O次数操作,文件通常使用缓冲区(有足够的数据才进行系统调用) # 文件缓冲行为分为: # 全缓冲: open函 ...

  3. JS高级---总结apply和call方法的使用

    apply和call的使用方法 apply的使用语法   函数名字.apply(对象,[参数1,参数2,...]); 方法名字.apply(对象,[参数1,参数2,...]);   call的使用语法 ...

  4. LVS-DR模式搭建

    出于对架构的兴趣,一有时间我就会了解一下如何搭建一个高并发,高可用,可扩展的服务器运行环境.LVS-DR究竟现在的企业运用频率有多高其实我也不清楚,本文是下班之余断断续续研究搭建笔录,并且仅仅在vir ...

  5. java下载和环境变量配置

    初学java,以前没有接触过这方面内容,所以简要记录一下我2个月的学习流程. 首先,我在慕课上学习java的基础,浙江大学翁恺老师的课程. 下载ECLIPSE-java 进入官网:https://ww ...

  6. PLSQL Developer12注册码

    product code: 4vkjwhfeh3ufnqnmpr9brvcuyujrx3n3le serial Number:226959 password: xs374ca 绝对靠谱

  7. Java常量,变量,对象(字面量)在JVM内存中的存储位置

    Java常量,变量,对象(字面量)在JVM内存中的存储位置 2019-02-26 18:13:09 HD243608836 阅读数 540  收藏 更多 分类专栏: JAVA jvm   苦苦研究了快 ...

  8. koa2第一天 安装koa2

    安装全局koa2:npm install -g koa2 -generator 创建一个koa2文件夹:koa2 -e koa2 进入koa2文件夹:cd koa2 安装npm模块:npm insta ...

  9. Apache Kafka(五)- Safe Kafka Producer

    Kafka Safe Producer 在应用Kafka的场景中,需要考虑到在异常发生时(如网络异常),被发送的消息有可能会出现丢失.乱序.以及重复消息. 对于这些情况,我们可以创建一个“safe p ...

  10. LED Decorative Light Manufacturer Introduction: LED Metal Table Light

    Nowadays, when many people choose the desk light, they are worried that it will not be used for a lo ...