#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的值最大。
对于不优的答案下传。查询时与标记永久化的查询类似。
其实就是李超树。
- #include<iostream>
- #include<cstring>
- #include<cstdlib>
- #include<cstdio>
- #include<cmath>
- #include<algorithm>
- #define maxn 100005
- using namespace std;
- inline int read() {
- int x=,f=;char ch=getchar();
- for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-;
- for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
- return x*f;
- }
- struct seg {double k,b;seg(){b=-;}}t[maxn*];
- inline double cal(seg now,int x) {return now.k*x+now.b;}
- inline void work(int l,int r,int o,seg x) {
- if(cal(t[o],l)>=cal(x,l)&&cal(t[o],r)>=cal(x,r)) {return;}
- if(cal(t[o],l)<cal(x,l)&&cal(t[o],r)<cal(x,r)) {t[o]=x;return;}
- int mid=(l+r)>>,ls=o<<,rs=ls+;
- if(cal(t[o],l)>=cal(x,l)&&cal(t[o],mid)<cal(x,mid)) {
- seg tmp=t[o];t[o]=x;
- work(l,mid,ls,tmp);
- return;
- }
- if(cal(t[o],l)>=cal(x,l)&&cal(t[o],mid)>cal(x,mid)) {
- if(l!=r) work(mid+,r,rs,x);
- return;
- }
- if(cal(t[o],l)<cal(x,l)&&cal(t[o],mid)<cal(x,mid)) {
- seg tmp=t[o];t[o]=x;
- if(l!=r) work(mid+,r,rs,tmp);
- return;
- }
- if(cal(t[o],l)<cal(x,l)&&cal(t[o],mid)>=cal(x,mid)) {
- if(l!=r) work(l,mid,ls,x);
- return;
- }
- }
- inline void update(int l,int r,int o,int L,int R,seg x) {
- // cout<<l<<' '<<r<<endl;
- if(L<=l&&R>=r) {work(l,r,o,x);return;}
- int mid=(l+r)>>,ls=o<<,rs=ls+;
- if(L<=mid) update(l,mid,ls,L,R,x);
- if(R>mid) update(mid+,r,rs,L,R,x);
- }
- double ans;
- inline double query(int l,int r,int o,int x) {
- if(l==r) return cal(t[o],l);
- int mid=(l+r)>>,ls=o<<,rs=ls+;
- if(x<=mid) return ans=max(ans,max(cal(t[o],x),query(l,mid,ls,x)));
- else return ans=max(ans,max(cal(t[o],x),query(mid+,r,rs,x)));
- }
- int n,m;
- int main() {
- n=read(),m=read();
- for(int i=;i<=n;i++) {
- int x1=read(),y1=read(),x2=read(),y2=read();
- if(x1>x2) {swap(x1,x2);swap(y1,y2);}
- if(x2<||x1>) continue;
- seg x;
- if(x1==x2) x.k=,x.b=max(y1,y2);
- else {
- x.k=(double)(y2-y1)/(double)(x2-x1);
- x.b=y1-x.k*x1;
- }
- update(,,,max(,x1),min(,x2),x);
- }
- while(m--) {
- int tp=read();
- if(tp==) {
- int x1=read(),y1=read(),x2=read(),y2=read();
- if(x1>x2) {swap(x1,x2);swap(y1,y2);}
- if(x2<||x1>) continue;
- seg x;
- if(x1==x2) x.k=,x.b=max(y1,y2);
- else {
- x.k=(double)(y2-y1)/(double)(x2-x1);
- x.b=y1-x.k*x1;
- }
- update(,,,max(,x1),min(,x2),x);
- }
- else {
- int x=read();ans=-;
- query(,,,x);
- printf("%.3lf\n",ans==-?:ans);
- }
- }
- }
#6034. 「雅礼集训 2017 Day2」线段游戏 李超树的更多相关文章
- loj#6034 「雅礼集训 2017 Day2」线段游戏
分析 区间李超树板子题 代码 #include<bits/stdc++.h> using namespace std; #define db double const int inf = ...
- 【loj6034】「雅礼集训 2017 Day2」线段游戏
#6034. 「雅礼集训 2017 Day2」线段游戏 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:Special Judge 上传者: 匿名 题目描述 ...
- 「雅礼集训 2017 Day2」线段游戏(线段树懒标记“启发式下传”,李超树)
题面 题解 加入一条线段,可以把它转化为在[L,R]区间内加一条线 y=ax+b (如果原线段与y轴平行,就相当于在{x1}处加一条线 y=max(y1,y2)) 我们可以把它加到线段树上,线段树上每 ...
- 「雅礼集训 2017 Day2」解题报告
「雅礼集训 2017 Day2」水箱 我怎么知道这种题目都能构造树形结构. 根据高度构造一棵树,在树上倍增找到最大的小于约束条件高度的隔板,开一个 \(vector\) 记录一下,然后对于每个 \(v ...
- loj#6033. 「雅礼集训 2017 Day2」棋盘游戏(二分图博弈)
题意 链接 Sol 第一次做在二分图上博弈的题..感觉思路真是清奇.. 首先将图黑白染色. 对于某个点,若它一定在最大匹配上,那么Bob必胜.因为Bob可以一直沿着匹配边都,Alice只能走非匹配边. ...
- loj#6032. 「雅礼集训 2017 Day2」水箱(并查集 贪心 扫描线)
题意 链接 Sol 神仙题+神仙做法%%%%%%%% 我再来复述一遍.. 首先按照\(y\)坐标排序,然后维护一个扫描线从低处往高处考虑. 一个连通块的内状态使用两个变量即可维护\(ans\)表示联通 ...
- [LOJ#6033]. 「雅礼集训 2017 Day2」棋盘游戏[二分图博弈、匈牙利算法]
题意 题目链接 分析 二分图博弈经典模型,首先将棋盘二分图染色. 考虑在某个最大匹配中: 如果存在完美匹配则先手必败,因为先手选定的任何一个起点都在完美匹配中,而后手则只需要走这个点的匹配点,然后先手 ...
- LOJ#6032. 「雅礼集训 2017 Day2」水箱
传送门 首先可以有一个平方复杂度的 \(DP\) 设 \(f_{i,j}\) 表示前面 \(i\) 个小格,高度为 \(j\) 的最大答案 令 \(h_i\) 表示隔板 \(i\) 的高度 当 \(j ...
- 「雅礼集训 2017 Day2」水箱
题目链接 题意分析 我们用\(f[i][j]\)表示当前到达第\(i\)个位置水位高度为\(j\)的答案 如果那么\(h[i]\)为\(i\)和\(i+1\)之间的支柱高度 那么如果\(j≤h[i]\ ...
随机推荐
- OpenCV中的按钮问题
在HighGUI中,没有显示提供任何形式的按钮.一般有两种方法替代: 1.用只有两个状态的滑动条来替代按钮.开关(switch)事实上就是只有两个状态的滑动条,这两个状态是on和off.然后通过回调函 ...
- ai学习记录
界面:多个预编辑区:制作图形,使用的图形放到工作区内,不使用在预编区.没有Ctrl/Alt+delete的概念,没有前后景颜色.新建:分辨率:矢量软件和分辨率无关: 新建时候不要勾选对齐到像素网格 存 ...
- request.getParameterMap() 获取表单提交的键值对 并且 也能获取动态表单的key
Map<String,String[]> map = request.getParameterMap();Set<String> keys = map.keySet(); 获取 ...
- 【bzoj2007】[Noi2010]海拔 最小割+对偶图+最短路
题目描述 YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个交 ...
- ARC074 E RGB Sequence DP
---题面--- 题解: 首先,有一个不太直观的状态,f[i][j][k][l]表示DP到i位,三种颜色最后出现的位置分别是j, k, l的方案数.因为知道了三种颜色最后出现的位置,因此也可以得知以当 ...
- VS查看DLL接口
应用程序Microsoft Visual Studio 2010的Visual Studio Tools文件夹中打开Visual Studio Command Prompt (2010)命令窗口 du ...
- 强大的JQuery数组封装使用
JQuery对数组的处理非常便捷并且功能强大齐全,一步到位的封装了很多原生js数组不能企及的功能.下面来看看JQuery数组的强大之处在哪. $.each(array, [callback]) 遍历 ...
- webkit开发,app移动前端知识点
1. viewport:也就是可视区域.对于桌面浏览器,我们都很清楚viewport是什么,就是出去了所有工具栏.状态栏.滚动条等等之后用于看网页的区域,这是真正有效的区域.由于移动设备屏幕宽度不同于 ...
- JSON.parse() 和 JSON.stringify()使用
1.parse()是用于从一个字符串中解析出json对象 定义一个字符串:var str = '{"name":"superman","age&quo ...
- 2016"百度之星" - 初赛(Astar Round2A)--HDU 5690 |数学转化+快速幂
Sample Input 3 1 3 5 2 1 3 5 1 3 5 99 69 Sample Output Case #1: No Case #2: Yes Case #3: Yes Hint ...