题面

题解

李超线段树

为了与机房大佬 HYJ 同步伐

学习笔记请移步 yyb的博客

Code

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
const int N = 100005;
const int mod = 39989;
#define val(id, x) (k[id] * x + b[id])
using namespace std; int Q, cnt, ans;
struct node
{
int id;
double k, b;
} t[N << 2];
double k[N], b[N]; template < typename T >
inline T read()
{
T x = 0, w = 1; char c = getchar();
while(c < '0' || c > '9') { if(c == '-') w = -1; c = getchar(); }
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * w;
} void pushtag(int p, int l, int r, int id)
{
if(!t[p].id) { t[p] = (node) { id, k[id], b[id] }; return; }
int now = t[p].id;
double l1 = val(now, l), r1 = val(now, r), l2 = val(id, l), r2 = val(id, r);
if(l2 <= l1 && r2 <= r1) return;
if(l1 < l2 && r1 < r2) { t[p] = (node) { id, k[id], b[id] }; return; }
int mid = (l + r) >> 1; double x = (b[id] - b[now]) / (k[now] - k[id]);
if(x <= mid)
{
if(l1 <= l2) pushtag(p << 1, l, mid, id);
else pushtag(p << 1, l, mid, now), t[p] = (node) { id, k[id], b[id] };
}
else
{
if(l1 <= l2) pushtag(p << 1 | 1, mid + 1, r, now), t[p] = (node) { id, k[id], b[id] };
else pushtag(p << 1 | 1, mid + 1, r, id);
}
} void modify(int p, int l, int r, int ql, int qr, int id)
{
if(ql <= l && r <= qr) { pushtag(p, l, r, id); return; }
int mid = (l + r) >> 1;
if(ql <= mid) modify(p << 1, l, mid, ql, qr, id);
if(mid < qr) modify(p << 1 | 1, mid + 1, r, ql, qr, id);
} void check(int &a, int c, int x)
{
double y0 = val(a, x), y1 = val(c, x);
if(y1 > y0 || (fabs(y1 - y0) < 1e-7 && a > c)) a = c;
} int query(int p, int l, int r, int x)
{
if(l == r) return t[p].id;
int mid = (l + r) >> 1, res = t[p].id;
if(x <= mid) check(res, query(p << 1, l, mid, x), x);
else check(res, query(p << 1 | 1, mid + 1, r, x), x);
return res;
} int main()
{
/* freopen("cpp.in", "r", stdin);
freopen("cpp.out", "w", stdout);
*/ Q = read <int> ();
int opt, x0, x1, y0, y1;
while(Q--)
{
opt = read <int> ();
if(!opt)
{
// printf("%d\n", x0);
x0 = read <int> (), x0 = ((x0 + ans - 1) % mod + 1);
printf("%d\n", ans = query(1, 1, mod, x0));
}
else
{
x0 = read <int> (), y0 = read <int> (), x1 = read <int> (), y1 = read <int> ();
x0 = ((x0 + ans - 1) % mod + 1), y0 = ((y0 + ans - 1) % 1000000000 + 1);
x1 = ((x1 + ans - 1) % mod + 1), y1 = ((y1 + ans - 1) % 1000000000 + 1);
if(x0 > x1) swap(x0, x1), swap(y0, y1);
// printf("%d %d\n", x0, x1);
k[++cnt] = 1.0 * (y1 - y0) / (x1 - x0), b[cnt] = 1.0 * y0 - k[cnt] * x0;
modify(1, 1, mod, x0, x1, cnt);
}
}
return 0;
}
/*
3
1 3 5 7 7
1 3 9 7 3
0 5
*/

[题解] [HEOI2013] Segment的更多相关文章

  1. Bzoj 3165 [Heoi2013]Segment题解

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

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

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

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

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

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

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

  5. BZOJ 3165: [Heoi2013]Segment

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

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

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

  7. BZOJ3165 & 洛谷4097:[HEOI2013]Segment——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3165 https://www.luogu.org/problemnew/show/P4097 要求 ...

  8. HEOI2013 Segment

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

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

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

随机推荐

  1. [NOIP2018模拟赛10.18]自闭报告

    闲扯 这一天,菜鸡RyeCatcher又想起来了被毒瘤题支配的恐惧 今天比较好玩,还是ljy提醒才发现文件夹里有题面...不知道外面的人什么时候才发现 看完了题面,又回到了雅礼啥题也不会写的感觉 T1 ...

  2. kong命令(三)route

    介绍 route 是一套匹配客户端请求的规则.每个route都会匹配一个service,每个service可定关联多个route. 可以说service:route=1:n.一对多的关系.每个匹配到r ...

  3. g++ 生成C++ .so库文件,并调用示例

    Tags: g++ C++ so library   在Linux系统下用g++命令编译C++程序.也可以生成so,a链接库   示例一 编译时链接so库 Test.h 文件内容   Main.cpp ...

  4. bootstrap实现Carousel旋转木马(焦点图)

    引入bootstrap相关文件后,在html中写如下代码: <div class="col-lg-9" > <!-- Carousel============== ...

  5. js实现千位分隔符

    var s=123456789; var seperate=s.toString().replace(/\B(?=(\d{3})+$)/g,',');

  6. 简单实现app使用PC图片

    提一个很人性化的需求: 在自己的app里使用PC里的图片. 关键点:传输.怎么把图片从PC导入自己的APP. 因为iOS的封闭性,一般用户不能很方便把图片导入手机相册.笔者稍微想了下,实现功能其实也有 ...

  7. Cannot determine value type from string 'xxxxxx'

    Cannot determine value type from string 'xxxxxx' 查了一下,意思就是字段和属性名没有对上. 反复查看代码,字段名和属性名一致. 最后翻阅资料得知是因为构 ...

  8. webstorm如何调试vue项目的js

    webstorm如何调试vue项目的js webstormvuewebstorm调试jsjs 1.编辑调试配置,新建JavaScript调试配置,并设置要访问的url地址,如下图所示: 在URL处填写 ...

  9. PaaS容器集群优化之路

    1. 性能优化面对的挑战 以下是整个PaaS平台的架构 其中主要包括这些子系统: 微服务治理框架:为应用提供自动注册.发现.治理.隔离.调用分析等一系列分布式/微服务治理能力,屏蔽分布式系统的复杂度. ...

  10. PHP基础知识 - 字符串处理函数

    addcslashes — 为字符串里面的部分字符添加反斜线转义字符 addslashes — 用指定的方式对字符串里面的字符进行转义 bin2hex — 将二进制数据转换成十六进制表示 chop — ...