#6034. 「雅礼集训 2017 Day2」线段游戏

内存限制:256 MiB时间限制:1000 ms标准输入输出
题目类型:传统评测方式:Special Judge
上传者: 匿名

题目描述

给出若干条线段,用 (x1,y2),(x2,y2) (x_1, y_2), (x_2, y_2)(x​1​​,y​2​​),(x​2​​,y​2​​) 表示其两端点坐标,现在要求支持两种操作:

  • 0 x1 y1 x2 y2 表示加入一条新的线段 (x1,y2),(x2,y2) (x_1, y_2), (x_2, y_2)(x​1​​,y​2​​),(x​2​​,y​2​​);
  • 1 x0 询问所有线段中,x xx 坐标在 x0 x_0x​0​​ 处的最高点的 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」线段游戏 李超树的更多相关文章

  1. loj#6034 「雅礼集训 2017 Day2」线段游戏

    分析 区间李超树板子题 代码 #include<bits/stdc++.h> using namespace std; #define db double const int inf = ...

  2. 【loj6034】「雅礼集训 2017 Day2」线段游戏

    #6034. 「雅礼集训 2017 Day2」线段游戏 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:Special Judge 上传者: 匿名 题目描述 ...

  3. 「雅礼集训 2017 Day2」线段游戏(线段树懒标记“启发式下传”,李超树)

    题面 题解 加入一条线段,可以把它转化为在[L,R]区间内加一条线 y=ax+b (如果原线段与y轴平行,就相当于在{x1}处加一条线 y=max(y1,y2)) 我们可以把它加到线段树上,线段树上每 ...

  4. 「雅礼集训 2017 Day2」解题报告

    「雅礼集训 2017 Day2」水箱 我怎么知道这种题目都能构造树形结构. 根据高度构造一棵树,在树上倍增找到最大的小于约束条件高度的隔板,开一个 \(vector\) 记录一下,然后对于每个 \(v ...

  5. loj#6033. 「雅礼集训 2017 Day2」棋盘游戏(二分图博弈)

    题意 链接 Sol 第一次做在二分图上博弈的题..感觉思路真是清奇.. 首先将图黑白染色. 对于某个点,若它一定在最大匹配上,那么Bob必胜.因为Bob可以一直沿着匹配边都,Alice只能走非匹配边. ...

  6. loj#6032. 「雅礼集训 2017 Day2」水箱(并查集 贪心 扫描线)

    题意 链接 Sol 神仙题+神仙做法%%%%%%%% 我再来复述一遍.. 首先按照\(y\)坐标排序,然后维护一个扫描线从低处往高处考虑. 一个连通块的内状态使用两个变量即可维护\(ans\)表示联通 ...

  7. [LOJ#6033]. 「雅礼集训 2017 Day2」棋盘游戏[二分图博弈、匈牙利算法]

    题意 题目链接 分析 二分图博弈经典模型,首先将棋盘二分图染色. 考虑在某个最大匹配中: 如果存在完美匹配则先手必败,因为先手选定的任何一个起点都在完美匹配中,而后手则只需要走这个点的匹配点,然后先手 ...

  8. LOJ#6032. 「雅礼集训 2017 Day2」水箱

    传送门 首先可以有一个平方复杂度的 \(DP\) 设 \(f_{i,j}\) 表示前面 \(i\) 个小格,高度为 \(j\) 的最大答案 令 \(h_i\) 表示隔板 \(i\) 的高度 当 \(j ...

  9. 「雅礼集训 2017 Day2」水箱

    题目链接 题意分析 我们用\(f[i][j]\)表示当前到达第\(i\)个位置水位高度为\(j\)的答案 如果那么\(h[i]\)为\(i\)和\(i+1\)之间的支柱高度 那么如果\(j≤h[i]\ ...

随机推荐

  1. maven中进行go的编译

    maven提供的插件maven-antrun-plugin真是个好东东,使得maven可以利用ant的很多功能. 最近需要实现在maven中实现对go代码的编译,添加如下代码在pom文件中即可. &l ...

  2. Java IO 之 FileFilter与FilenameFilter

    FileFilter与FilenameFilter可以实现对文件的过滤,他们都是接口,具体的过滤规则需要我们自己编写 1.FileFilter package org.zln.io.file; imp ...

  3. log4net将日志写入ElasticSearch

    log4net将日志写入ElasticSearch https://www.cnblogs.com/huangxincheng/p/9120028.html 很多小步快跑的公司,开发人员多则3-4个, ...

  4. 【bzoj3931】[CQOI2015]网络吞吐量 最短路+最大流

    题目描述 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路由器需要选择最优的路径转发 ...

  5. 【题解】NOI2014购票

    实际上是一个不完美算法……cogs上面A不掉(爆栈啦).感谢机房大佬PPY的指点,现在也写出来供大家参考参考,理解起来应该是比较简单的一种. 我们首先get出斜率优化方程: \(dp[v] = dis ...

  6. [51nod1503]猪和回文 DP

    ---题面--- 题解: 首先观察到题目要求的是合法回文串的个数,而回文串要求从前往后和从后往前是一样的,因此我们假设有两只猪,分别从左上和右下开始走,走相同的步数最后相遇,那么它们走的路能拼在一起构 ...

  7. BZOJ 2502: 清理雪道 | 有上下界最小流

    #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #defi ...

  8. 安徽师大附中%你赛day2T3 巧克力 解题报告

    巧克力 题目描述 小\(T\)有\(N\)块巧克力, 每块巧克力上都有一句话(由小写英文字母组成,不含标点) .现在每块巧克力都断成了若干截,更糟糕的是,有一些碎片丢失了 ,但是剩下的碎片之间的顺序是 ...

  9. bzoj 1977 洛谷P4180 严格次小生成树

    Description: 给定一张N个节点M条边的无向图,求该图的严格次小生成树.设最小生成树边权之和为sum,那么严格次小生成树就是边权之和大于sum的最小的一个 Input: 第一行包含两个整数N ...

  10. HTML5 Canvas圣诞树

    又逢圣诞了,为了让小站NowaMagic有点节日气氛,这里也弄一棵圣诞树放放-大家可以先看下效果. 效果演示 <canvas id="c"></canvas> ...