BZOJ1568:[JSOI2008]Blue Mary开公司
浅谈标记永久化:https://www.cnblogs.com/AKMer/p/10137227.html
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1568
什么是李超线段树?李超线段树就是用标记永久化维护平面内线段覆盖的线段树。
对于这个题,对于每个区间,我们可以存下来在这个区间的中点\(y\)值最大的直线。
对于添加一条线段,我们在线段树上对其进行递归替换原有标记:
如果当前线段的斜率大于当前区间标记线段的斜率:
如果在中点当前线段更大,由于斜率更大,说明在中点及中点以后的部分中,当前线段会比标记线段更优,我们先用标记线段去替换更新中点以前的部分,再把当前线段变成当前区间的标记线段。
否则,递归用当前线段去替换更新中点以后的区间。
如果当前线段的斜率小于当前区间标记线段的斜率:
如果在中点当前线段更大,由于斜率更小,说明在中点及中点以前的部分中,当前线段会比标记线段更优,我们先用标记线段去替换更新中点以后的部分,再把当前线段变成当前区间的标记线段。
否则,递归用当前线段去替换更新中点以前的区间。
对于询问,就拿一个一个区间标记的直线算算取最大值就行了。
时间复杂度:\(O(NlogT)\)
空间复杂度:\(O(T)\)
代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=5e4+5;
int n,tot;
char s[10];
double b[maxn<<1],k[maxn<<1];
int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
inline double calc(int id,int x) {
return b[id]+k[id]*(x-1);
}
struct segment_tree {
int tag[maxn<<2];
void change(int p,int l,int r,int id) {
if(l==r) {
if(calc(id,l)>calc(tag[p],l))tag[p]=id;
return;
}
int mid=(l+r)>>1;
if(k[id]>k[tag[p]]) {
if(calc(id,mid)>calc(tag[p],mid))change(p<<1,l,mid,tag[p]),tag[p]=id;
else change(p<<1|1,mid+1,r,id);
}
else {
if(calc(id,mid)>calc(tag[p],mid))change(p<<1|1,mid+1,r,tag[p]),tag[p]=id;
else change(p<<1,l,mid,id);
}
}
double query(int p,int l,int r,int pos) {
if(l==r)return calc(tag[p],l);
int mid=(l+r)>>1;double ans=calc(tag[p],pos);
if(pos<=mid)ans=max(ans,query(p<<1,l,mid,pos));
else ans=max(ans,query(p<<1|1,mid+1,r,pos));
return ans;
}
}T;
int main() {
n=read();
for(int i=1;i<=n;i++) {
scanf("%s",s+1);
if(s[1]=='Q') {
int pos=read();
double ans=T.query(1,1,5e4,pos);
printf("%d\n",(int)(ans/100));
}
else {
tot++;
scanf("%lf%lf",b+tot,k+tot);
T.change(1,1,5e4,tot);
}
}
return 0;
}
BZOJ1568:[JSOI2008]Blue Mary开公司的更多相关文章
- bzoj千题计划219:bzoj1568: [JSOI2008]Blue Mary开公司
http://www.lydsy.com/JudgeOnline/problem.php?id=1568 写多了就觉着水了... #include<cstdio> #include< ...
- BZOJ1568: [JSOI2008]Blue Mary开公司【李超树】
Description Input 第一行 :一个整数N ,表示方案和询问的总数. 接下来N行,每行开头一个单词"Query"或"Project". 若单词为Q ...
- BZOJ1568: [JSOI2008]Blue Mary开公司
可以平衡树或线段树维护斜率来做. 还有一种线段树直接打标记的做法: 线段树每个节点存一条线段作为标记,打标记时如果已有标记,则把占优区间小的那个线段下放. #include<cstdio> ...
- 2019.02.11 bzoj1568: [JSOI2008]Blue Mary开公司(线段树)
传送门 题意简述:维护整体加一条线段,求单点极值. 思路: 直接上李超线段树维护即可. 代码: #include<bits/stdc++.h> #define ri register in ...
- [bzoj1568][JSOI2008]Blue Mary开公司——李超线段树
题目大意 题解 这道题需要用到一种叫做李超线段树的东西.我对于李超线段树,是这样理解的: 给节点打下的标记不进行下传,而是仅仅在需要的时候进行下传,这就是所谓永久化标记. 对于这道题,借用一张图, 这 ...
- 【BZOJ1568】[JSOI2008]Blue Mary开公司(李超线段树)
[BZOJ1568][JSOI2008]Blue Mary开公司(李超线段树) 题面 BZOJ 洛谷 题解 是模板题啊. #include<iostream> #include<cs ...
- 【BZOJ1568】[JSOI2008]Blue Mary开公司 线段树
[BZOJ1568][JSOI2008]Blue Mary开公司 Description Input 第一行 :一个整数N ,表示方案和询问的总数. 接下来N行,每行开头一个单词“Query”或“P ...
- 【BZOJ-1568】Blue Mary开公司 李超线段树 (标记永久化)
1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 557 Solved: 192[Submit ...
- 数据结构(线段树):BZOJ 1568 [JSOI2008]Blue Mary开公司
1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 602 Solved: 214[Submit ...
- [BZOJ 1568][JSOI2008]Blue Mary开公司
[BZOJ 1568][JSOI2008]Blue Mary开公司 题意 \(n\) 次操作, 维护一个一次函数集合 \(S\). 有两种操作: 给定 \(b\) 和 \(k\), 向 \(S\) 中 ...
随机推荐
- 【转载】【selenium+Python WebDriver】之元素定位
总结: 感谢: “煜妃”<Selenuim+Python之元素定位总结及实例说明> “Huilaojia123”<selenium WebDriver定位元素学习总结> “上海 ...
- mongo 的逻辑存储和物理存储
逻辑存储空间与物理存储空间有差距的主要原因 存储引擎存储时,需要记录一些额外的元数据信息,这会导致物理空间总和比逻辑空间略大 存储引擎可能支持数据压缩,逻辑的数据块存储到磁盘时,经过压缩可能比逻辑数据 ...
- mongodb的IO测试工具 mongoperf
之前没发现mongoperf这个工具,测试IO的状态用的是iostat来进行观察. mongoperf < myjsonconfigfile echo "{nThreads:2,fi ...
- ios和mac开发 学习资料
1.WWDC14 Session 409 学习笔记: http://url.cn/Ju2Yt5 2..WWDC14 Session 4092学习笔记: http://url.cn/Rx0mAN 3.i ...
- 使用T4模板为EF框架添加数据库实体注释
网上有一个解决方法如下: http://www.cnblogs.com/stone_w/archive/2012/10/25/2738345.html 不过我试了下没解决太麻烦了 而且一旦EF要重新生 ...
- programming review (c++): (3)graph, binary search
I.graph #include <iostream> #include <vector> using namespace std; vector<vector<, ...
- NSSrting的几种经常使用的使用方法
1.创建NSString字符串 NSString 与 char* 最大的差别就是 NSString是一个objective对象,而char* 是一个字节数组. @+" 字符串 " ...
- python的安装及matplotlib安装
本文通过实践,自行安装了一遍python及matplotlib. 1.用python2.7的最新版本(写本文时,用的2.7.13).因为默认有安装pip,记得安装时选择最后一个添加环境变量,不然还要手 ...
- Hadoop实战-Flume之自定义Sink(十九)
import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import j ...
- ideal 快捷键
1.输入sout --> System.out.println(); 2.输入psvm --> main函数; IntelliJ Idea 2017 免费激活方法 1. 到网站 http: ...