题目大意:

给出若干条线段,用 (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. vue开发--生成token并保存到本地存储中

    首先回顾一下token:token认证是RESTFUL.api的一个很重要的部分,通过token认证和token设置,后端会有一个接口传给前台: http://localhost/yiiserver/ ...

  2. prop 和 attr 中一些羞羞的事情

    引言 前几天做一个迷你京东小项目的时候涉及到一个全选的小功能,一开始用的是 attr,但是效果完全不是自己想要的,当商品按钮点击过一次后,attr就无法对其状态进行更改,最后谷歌了一番发现需要用 pr ...

  3. 一次偶遇 IOException

    今天遇到了个挺有意思的事情,为了实现上传头像的功能,这是需要实现的功能,项目在本地跑起来且在本地 服务器(tomcat)也实现了头像上传,并把头像路径存入数据库,但是却在上传到线上服务器的时候死活存不 ...

  4. Cadence中画原理图的时候器件标号与黄色的参数不同的解决办法

    方法是Accessories->Transfer Occ. Prop to Instance->Push Occ. Prop into Instance 将黄色的参数同样应用到源参数. 版 ...

  5. ASP.NET获取客户端IP及MAC地址

    朋友最近问如何获取客户端IP及MAC地址,一直想把这段给整理一下,契机来了:下边分为了C#后台获取的方法和前台Javascript(调用ActiveX)获取的方法,大家如果有好的方法一起讨论撒O(∩_ ...

  6. js变量类型详解

    <html> <title>js变量类型详解</title> <meta http-equiv="content-type" conten ...

  7. Spring & Java

    Spring & Java https://spring.io/ Spring Boot https://www.shiyanlou.com/courses/1152 Spring Boot入 ...

  8. maven坐标查询

    使用maven时,一个经常用到的操作就是去 中央仓库查询相关库的坐标,但在哪里查呢? 1 http://mvnrepository.com/ 服务器是由sonatype提供的,采用的是Nexus服务器 ...

  9. Redis 命令与连接【十一】

    ---------------------Redis 命令--------------- Redis 命令用于在 redis 服务上执行操作. 要在 redis 服务上执行命令需要一个 redis 客 ...

  10. Linux操作系统下IPTables配置

    filter表的防火墙 1.查看本机关于IPTABLES的设置情况 [root@tp ~]# iptables -L -n Chain INPUT (policy ACCEPT) target pro ...