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就可以了


  1. //Author: dream_maker
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. //----------------------------------------------
  5. //typename
  6. typedef long long ll;
  7. //convenient for
  8. #define fu(a, b, c) for (int a = b; a <= c; ++a)
  9. #define fd(a, b, c) for (int a = b; a >= c; --a)
  10. #define fv(a, b) for (int a = 0; a < (signed)b.size(); ++a)
  11. //inf of different typename
  12. const int INF_of_int = 1e9;
  13. const ll INF_of_ll = 1e18;
  14. //fast read and write
  15. template <typename T>
  16. void Read(T &x) {
  17. bool w = 1;x = 0;
  18. char c = getchar();
  19. while (!isdigit(c) && c != '-') c = getchar();
  20. if (c == '-') w = 0, c = getchar();
  21. while (isdigit(c)) {
  22. x = (x<<1) + (x<<3) + c -'0';
  23. c = getchar();
  24. }
  25. if (!w) x = -x;
  26. }
  27. template <typename T>
  28. void Write(T x) {
  29. if (x < 0) {
  30. putchar('-');
  31. x = -x;
  32. }
  33. if (x > 9) Write(x / 10);
  34. putchar(x % 10 + '0');
  35. }
  36. //----------------------------------------------
  37. #define LD (t << 1)
  38. #define RD (t << 1 | 1)
  39. const int MAXN = 5e4;
  40. struct Line {
  41. double k, b;
  42. } p[(MAXN << 2) + 10];
  43. double calc(int x, Line a) {
  44. return a.k * (double) x + a.b;
  45. }
  46. bool cmp(int x, Line a, Line b) {
  47. return calc(x, a) > calc(x, b);
  48. }
  49. void modify(int t, int l, int r, Line vl) {
  50. if (l == r) {
  51. if (cmp(l, vl, p[t])) p[t] = vl;
  52. return;
  53. }
  54. int mid = (l + r) >> 1;
  55. if (p[t].k <= vl.k) {
  56. if (cmp(mid, vl, p[t])) {
  57. modify(LD, l, mid, p[t]);
  58. p[t] = vl;
  59. } else {
  60. modify(RD, mid + 1, r, vl);
  61. }
  62. } else {
  63. if (cmp(mid, vl, p[t])) {
  64. modify(RD, mid + 1, r, p[t]);
  65. p[t] = vl;
  66. } else {
  67. modify(LD, l, mid, vl);
  68. }
  69. }
  70. }
  71. double query(int t, int l, int r, int pos) {
  72. if (l == r) return calc(pos, p[t]);
  73. int mid = (l + r) >> 1;
  74. if (pos <= mid) return max(calc(pos, p[t]), query(LD, l, mid, pos));
  75. else return max(calc(pos, p[t]), query(RD, mid + 1, r, pos));
  76. }
  77. int n;
  78. char c[10];
  79. int main() {
  80. Read(n);
  81. while (n--) {
  82. scanf("%s", c);
  83. if (c[0] == 'P') {
  84. Line now;
  85. scanf("%lf%lf", &now.b, &now.k);
  86. now.b -= now.k;
  87. modify(1, 1, MAXN, now);
  88. } else {
  89. int x; Read(x);
  90. printf("%d\n", (int)query(1, 1, MAXN, x) / 100);
  91. }
  92. }
  93. return 0;
  94. }

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. LINUX_RHEl6_DHCP服务器配置

    安装DHCP服务器 DHCP配置文件 可以使用RHEL 6.0自身携带的RPM包安装,安装结束后DHCP端口监督程序dhcpd配置文件是/etc/dhcp目录中的名为dhcpd.conf的文件.下面手 ...

  2. Codeforces Round #523 (Div. 2) Solution

    A. Coins Water. #include <bits/stdc++.h> using namespace std; int n, s; int main() { while (sc ...

  3. ng-深度学习-课程笔记-3: Python和向量化(Week2)

    1 向量化( Vectorization ) 在逻辑回归中,以计算z为例,$ z =  w^{T}+b $,你可以用for循环来实现. 但是在python中z可以调用numpy的方法,直接一句$z = ...

  4. Digital Image Processing 学习笔记1

    第一章 1.1 数字图像 一幅图像可以定义为一个而为函数, 其中x和y是空间坐标,而在任何一对空间坐标(x, y)处的幅值f称为图像在该点处的强度或灰度.当x, y和灰度值f是有限的离散数值时,该图像 ...

  5. DB杂记

    1. mybatits 批量插入: <insert id="insertColumnitem2"> INSERT INTO REPORT_COLUMNITEM (COL ...

  6. 20145105 《Java程序设计》第5周学习总结

    20145105 <Java程序设计>第5周学习总结 教材学习内容总结 第八章 异常处理 一.语法与继承架构 (一)使用try.catch 执行流程 尝试执行try区块中程序代码 如果出现 ...

  7. POJ 3660 Cow ContestCow(Floyd传递闭包)题解

    题意:给出m个关系,问你能确定机头牛的排名 思路:要确定排名那必须要把他和其他n-1头牛比过才行,所以Floyd传递闭包,如果赢的+输的有n-1就能确定排名. 代码: #include<cstd ...

  8. C# 后台模块 Word 模板操作

    public static string CreateWord() { //********************************************** //来自博客http://bl ...

  9. hdu 5701 中位数计数 思路题

    中位数计数 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  10. Qt5_pro_02

    1.g++ 编译参数 如果 用g++编译时,命令行是这样的:“g++ main.cpp -std=c++0x -pthread” 则在Qt的pro文件中这样设置: QMAKE_CXXFLAGS += ...