传说中的“李超树”。

大意:给你若干线段,试求横坐标x上的最上方一条线段的编号。无则输出零。

解:用线段树维护。

插入的时候保存自己这个区间上可能成为最大值的线段,被抛弃的则看情况下放。

查询时从最底层向上查一路,沿途取得答案。

函数我用的是斜截式来存,脑残的把b写错了.....getY还传错参了。

调掉之后就一发AC!哈哈哈

 #include <cstdio>
#include <algorithm>
#include <cmath>
const int N = , M = , INF = 0x3f3f3f3f;
const double eps = 1e-; struct SG {
double k, b;
int l, r;
}sg[M]; inline double getY(int a, int x) {
SG t = sg[a];
if(x < t.l || t.r < x || !a) {
return (double)(-INF);
}
if(fabs(t.k - INF) < eps) {
return t.b;
}
return t.k * x + t.b;
} struct SegmentTree {
int ans[N << ]; void add(int L, int R, int v, int l, int r, int o) {
//printf("add : %d %d %d %d %d \n", L, R, v, l, r);
int mid = (l + r) >> ;
if(L <= l && r <= R) {
if(!ans[o]) { /// no segment
ans[o] = v;
//printf("ans[] = %d \n", ans[o]);
return;
}
if(l == r) { /// only one
if(getY(v, r) > getY(ans[o], r)) {
ans[o] = v;
//printf("ans[] = %d \n", ans[o]);
}
return;
}
double A = getY(v, l), B = getY(v, mid), C = getY(v, r);
double D = getY(ans[o], l), E = getY(ans[o], mid), F = getY(ans[o], r);
if(A > D && C > F) {
ans[o] = v;
//printf("ans[] = %d \n", ans[o]);
return;
}
/*if(v == 3 && l == 4 && r == 5) {
printf("B = %lf E = %lf\n", B, D);
}*/
if(!(A > D) && !(C > F)) {
return;
}
if(B > E) {
if(sg[v].k > sg[ans[o]].k) {
add(l, mid, ans[o], l, mid, o << );
ans[o] = v;
//printf("ans[] = %d \n", ans[o]);
}
else {
add(mid + , r, ans[o], mid + , r, o << | );
ans[o] = v;
//printf("ans[] = %d \n", ans[o]);
}
}
else {
if(sg[v].k > sg[ans[o]].k) {
add(mid + , r, v, mid + , r, o << | );
}
else {
add(l, mid, v, l, mid, o << );
}
}
return;
}
if(L <= mid) {
add(L, R, v, l, mid, o << );
}
if(mid < R) {
add(L, R, v, mid + , r, o << | );
}
return;
}
int ask(int p, int l, int r, int o) {
if(l == r) {
//printf("ask: %d %d %d return %d \n", p, l, r, ans[o]);
return ans[o];
}
int mid = (l + r) >> ;
int A;
if(p <= mid) {
A = ask(p, l, mid, o << );
}
else {
A = ask(p, mid + , r, o << | );
}
int t = ans[o];
if(getY(A, p) - eps > getY(t, p)) {
t = A;
}
else if(fabs(getY(A, p) - getY(t, p)) < eps) {
t = std::min(t, A);
}
//printf("ask: %d %d %d return %d \n", p, l, r, t);
return t;
}
}SgT; int main() {
int n, MO = , lastans = , num = ;
scanf("%d", &n);
for(int i = , f, x, xx, y, yy; i <= n; i++) {
scanf("%d", &f);
if(f) {
scanf("%d%d%d%d", &x, &y, &xx, &yy);
x = (x + lastans - ) % MO + ;
xx = (xx + lastans - ) % MO + ;
y = (y + lastans - ) % + ;
yy = (yy + lastans - ) % + ;
if(x > xx) {
std::swap(x, xx);
std::swap(y, yy);
}
sg[++num].l = x;
sg[num].r = xx;
if(x == xx) {
sg[num].k = 1.0 * INF;
sg[num].b = 1.0 * std::max(y, yy);
}
else {
sg[num].k = 1.0 * (y - yy) / (x - xx);
sg[num].b = y - sg[num].k * x;
}
SgT.add(x, xx, num, , MO, );
/*for(int i = 1; i <= 11; i++) {
SgT.ask(i, 1, MO, 1);
}
puts("");*/
}
else {
scanf("%d", &x);
x = (x + lastans - ) % MO + ;
lastans = SgT.ask(x, , MO, );
printf("%d\n", lastans);
}
} /*puts("");
for(int i = 1; i <= num; i++) {
printf("%lf %lf %d %d \n", sg[i].k, sg[i].b, sg[i].l, sg[i].r);
}*/ return ;
}

AC代码

调起来真难...很不理解为什么有人的李超树代码只有我的 1 / 3 长

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. BZOJ3165 : [Heoi2013]Segment

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

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

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

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

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

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

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

随机推荐

  1. webpack+vue 我的视角(持续更新)

    最近一直在研究webpack+vue的组合拳,现在分享一下: webpack就是一个项目管理工具,可以各种模块化加载,然后压缩,当然还有热加载技术(时灵时不灵..) vue是mv*模式的框架,组件化开 ...

  2. python之路--关于线程的一些方法

    一 . 线程的两种创建方式 from threading import Thread # 第一种创建方式 def f1(n): print('%s号线程任务'%n) def f2(n): print( ...

  3. Netcat实用操作

    写久了web倦了,第n次开始尝试网络开发,于是熟悉一下常用工具. 尝试了一下netcat来测试服务器,或者充当客户端都异常好用.于是记录一下常用的一下命令 1. 充当服务器,或者客户端进行访问 通过n ...

  4. Node & CLI

    Node & CLI cli 生成文件的原理是什么 https://nodejs.org/api/cli.html http://nodejs.cn/api/cli.html CLI & ...

  5. 在使用IWMS的时候,IWMS自带函数样式无法满足我们需求。以下一段JS是实现左图右字的适用于IWMS的代码。

    <div class="wz-list">里边需要有html做好的Html代码样式</div> <script> var attrnew = & ...

  6. qtp 自动化测试--点滴 菜单没有了,有些控件运行时找不到

    test项目页签下-没有了 菜单栏:file edit view insert 看不到了 1 解决:在startpage标签下-tool-option-点击 restore layout-确定 2 菜 ...

  7. Ubuntu16.04 启动纯文本界面方法

    问题: Ubuntu16.04 如何启动纯文本界面. 解决方法: 1.系统启动后,在登陆界面点击Ctrl+Shift+F1切换到文本登陆界面: 2.修改为默认从文本界面登陆: sudo vi /etc ...

  8. 数据库语法group by

    因为在做pgsql和mysql数据库时group by 有报错,但是在以前做mysql5.6的时候没有问题,虽然知道时违反了sql的语法问题,但是没有搞清楚什么原因,也找了不少资料,查找原因,在盆友的 ...

  9. case when 空值判断

    在对数据库进行查询时,遇到了一个问题:查询结果中的某一列需要判断另一列是否为空的来确定值,自然就想到了case when,于是写出了下面的SQL(其他部分省略): (case date when nu ...

  10. javascript中关于value的一个小知识点(value既是属性也是变量)

    今天在学习input的value值时,发现这么一个小知识点,以前理解不太透彻 [1]以下这种情况是常见情况,会弹出“测试内容” <input type="button" va ...