题目大意:

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

  • 0 x1 y1 x2 y2 表示加入一条新的线段 (x1,y2),(x2,y2)
  • 1 x0 询问所有线段中,x坐标在 x0 ​​ 处的最高点的 y 坐标是什么,如果对应位置没有线段,则输出

思路:

使用李超树维护

每一个加入的线段 在它能覆盖的线段树区间中修改

修改的时候判断它是否在中点的位置更优

然后将这个区间原来维护的线段与新线段比较

不优的那个考虑下放到左右儿子区间中继续更新

查询的时候答案为经过的所有线段树的线段中最大的

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#define inf 2139062143
#define ll long long
#define MAXN 100100
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m,mx[MAXN<<];
struct seg{double k,b;}tag[MAXN<<];
inline void build(int k,int l,int r)
{
tag[k].k=,tag[k].b=-inf;
if(l==r) return ;
int mid=(l+r)>>;
build(k<<,l,mid);build(k<<|,mid+,r);
}
inline void real_mdf(int k,int l,int r,seg x)
{
//cout<<k<<" "<<l<<" "<<r<<" "<<x.k<<" "<<x.b<<endl;
if(l==r) {if(tag[k].k*l+tag[k].b<x.k*l+x.b) tag[k]=x;return ;}
int mid=(l+r)>>;
if(tag[k].k*mid+tag[k].b<x.k*mid+x.b) swap(tag[k],x);
//cout<<"i: "<<k<<" "<<l<<" "<<r<<" "<<x.k<<" "<<x.b<<endl;
if(tag[k].k*l+tag[k].b<x.k*l+x.b) real_mdf(k<<,l,mid,x);
if(tag[k].k*r+tag[k].b<x.k*r+x.b) real_mdf(k<<|,mid+,r,x);
}
inline void mdf(int k,int l,int r,int a,int b,seg x)
{
if(a>b) return ;
//cout<<k<<" "<<l<<" "<<r<<" "<<a<<" "<<b<<" "<<x.k<<" "<<x.b<<endl;
if(l==a&&r==b) {real_mdf(k,l,r,x);return ;}
int mid=(l+r)>>;
if(b<=mid) mdf(k<<,l,mid,a,b,x);
else if(a>mid) mdf(k<<|,mid+,r,a,b,x);
else {mdf(k<<,l,mid,a,mid,x);mdf(k<<|,mid+,r,mid+,b,x);}
}
inline double query(int k,int l,int r,int x)
{
//cout<<x<<" "<<tag[k].k*x+tag[k].b<<endl;
if(l==r) return tag[k].k*x+tag[k].b;
int mid=(l+r)>>;double res;
//cout<<k<<" "<<res<<endl;
if(x<=mid) res=query(k<<,l,mid,x);
else res=query(k<<|,mid+,r,x);
return max(tag[k].k*x+tag[k].b,res);
}
int main()
{
//freopen("C2.in","r",stdin);
n=read(),m=read();int a,b,x,y,z;double k,B;
build(,,MAXN-);
for(int i=;i<=n;i++)
{
x=read(),y=read(),a=read(),b=read();
//cout<<6<<endl;
if(x==a) k=,B=max(y,b);
else k=(double)(y-b)/(x-a),B=y-k*x;
//cout<<k<<" "<<b<<endl;
mdf(,,MAXN-,max(,min(a,x)),min(MAXN-,max(x,a)),(seg){k,B});
}
while(m--)
{
z=read();
if(z) {a=read(),k=query(,,MAXN-,a);printf("%.3lf\n",k<=-inf?:k);}
else
{
x=read(),y=read(),a=read(),b=read();
//cout<<6<<endl;
if(x==a) k=,B=max(y,b);
else k=(double)(y-b)/(x-a),B=y-k*x;
//cout<<k<<" "<<b<<endl;
mdf(,,MAXN-,max(,min(a,x)),min(MAXN-,max(x,a)),(seg){k,B});
}
//system("pause");
}
}

loj 6034 线段游戏的更多相关文章

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

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

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

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

  3. BZOJ4881: [Lydsy1705月赛]线段游戏(二分图)

    4881: [Lydsy1705月赛]线段游戏 Time Limit: 3 Sec  Memory Limit: 256 MBSubmit: 359  Solved: 205[Submit][Stat ...

  4. bzoj 4879 失控的数位板 4881 线段游戏 贪心,瞎搞

    [Lydsy1705月赛]失控的数位板 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 148  Solved: 33[Submit][Status][ ...

  5. BZOJ 4881: [Lydsy2017年5月月赛]线段游戏

    4881: [Lydsy2017年5月月赛]线段游戏 Time Limit: 3 Sec  Memory Limit: 256 MBSubmit: 164  Solved: 81[Submit][St ...

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

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

  7. [bzoj4881][Lydsy2017年5月月赛]线段游戏

    来自FallDream的博客,未经允许,请勿转载,谢谢. quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐标分别为(0,i)和(1, ...

  8. 【BZOJ4881】5月月赛D 线段游戏 树状数组+set

    Description quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐 标分别为(0,i)和(1,p_i),其中p_1,p_2,. ...

  9. 【bzoj4881】[Lydsy2017年5月月赛]线段游戏 树状数组+STL-set

    题目描述 quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐标分别为(0,i)和(1,p_i),其中p_1,p_2,...,p_n构成 ...

随机推荐

  1. PDO、PDOStatement、PDOException

    最近在学PDO  比较详细的资料 出处:http://blog.csdn.net/hsst027/article/details/23682003 PDO中包含三个预定义的类,它们分别是PDO.PDO ...

  2. configparser logging

    configparser模块 # 该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值). import configpar ...

  3. AutoMapper的使用在NET core中的使用记录

    关于AutoMapper的用处以及主要便利指出请参考官方文档,本文章仅记录自己使用的过程及代码: 安装 在项目中涉及到的类包括:Account,AccountCondition,AutoMapperC ...

  4. cadence中画焊盘注意事项

    贴片焊盘的层面剖析图如下: 其中Paste Mask Top层用于制作钢网,可以做成与Top层相同的大小.阻焊层一般比顶层大0.1mm(方形焊盘的长,宽,圆形焊盘的直径). 助焊层与阻焊层区别 两个层 ...

  5. Unity Water Shader

    上图是一个物体浸入水中的效果 原理 我们使用相机渲染的整个场景的深度图减去需要忽略的模型的深度,这里忽略的是图中蓝色部分,就保留了其他的深度值. 用到Main Camera渲染的深度贴图: sampl ...

  6. java成员变量

      成员变量是在类范围内定义的变量   局部变量是在一个方法内定义的变量 https://www.cnblogs.com/zhengchenhui/p/5762966.html

  7. [luoguP1439] 排列LCS问题(DP + 树状数组)

    传送门 无重复元素的LCS问题 n2 做法不说了. nlogn 做法 —— 因为LCS问题求的是公共子序列,顺序不影响答案,影响答案的只是两个串的元素是否相同,所以可以交换元素位置. 首先简化一下问题 ...

  8. noip模拟赛 收集果子

    分析:显然的,树形dp,状态也很好想到:f[i][j]表示以i为根的子树收集到j个果子的方案数.转移的话就相当于是背包问题,每个子节点可以选或不选.如果不选子节点k的话,那么以k为根的子树的边无论断不 ...

  9. jQuery的观察者模式详解 转载

    jQuery的观察者模式详解 投稿:hebedich 本文主要是介绍了jQuery中on方法及trigger方法,以及围绕这个方法来体验的观察者模式,是篇非常不错的文章,对我们理解观察者模式很有帮助. ...

  10. php的socket通信【转载】

     对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1.         什么是TCP/IP.UDP?2.         Soc ...