题目大意:

给出若干条线段,用 (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. css3新特性学习系列 -- border

    css3新特性 border属性(border-radius.border-image.box-shadow)详解 1.border-radius  圆角 支持:IE9+ 用法: border-rad ...

  2. [转]Delphi调用cmd并取得输出文本

    //转自http://www.oschina.net/code/snippet_136241_3980 1 procedure CheckResult(b: Boolean); begin if no ...

  3. Python数据类型方法

    Python认为一切皆为对象:比如我们初始化一个list时: li = list('abc') 实际上是实例化了内置模块builtins(python2中为__builtin__模块)中的list类: ...

  4. 用PHP写一个最简单的解释器Part4(写一个最简单的脚本语言)

    好吧!我承认我想标题党了.大家对解释器的吸引,绝对没有自己动手写一个脚本语言更有吸引力.不过如果看到标题过来的,可能也是 我承认,之前收藏的减肥视频,我都是这样对待他们的. 不过我还是相信很多程序猿o ...

  5. LeetCode(61) Rotate List

    题目 Given a list, rotate the list to the right by k places, where k is non-negative. For example: Giv ...

  6. [cf360 div1.C]The Values You Can Make[Dp]

    题意:有n个硬币,面值不同,求能组成K的方案中,每个方案的硬币可以凑成那些答案. 例如, K=5 面值={1,1,1,2,3} K={1,1,1,2} K={1,1,3} K={2,3} 那么答案是 ...

  7. Count the Colors-ZOJ1610(线段树区间求)

    Painting some colored segments on a line, some previously painted segments may be covered by some th ...

  8. 【转】winform 程序实现一次只能打开一个该程序

    ref: http://www.jb51.net/article/17747.htm //在程序的main函数中加入以下代码 bool createdNew; System.Threading.Mut ...

  9. Erlang 又生虫了

    好久不玩Erlang了.近期想鼓捣Eresye,下了个最新版OTP 17,结果.发现了问题. 安装这个最新版的Erlang (erl 6.0)后,用erlc编译了Eresye 1.2.5,并放入其li ...

  10. yarn-cli 缓存

    yarn cache list Yarn 会在你的用户目录下开辟一块全局缓存用以保存下载的包.yarn cache list 用于列出所有已经缓存的包. yarn cache dir 执行 yarn ...