#6034. 「雅礼集训 2017 Day2」线段游戏 李超树
#6034. 「雅礼集训 2017 Day2」线段游戏
题目描述
给出若干条线段,用 (x1,y2),(x2,y2) (x_1, y_2), (x_2, y_2)(x1,y2),(x2,y2) 表示其两端点坐标,现在要求支持两种操作:
0 x1 y1 x2 y2
表示加入一条新的线段 (x1,y2),(x2,y2) (x_1, y_2), (x_2, y_2)(x1,y2),(x2,y2);1 x0
询问所有线段中,x xx 坐标在 x0 x_0x0 处的最高点的 y yy 坐标是什么,如果对应位置没有线段,则输出 0 00。
输入格式
第一行两个正整数 n nn、m mm 为初始的线段个数和操作个数。
接下来 n nn 行,每行四个整数,表示一条线段。
接下来 m mm 行,每行为一个操作 0 x1 y1 x2 y2
或 1 x0
。
输出格式
对于每一个询问操作,输出一行,为一个实数,当你的答案与标准答案误差不超过 10−2 10 ^ {-2}10−2 时,则视为正确。
样例
样例输入
3 4
0 -1 4 1
4 2 7 2
7 1 8 2
1 4
1 3
0 3 3 6 3
1 3
样例输出
2
0.5
3
对于线段树的每个节点,维护每个节点使得mid的值最大。对于不优的答案下传。查询时与标记永久化的查询类似。其实就是李超树。
1 #include<iostream> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cstdio> 5 #include<cmath> 6 #include<algorithm> 7 #define maxn 100005 8 using namespace std; 9 inline int read() { 10 int x=0,f=1;char ch=getchar(); 11 for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1; 12 for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0'; 13 return x*f; 14 } 15 struct seg {double k,b;seg(){b=-10000000000000000;}}t[maxn*4]; 16 inline double cal(seg now,int x) {return now.k*x+now.b;} 17 inline void work(int l,int r,int o,seg x) { 18 if(cal(t[o],l)>=cal(x,l)&&cal(t[o],r)>=cal(x,r)) {return;} 19 if(cal(t[o],l)<cal(x,l)&&cal(t[o],r)<cal(x,r)) {t[o]=x;return;} 20 int mid=(l+r)>>1,ls=o<<1,rs=ls+1; 21 if(cal(t[o],l)>=cal(x,l)&&cal(t[o],mid)<cal(x,mid)) { 22 seg tmp=t[o];t[o]=x; 23 work(l,mid,ls,tmp); 24 return; 25 } 26 if(cal(t[o],l)>=cal(x,l)&&cal(t[o],mid)>cal(x,mid)) { 27 if(l!=r) work(mid+1,r,rs,x); 28 return; 29 } 30 if(cal(t[o],l)<cal(x,l)&&cal(t[o],mid)<cal(x,mid)) { 31 seg tmp=t[o];t[o]=x; 32 if(l!=r) work(mid+1,r,rs,tmp); 33 return; 34 } 35 if(cal(t[o],l)<cal(x,l)&&cal(t[o],mid)>=cal(x,mid)) { 36 if(l!=r) work(l,mid,ls,x); 37 return; 38 } 39 } 40 inline void update(int l,int r,int o,int L,int R,seg x) { 41 // cout<<l<<' '<<r<<endl; 42 if(L<=l&&R>=r) {work(l,r,o,x);return;} 43 int mid=(l+r)>>1,ls=o<<1,rs=ls+1; 44 if(L<=mid) update(l,mid,ls,L,R,x); 45 if(R>mid) update(mid+1,r,rs,L,R,x); 46 } 47 double ans; 48 inline double query(int l,int r,int o,int x) { 49 if(l==r) return cal(t[o],l); 50 int mid=(l+r)>>1,ls=o<<1,rs=ls+1; 51 if(x<=mid) return ans=max(ans,max(cal(t[o],x),query(l,mid,ls,x))); 52 else return ans=max(ans,max(cal(t[o],x),query(mid+1,r,rs,x))); 53 } 54 int n,m; 55 int main() { 56 n=read(),m=read(); 57 for(int i=1;i<=n;i++) { 58 int x1=read(),y1=read(),x2=read(),y2=read(); 59 if(x1>x2) {swap(x1,x2);swap(y1,y2);} 60 if(x2<1||x1>100000) continue; 61 seg x; 62 if(x1==x2) x.k=0,x.b=max(y1,y2); 63 else { 64 x.k=(double)(y2-y1)/(double)(x2-x1); 65 x.b=y1-x.k*x1; 66 } 67 update(1,100000,1,max(1,x1),min(100000,x2),x); 68 } 69 while(m--) { 70 int tp=read(); 71 if(tp==0) { 72 int x1=read(),y1=read(),x2=read(),y2=read(); 73 if(x1>x2) {swap(x1,x2);swap(y1,y2);} 74 if(x2<1||x1>100000) continue; 75 seg x; 76 if(x1==x2) x.k=0,x.b=max(y1,y2); 77 else { 78 x.k=(double)(y2-y1)/(double)(x2-x1); 79 x.b=y1-x.k*x1; 80 } 81 update(1,100000,1,max(1,x1),min(100000,x2),x); 82 } 83 else { 84 int x=read();ans=-10000000000000000; 85 query(1,100000,1,x); 86 printf("%.3lf\n",ans==-10000000000000000?0:ans); 87 } 88 } 89 }
View Code
转载于:https://www.cnblogs.com/wls001/p/9643019.html
#6034. 「雅礼集训 2017 Day2」线段游戏 李超树相关推荐
- 数据结构二之线段树Ⅱ——KiKi‘s K-Number,ball,The Child and Sequence,「雅礼集训 2017 Day1」市场,Atlantis
值域线段树+势能线段树+扫描线 KiKi's K-Number ball The Child and Sequence 「雅礼集训 2017 Day1」市场 Atlantis KiKi's K-Num ...
- [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相(树的重心+贪心)
[LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相 description solution 一个到所有节点距离和最小的节点 ⇔\Leftrightarrow⇔ 树的重心(满足最重的儿 ...
- #6029. 「雅礼集训 2017 Day1」市场(势能,区间除)
#6029. 「雅礼集训 2017 Day1」市场 用线段树维护数列,区间上维护最大最小值,区间和还有标记,修改时,区间加直接做,而区间除时,递归到线段树上某一区间,如果这一操作等价于区间加(也就是最 ...
- loj #6046. 「雅礼集训 2017 Day8」爷
#6046. 「雅礼集训 2017 Day8」爷 题目描述 如果你对山口丁和 G&P 没有兴趣,可以无视题目背景,因为你估计看不懂 -- 在第 63 回战车道全国高中生大赛中,军神西住美穗带领 ...
- LibreOJ 6514. 「雅礼集训 2018 Day10」文明【虚树+LCA】
6514. 「雅礼集训 2018 Day10」文明 [题目描述] 传送门 [题解] 考虑笨蛋的写法,可以用LCA求出1号和其他点的中点,然后DFS搜索Size大小即可,但是,复杂度显然要炸,但是我们会 ...
- 「雅礼集训 2018 Day2」农民
传送门 Description 「搞 OI 不如种田.」 小 D 在家种了一棵二叉树,第 ii 个结点的权值为 \(a_i\). 小 D 为自己种的树买了肥料,每天给树施肥. 可是几天后,小 D 却发 ...
- 「6月雅礼集训 2017 Day2」B
[题目大意] 求n*n的棋盘,每行每列都有2个黑格子的方案数. n<=10^7 [题解] zzq的做法好神奇啊 行列建点,二分图 左边有i个点,右边有j个点的方案数 f[i,j] 左边有i个点, ...
- LOJ#6044. 「雅礼集训 2017 Day8」共(Prufer序列)
题面 传送门 题解 答案就是\(S(n-k,k)\times {n-1\choose k-1}\) 其中\(S(n,m)\)表示左边\(n\)个点,右边\(m\)个点的完全二分图的生成树个数,它的值为 ...
- LOJ#6048. 「雅礼集训 2017 Day10」数列(线段树)
题面 传送门 题解 我的做法似乎非常复杂啊-- 首先最长上升子序列长度就等于把它反过来再接到前面求一遍,比方说把\(2134\)变成\(43122134\),实际上变化之后的求一个最长上升子序列和方案 ...
最新文章
- 124页,UC伯克利大学胡戎航博士论文公布:视觉与语言推理的结构化模型
- ajax跨域,这应该是最全的解决方案了
- 【论文学习】RepVGG: Making VGG-style ConvNets Great Again及网络重参数化的用途及效果分析
- java 封装表单数据类型_Java基本数据类型与封装类型详解(int和Integer区别)
- CodePlex关闭,建议迁移至GitHub
- 京解之才——2019年技术盘点微服务篇(三)| 程序员硬核评测
- 鸿蒙系统手机现在有什么,华为鸿蒙手机迟迟未来 手机操作系统面临的难点有哪些...
- Spark项目实践--基于 TMDB 数据集的电影数据分析
- CS61B 学习指南
- 计算机图形和ps的区别,PS CC和PS CC有什么区别?
- 调色盘——将真彩色图像降级为低分辨率图像的八叉树算法
- [C#复习向整合]反射 -Assembly与Activator
- filebeat7.7.0相关详细配置预览- processors - add_fields
- 深入解析SQL Server 2008
- man手册中文版设置
- unity17——布料插件制作旗子飘动效果
- [014量化交易] python 通过tushare 获取股票数据、名称、股票代码、指定股票名
- 为什么计算机中的负数要用补码表示?
- 保姆级教学如何在Ubuntu 20.04工作站上配置深度学习环境
- 弥勒“甘丝蜜朵”旅游地产策划规划方案
热门文章
- 常用的免费Webservice接口(二)
- 绑定控件中%#Eval()%和%=变量%的执行顺序
- ReportViewer教程(15)-矩阵报表-4
- C# 或Asp.Net 将excel表格导入数据库
- 破解keil 2k限制,注册码生成
- 传感器和单片机主板之间远距离通讯应该有哪些保障处理措施
- 计算机python是什么意思_系统学习python-1.1什么是计算机
- python关于二手房的课程论文_python之数据清理-以二手房信息为例
- linux 格式化u盘_【Ventoy】一个U盘,启动多个系统
- 深度学习的实用层面 —— 1.8 其它正则化方法