http://www.lydsy.com/JudgeOnline/problem.php?id=1568 (题目链接)

题意

  在线维护若干条直线,询问一些横坐标上的最高直线的纵坐标。

Solution

  超哥线段树=  =。可以说是标记可持久化的一个好的应用吧。

  线段树上一个节点为一个容器,可以存放一条直线。考虑插入一条直线时,当找到要插入的区间节点时,如果这个节点的容器没东西则将这条直线直接放在这个节点的容器中。否则和容器中的线段比较,保留较高部分较多的直线,将另一条直线作为新的插入直线往左儿子或者右儿子递归处理,最后到叶子节点直接比较即可。

  这样一次插入,在线段树上最多覆盖满$log$个区间,每个区间递归下去$log$层。查询时间复杂度为一个$log$。时间复杂度为$O(nlog^2n)$

细节

  记得各种eps。

代码

// bzoj1568
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf (1ll<<60)
#define eps 1e-8
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std; const int lim=50000,maxn=100010;
int n;
char ch[100]; struct seg {
double k,b;
double ch(int x) {return k*x+b;}
}t;
struct node {int cov;seg mx;}tr[maxn<<2]; double X(seg a,seg b) {
return fabs(a.k-b.k)<eps ? inf : (a.b-b.b)/(b.k-a.k);
}
void insert(int k,int l,int r,seg g) {
int mid=(l+r)>>1;
if (!tr[k].cov) tr[k].cov=1,tr[k].mx=g;
else {
seg a1=g,a2=tr[k].mx;double x=X(a1,a2);
if (a1.ch(l)<a2.ch(l) || (fabs(a1.ch(l)-a2.ch(l))<eps && a1.k<a2.k)) swap(a1,a2);
if (x<=l || x>=r) {tr[k].mx=a1;return;}
if (x<=mid) tr[k].mx=a2,insert(k<<1,l,mid,a1);
else tr[k].mx=a1,insert(k<<1|1,mid+1,r,a2);
}
}
double query(int k,int l,int r,int x) {
if (l==r) return tr[k].cov ? tr[k].mx.ch(x) : 0;
int mid=(l+r)>>1;double t;
if (x<=mid) t=query(k<<1,l,mid,x);
else t=query(k<<1|1,mid+1,r,x);
return tr[k].cov ? max(t,tr[k].mx.ch(x)) : t;
} int main() {
scanf("%d",&n);
for (int x,i=1;i<=n;i++) {
scanf("%s",ch);
if (ch[0]=='P') scanf("%lf%lf",&t.b,&t.k),insert(1,0,lim,t);
if (ch[0]=='Q') scanf("%d",&x),printf("%lld\n",(LL)query(1,0,lim,x-1)/100);
}
return 0;
}

【bzoj1568】 JSOI2008—Blue Mary开公司的更多相关文章

  1. bzoj千题计划219:bzoj1568: [JSOI2008]Blue Mary开公司

    http://www.lydsy.com/JudgeOnline/problem.php?id=1568 写多了就觉着水了... #include<cstdio> #include< ...

  2. BZOJ1568: [JSOI2008]Blue Mary开公司【李超树】

    Description Input 第一行 :一个整数N ,表示方案和询问的总数. 接下来N行,每行开头一个单词"Query"或"Project". 若单词为Q ...

  3. BZOJ1568: [JSOI2008]Blue Mary开公司

    可以平衡树或线段树维护斜率来做. 还有一种线段树直接打标记的做法: 线段树每个节点存一条线段作为标记,打标记时如果已有标记,则把占优区间小的那个线段下放. #include<cstdio> ...

  4. 2019.02.11 bzoj1568: [JSOI2008]Blue Mary开公司(线段树)

    传送门 题意简述:维护整体加一条线段,求单点极值. 思路: 直接上李超线段树维护即可. 代码: #include<bits/stdc++.h> #define ri register in ...

  5. [bzoj1568][JSOI2008]Blue Mary开公司——李超线段树

    题目大意 题解 这道题需要用到一种叫做李超线段树的东西.我对于李超线段树,是这样理解的: 给节点打下的标记不进行下传,而是仅仅在需要的时候进行下传,这就是所谓永久化标记. 对于这道题,借用一张图, 这 ...

  6. 【BZOJ1568】[JSOI2008]Blue Mary开公司(李超线段树)

    [BZOJ1568][JSOI2008]Blue Mary开公司(李超线段树) 题面 BZOJ 洛谷 题解 是模板题啊. #include<iostream> #include<cs ...

  7. 【BZOJ1568】[JSOI2008]Blue Mary开公司 线段树

    [BZOJ1568][JSOI2008]Blue Mary开公司 Description Input 第一行 :一个整数N ,表示方案和询问的总数.  接下来N行,每行开头一个单词“Query”或“P ...

  8. 【BZOJ-1568】Blue Mary开公司 李超线段树 (标记永久化)

    1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 557  Solved: 192[Submit ...

  9. 数据结构(线段树):BZOJ 1568 [JSOI2008]Blue Mary开公司

    1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 602  Solved: 214[Submit ...

  10. [BZOJ 1568][JSOI2008]Blue Mary开公司

    [BZOJ 1568][JSOI2008]Blue Mary开公司 题意 \(n\) 次操作, 维护一个一次函数集合 \(S\). 有两种操作: 给定 \(b\) 和 \(k\), 向 \(S\) 中 ...

随机推荐

  1. [spark][python]Spark map 处理

    map 就是对一个RDD的各个元素都施加处理,得到一个新的RDD 的过程 [training@localhost ~]$ cat names.txtYear,First Name,County,Sex ...

  2. run `npm audit fix` to fix them, or `npm audit` for details

    问题 added 246 packages from 681 contributors and audited 382 packages in 17.509s found 13 vulnerabili ...

  3. ABPZero中的Name和SurName处理,以及EmailAddress解决方案(完美)。

    使用ABPzero的朋友们都知道,User表中有Name和Surname两个字段,这两个字段对于国内的用户来说相当的不友好. 以及我们的一些系统中是不会涉及到EmailAddress字段.也就是说不会 ...

  4. Docker网络解决方案 - Weave部署记录

    前面说到了Flannel的部署,今天这里说下Docker跨主机容器间网络通信的另一个工具Weave的使用.当容器分布在多个不同的主机上时,这些容器之间的相互通信变得复杂起来.容器在不同主机之间都使用的 ...

  5. Nginx的location配置规则梳理

    Nginx几乎是当下绝大多数公司在用的web应用服务,熟悉Nginx的配置,对于我们日常的运维工作是至关重要的,下面就Nginx的location配置进行梳理: 1)location匹配的是nginx ...

  6. Git常用命令梳理

    在日常的Git版本库管理工作中用到了很多操作命令,以下做一梳理: 查看分支列表,带有*的分支表示是当前所在分支 [root@115~~]#git branch 查看分支详细情况 (推荐这种方式) [r ...

  7. 第三次作业(1) Visual Studio程序安装过程和练习过程

    Visual Studio程序安装过程和练习过程 第一步 首先要在网上找一个VS2013的安装包,之后我安装在D盘上,C盘上也需要有5.2G空间,勾选相应的选项,才能继续安装. 安装的过程很漫长,接近 ...

  8. “Linux内核分析”第五周报告

    张文俊+ 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 学习总结 1.给M ...

  9. js 基础-&& || 逻辑与和逻辑或

    今天百度发现一个简化长if   else if 语句的方法,看起来及其强大,感觉这样虽然对系统性能提升没有帮助但是代码更简练了,分析了一番,下面先说说自己学到的理论. 首先要弄清楚js 中对于 变量, ...

  10. 如何实现基于ssh框架的投票系统的的质量属性

    如何实现基于ssh框架的投票系统的的质量属性: 项目 :网上考试系统 我做的是网上考试系统,因为标准化的考试越来越重要,而通过计算机进行标准化判卷,系统会自动判卷出成绩,组织考试的人不用组织人员打印试 ...