对空防御的训练

256MB / 1s ; defense.cpp / c / pas / in / out

【题目描述】
秋月十分擅长对空作战。尽管如此,必要的训练也不能懈怠。
在一次训练中,会有m个事件发生。
1. 出现一架飞机在(x1,y1)到(x2,y2)的线段上出现并来回飞行。
2. 秋月接到指令,要在x坐标为a处击坠一架飞行路线经过该位置的飞机。
为了确保击坠的可能性最大,秋月将选择在x位置时高度最低的飞机。
由于只是训练任务,秋月并不会真正地击坠飞机。你只需要在每次接到指令时告诉她高度最低的飞机的y坐标就可以了。

【输入格式】
第一行一个整数m,表示事件数。
接下来m行,每行有若干正整数,第一个数D表示事件类型。
若D=1,表示出现了一架飞机,接下来四个正整数x1,y1,x2,y2。
若D=2,接下来一个正整数a,表示秋月询问在x=a处能击坠的飞机的最低高度是多少。

【输出格式】
对于每个询问操作,输出一行一个实数,表示该飞机的y坐标。保证存在这样的飞机。

【样例数据】
defense1.in
4
1 1 1 3 3
2 3
1 1 3 3 1
2 3
defense1.out
3
1
defense2.in
7
1 3 6 5 7
1 6 1 9 7
1 1 3 7 7
2 3
2 7
1 5 2 10 4
2 7
defense2.out
4.333333
3
2.8

【数据范围】
对于30%的数据,m≤5000。
对于另30%的数据,1≤x,y,a≤100000。
对于100%的数据,1≤m≤200000,1≤x,y,a≤10^9,x1<x2。
【评分方式】
本题有自定义校验器。当你的答案与标准答案的绝对误差不超过1e-4时,便被认为正确。

思路:
线段树维护线段,对于可以判断整体最小线段的区间直接更新,否则进行递归处理。处理到长度为1 的节点即可停止。永久化标记,查询时需要考虑路径上所有节点的标记,取最小值。
其实和BZOJ3165差不多,只是求最小的y,不强制在线而已。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#define LL long long
#define inf 1000000000
#define N 200010
using namespace std;int m, root, tot=1;
const double eps=1e-8;struct Edge{int lson, rson;double ly, ry;
}tree[N*30];inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}inline double get(int x, int X1, double Y1, int X2, double Y2){//线段上横坐标为x时的y return (Y2-Y1) * (x-X1) / (X2-X1) + Y1;
}int modify(int pos, int l, int r, int x1, double y1, int x2, double y2){if ( !pos ){pos = ++tot;tree[pos].ly = tree[pos].ry = inf;}int mid = (l + r) >> 1;if (x1 <= l && x2 >= r){//线段覆盖整个区间 double ly = get(l, x1, y1, x2, y2), ry = get(r, x1, y1, x2, y2);double sl = ly - tree[pos].ly, sr = ry - tree[pos].ry;if (sl<=eps && sr<=eps){//维护更低的y tree[pos].ly = ly;tree[pos].ry = ry;return pos;}if (sl>=-eps && sr>=-eps)return pos;//-----------------------------------------------------交错线段if (fabs(sl) < fabs(sr)){//由相似三角形可得交点在左区间 if (sr <= eps){tree[pos].lson = modify(tree[pos].lson, l, mid, l, tree[pos].ly, r, tree[pos].ry);//递归处理左区间 tree[pos].ly = ly;tree[pos].ry = ry;//当前区间相当于右区间(更新) 那么就不需要新增右区间了 } elsetree[pos].lson = modify(tree[pos].lson, l, mid, x1, y1, x2, y2);} else {//同上 if (sl <= eps){tree[pos].rson = modify(tree[pos].rson, mid+1, r, l, tree[pos].ly, r, tree[pos].ry);tree[pos].ly = ly;tree[pos].ry = ry;} elsetree[pos].rson = modify(tree[pos].rson, mid+1, r, x1, y1, x2, y2);}}else {if (x1 <= mid)tree[pos].lson = modify(tree[pos].lson, l, mid, x1, y1, x2, y2);if (x2 > mid)tree[pos].rson = modify(tree[pos].rson, mid+1, r, x1, y1, x2, y2);}return pos;
}double query(int pos, int l, int r, int x){if ( !pos ) return inf;if ( l == r ) return tree[pos].ly;int mid = (l + r) >> 1;double ans = get(x, l, tree[pos].ly, r, tree[pos].ry);if (x <= mid)//递归左右区间 return min(ans, query(tree[pos].lson, l, mid, x));elsereturn min(ans, query(tree[pos].rson, mid+1, r, x));
}int main(){freopen ("defense.in", "r", stdin);freopen ("defense.out", "w", stdout);m = read();int x1, x2;double y1, y2;root = 1;tree[root].ly = tree[root].ry = inf;while ( m-- ){x1 = read();if (x1 == 1){x1 = read(); y1 = read(); x2 = read(); y2 = read();modify(root, 1, inf, x1, y1, x2, y2);}else {x1 = read();printf("%.10f\n", query(root, 1, inf, x1));}}return 0;
}

对空防御的训练 改编自BZOJ3165 (线段树永久化标记 李超线段树)相关推荐

  1. 【BZOJ3165】Segment(李超线段树)

    题目来源:BZOJ3165 考虑以横坐标为下标维护线段树. 在每个结点维护一个标记,表示覆盖整个结点的最高线段,注意这个标记对整个区间都有作用,无需下传. 因为只有单点询问,所以可以不用维护区间的最高 ...

  2. 【李超线段树】BZOJ3165 [Heoi2013]Segment

    题面在这里 李超线段树的裸题,不解释 示例程序: #include<cstdio> #include<cmath> #include<algorithm> usin ...

  3. 势能线段树(吉司机线段树)专题

    势能线段树(吉司机线段树)专题 势能线段树在近期训练时遇到了好几次,但是由于本人太懒一直没补完,结果ICPC网络赛还真就出了一道势能线段树Orz--结果当然是没做出来--痛定思痛,这回把之前欠的一块儿 ...

  4. 数据结构专题-学习笔记:李超线段树

    数据结构专题 - 学习笔记:李超线段树 1. 前言 2. 详解 3. 应用 4. 总结 5. 参考资料 1. 前言 本篇博文是博主学习李超线段树的学习笔记. 2020/12/21 的时候我在 线段树算 ...

  5. 树套树 ----- P1975 [国家集训队]排队(树状数组套权值线段树求动态逆序对)

    解题思路: 首先我们知道交换两个数a[l]和a[r]a[l]和a[r]a[l]和a[r]影响到的区间是[l+1,r−1][l+1,r-1][l+1,r−1] 对于a[l]a[l]a[l],我们要减去[ ...

  6. 李超线段树(Li-Chao Segment Tree)

    李超线段树 李超线段树是一种用于维护平面直角坐标系内线段关系的数据结构.它常被用来处理这样一种形式的问题:给定一个平面直角坐标系,支持动态插入一条线段,询问从某一个位置 (X,+∞)(X,+\inft ...

  7. BZOJ 1568 李超线段树

    思路: 李超线段树裸题 //By SiriusRen #include <cmath> #include <cstdio> #include <cstring> # ...

  8. 【BZOJ 3165】 [Heoi2013]Segment 李超线段树

    所谓李超线段树就是解决此题一类的问题(线段覆盖查询点最大(小)),把原本计算几何的题目变成了简单的线段树,巧妙地结合了线段树的标记永久化与标记下传,在不考虑精度误差的影响下,打法应该是这样的. #in ...

  9. D-query SPOJ - DQUERY(求区间不同数的个数)(树状数组||线段树+离散)(主席树+在线)

    English Vietnamese Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query ...

最新文章

  1. MATLAB简易验证码识别程序介绍
  2. 2018年IT市场最大的技术趋势和热点预测
  3. 我艹,MySQL数据量大时,delete操作无法命中索引。
  4. Docker 17.03系列教程(一)Docker EE/Docker CE简介与版本规划
  5. qq空间等闪动的文字怎么做?
  6. 7 个显著提升编码效率的IntelliJ IDEA必备插件
  7. 计算机编程英语用语,计算机编程英语词汇
  8. 奇异递归模板模式(Curiously Recurring Template Pattern,CRTP)
  9. leetcode78. 子集(回溯)
  10. 前端学习(2653):对比vue2中的实现
  11. 计算机专业知识多选题证监会,2019年国家公务员考试中国证监会(计算机类)专业科目考试大纲...
  12. android聊天,存储聊天记录sqlite
  13. 移动网络安全_新突破!青海移动在2020年中国移动网络安全运维技能竞赛大赛中荣获三等奖!...
  14. 第 7 章 MybatisPlus 插件
  15. IOS Emoji表情
  16. web渗透测试学习路线
  17. stm32+TB6612驱动直流电机
  18. M3DGIS三维电子沙盘开发教程第52课无人机倾斜摄影全景三维建模
  19. 2018-12支付宝红包赚钱薅羊毛全攻略
  20. 视觉测量时的工业相机和远心镜头选型方法

热门文章

  1. DLT645-2007通讯规约解析
  2. 大数据导论习题_2020智慧树答案 大数据概论 最新知到章节测试答案
  3. 元宵节在家,我用Python撸一个猜灯谜
  4. oracle exp导出工具,Oracle EXP/IMP 导出导入工具的使用
  5. 今日头条自媒体视频搬运,视频去/消重技术软件/不重复视频教程 头条消重去重复视频教程自媒体进阶...
  6. Brother HL-2260D打印机添加墨粉方法
  7. 微信小程序获取数据库的数据返回空数组
  8. 误差反向传播算法(BP网络)
  9. 亚马逊云科技在中国区域新推多项服务;德州仪器携手台达打造高效能服务器电源供应器 | 全球TMT...
  10. 当授权者而非推卸责任者