Description

Input

第一行 :一个整数N ,表示方案和询问的总数。

接下来N行,每行开头一个单词“Query”或“Project”。

若单词为Query,则后接一个整数T,表示Blue Mary询问第T天的最大收益。

若单词为Project,则后接两个实数S,P,表示该种设计方案第一天的收益S,以及以后每天比上一天多出的收益P。

1 <= N <= 100000 1 <= T <=50000 0 < P < 100,| S | <= 10^6

提示:本题读写数据量可能相当巨大,请选手注意选择高效的文件读写方式。

Output

对于每一个Query,输出一个整数,表示询问的答案,并精确到整百元(以百元为单位,

例如:该天最大收益为210或290时,均应该输出2)。没有方案时回答询问要输出0

Sample Input

10

Project 5.10200 0.65000

Project 2.76200 1.43000

Query 4

Query 2

Project 3.80200 1.17000

Query 2

Query 3

Query 1

Project 4.58200 0.91000

Project 5.36200 0.39000

Sample Output

0

0

0

0

0


李超树模板题

很简单的好吧,就是一开始忘了对k分类讨论

用线段树来存储每个区间的相对最优解

这里用到了一个永久化标记的思想

这个东西很好啊,每个节点记录区间的相对最优解之后

直接dfs到叶子节点把路径上经过的所有节点的权值全部取max就可以了

正确性非常显然,但是怎么维护呢?

我们假设当前要更新的是一个节点\(p_t\),那么如果\(p_t\)的k大于拿来更新的\(val\)的k

如果在\(mid\)处\(p_t\)大于\(val\),那么显然在\([mid+1,r]\)这个区间里val不可能比\(p_t\)更优

所以就把\(val\)递归到左区间更新

如果在\(mid\)处\(p_t\)小于\(val\),那么在\([l,mid]\)这个区间\(p_t\)不可能比\(val\)更优

所以就把\(p_t\)递归到右区间,再把\(p_t\)替换成val就可以了


//Author: dream_maker
#include<bits/stdc++.h>
using namespace std;
//----------------------------------------------
//typename
typedef long long ll;
//convenient for
#define fu(a, b, c) for (int a = b; a <= c; ++a)
#define fd(a, b, c) for (int a = b; a >= c; --a)
#define fv(a, b) for (int a = 0; a < (signed)b.size(); ++a)
//inf of different typename
const int INF_of_int = 1e9;
const ll INF_of_ll = 1e18;
//fast read and write
template <typename T>
void Read(T &x) {
bool w = 1;x = 0;
char c = getchar();
while (!isdigit(c) && c != '-') c = getchar();
if (c == '-') w = 0, c = getchar();
while (isdigit(c)) {
x = (x<<1) + (x<<3) + c -'0';
c = getchar();
}
if (!w) x = -x;
}
template <typename T>
void Write(T x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) Write(x / 10);
putchar(x % 10 + '0');
}
//----------------------------------------------
#define LD (t << 1)
#define RD (t << 1 | 1)
const int MAXN = 5e4;
struct Line {
double k, b;
} p[(MAXN << 2) + 10];
double calc(int x, Line a) {
return a.k * (double) x + a.b;
}
bool cmp(int x, Line a, Line b) {
return calc(x, a) > calc(x, b);
}
void modify(int t, int l, int r, Line vl) {
if (l == r) {
if (cmp(l, vl, p[t])) p[t] = vl;
return;
}
int mid = (l + r) >> 1;
if (p[t].k <= vl.k) {
if (cmp(mid, vl, p[t])) {
modify(LD, l, mid, p[t]);
p[t] = vl;
} else {
modify(RD, mid + 1, r, vl);
}
} else {
if (cmp(mid, vl, p[t])) {
modify(RD, mid + 1, r, p[t]);
p[t] = vl;
} else {
modify(LD, l, mid, vl);
}
}
}
double query(int t, int l, int r, int pos) {
if (l == r) return calc(pos, p[t]);
int mid = (l + r) >> 1;
if (pos <= mid) return max(calc(pos, p[t]), query(LD, l, mid, pos));
else return max(calc(pos, p[t]), query(RD, mid + 1, r, pos));
}
int n;
char c[10];
int main() {
Read(n);
while (n--) {
scanf("%s", c);
if (c[0] == 'P') {
Line now;
scanf("%lf%lf", &now.b, &now.k);
now.b -= now.k;
modify(1, 1, MAXN, now);
} else {
int x; Read(x);
printf("%d\n", (int)query(1, 1, MAXN, x) / 100);
}
}
return 0;
}

BZOJ1568: [JSOI2008]Blue Mary开公司【李超树】的更多相关文章

  1. P4254 [JSOI2008]Blue Mary开公司 (李超树)

    题意:插入一些一次函数线段 每次询问在x = x0处这些线段的最大值 题解:李超树模版题 维护优势线段 注意这题的输入是x=1时的b #include <iostream> #includ ...

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

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

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

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

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

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

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

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

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

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

  7. JSOI2008 Blue Mary开公司 | 李超线段树学习笔记

    题目链接:戳我 这相当于是一个李超线段树的模板qwqwq,题解就不多说了. 代码如下: #include<iostream> #include<cstdio> #include ...

  8. BZOJ.1568.[JSOI2008]Blue Mary开公司(李超线段树)

    题目链接 线段树每个节点记录\(f(mid)\)最大的直线(在\(mid\)处函数值最大的直线),称作优势线段(还是直线啊...无所谓了). 如果是在区间插入线段会影响\(O(\log n)\)个区间 ...

  9. [JSOI2008]Blue Mary开公司[李超线段树]

    题面 bzoj luogu 好久以前听lxl讲过 咕掉了.. 竟然又遇到了 安利blog #include <cmath> #include <cstring> #includ ...

随机推荐

  1. cookie、session、sessionid ,jsessionid 的区别

    本文是转载虫师博客的文章http://www.cnblogs.com/fnng/archive/2012/08/14/2637279.html cookie.session.sessionid 与js ...

  2. asp.net调用opencv类库,实现图像处理显示

    asp.net调用opencv类库,实现图像处理显示     ​      原理上来说,通过dll的调用,无论是asp.net还是winform都可以调用opencv及其类库.但是在实现的过程还是有许 ...

  3. linux及安全第六周总结——20135227黄晓妍

    总结部分: 操作系统内核三大功能: 进程管理,内存管理,文件系统 最核心的是进程管理 为了管理,首先要对每一个进程进行描述.进程描述符提供了所有内核需要了解的信息. 进程控制模块:task_struc ...

  4. 编译 Tensorflow 1.10 + CUDA9.2 + MKL【转】

    本文转自:https://www.solarck.com/compile-tensorflow-gpu.html 我的电脑系统是基于 Archlinux 的 Manjaro,软件包更新的比较激进,很早 ...

  5. Nginx反向代理缓冲区优化

    内容目录 proxy_buffering proxy_buffer_size proxy_buffers proxy_busy_buffers_size proxy_max_temp_file_siz ...

  6. MyBatis小案例完善增强

    https://blog.csdn.net/techbirds_bao/article/details/9233599 上链接为一个不错的Mybatis进阶博客 当你把握时间,时间与你为伍. 将上一个 ...

  7. Solidity 官方文档中文版 4_Solidity 编程实例

    Voting 投票 接下来的合约非常复杂,但展示了很多Solidity的特性.它实现了一个投票合约.当然,电子选举的主要问题是如何赋予投票权给准确的人,并防止操纵.我们不能解决所有的问题,但至少我们会 ...

  8. php 格式化时间

    <?php echo date("Y/m/d") . "<br>"; echo date("Y.m.d") . " ...

  9. 动态规划-House Robber

    2018-04-29 20:20:56 House Robber问题是leetcode上经典的系列题,这里对其中的题目做一个讲解. 198. House Robber 问题描述: 问题求解: 本质上就 ...

  10. 递归--练习9--noi8758 2的幂次方表示

    递归--练习9--noi8758 2的幂次方表示 一.心得 找准子问题就好 二.题目 8758:2的幂次方表示 总时间限制:  1000ms 内存限制:  65536kB 描述 任何一个正整数都可以用 ...