HEOI2013 Segment

时间:2022-03-21 01:24:30

传说中的“李超树”。

大意:给你若干线段,试求横坐标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&colon; &lbrack;Heoi2013&rsqb;Segment 动态凸壳

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

  2. 【BZOJ3165】&lbrack;HEOI2013&rsqb;Segment(李超线段树)

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

  3. 洛谷 P4097 &lbrack;HEOI2013&rsqb;Segment 解题报告

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

  4. BZOJ 3165&colon; &lbrack;Heoi2013&rsqb;Segment

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

  5. Bzoj 3165 &lbrack;Heoi2013&rsqb;Segment题解

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

  6. BZOJ3165 &colon; &lbrack;Heoi2013&rsqb;Segment

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

  7. 【题解】Luogu P4097 &lbrack;HEOI2013&rsqb;Segment

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

  8. BZOJ3165&lbrack;Heoi2013&rsqb;Segment——李超线段树

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

  9. Luogu P4097 &lbrack;HEOI2013&rsqb;Segment 李超线段树

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

随机推荐

  1. 微信小程序首次官方分享的纪要

    先交代备注: 这次有关小程序的分享只有技术的 QA环节,其他如产品.入口.流量.与公众号的整合等等,回答都是暂时无法给出答案或不确定: 小程序最终发布时间官方也还未确定,不过说应该就是近期: 小程序的 ...

  2. 用onerror处理图片获取失败问题

    <script> function errorImg(){ //当前事件的源 var obj=event.srcElement; //需要修改的图片的url obj.src="h ...

  3. GO&lowbar;order

    Gpos Q8RP81 有GO:0000015 P47437 有GO:0000049 P06535 有GO:0000155 Q99027 有GO:0000160 P35594 有GO:0000166 ...

  4. log的简单说明

    log的简单说明 @(NS3相关)[core][log] NS3中的日志功能是非常完善与灵活,大家有需要显示一些调试或者警告信息时最好使用log,不再使用标准输入来输出中间信息. 头文件:ns3/lo ...

  5. JavaWeb基础&colon; ServletContext

    基本概念 Web容器在启动时,会为每个Web应用程序都创建一个对应的ServletContext对象,它代表当前Web应用. ServletContext(javax.servlet.http.Ser ...

  6. 深入浅出TCP协议的三次握手过程

    TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 每一次TCP连接都需要三个阶段:连接建立.数据传送和连接释放.“三次握手”就发生在连接建立阶段. 1.三次握手( ...

  7. 【CSS 第六天】三种简历

    1.盒子模型 2.三种简历 利用float和CSS制作内容一致,但是样式不一致的三种简历. 代码 3.效果 style-1 3.2效果2 效果三

  8. 微软是如何让我再次爱上&period;Net Core和C&num;的

    “为什么你还想用ASP.NET,难道你还活在90年代吗?”这正是我的一位老同事在几年前我们即将开始的项目中我提出考虑使用ASP.NET时所说的话.当时我很大程度上认同他的看法,微软已经开发了伟大的开发 ...

  9. DevExpress XtraScheduler日程管理控件应用实例(2)-- 深入理解数据存储

    DevExpress年终击穿底价,单套授权低至67折!查看详情>>> 在上篇随笔<DevExpress XtraScheduler日程管理控件应用实例(1)-- 基本使用&gt ...

  10. MVC Razor与javascript混编(js中嵌入razor)

    其中的关键是输出js上的纯文本内容,让浏览器解析为其中的js代码 <script>    BUI.use('common/main',function(){        var conf ...