*题目描述:
在一个小国家中,一个新的小镇终于建成了!如往常一样,Mirko获得了“首席税务巡查员”的职位。他的任务是保证正确地计算各公司的收入情况。一共有N家办公室坐落在主干道上,从左到右被编号为1~N。一开始,所有办公室一开始都是空的。随后,一些公司会搬入或搬出某些办公室。Mirko时不时地会经过某些办公室并审查在这些办公室中,最富有的公司的账目。
一个公司被以如下的方式描述:
T-表示搬入的第一天。
K-表示搬入的办公室的标号。
Z-公司每日的盈利。(可以是负值表示亏损)
S-公司搬入时的公司财务情况。(即公司的账户资金,也可以是负值)
如果一家公司已经在 K 办公室了,当有新公司要进入 K 办公室时,这家公司会立刻搬出。
新公司第一天并不会运营,盈利从第二天开始计算。
Mirko的审查以 3 个整数来描述:
T-审查的时间。
A 和 B-Mirko会检查 A 办公室至 B 办公室(包括A和B)之间的公司。
Mirko只会在一天结束时检查,所有公司这时已经计算完成了当天利润。
*输入:
第一行包含 2 个正整数:N(1<=N<=100000)表示办公室的数量和M(1<=M<=300000)表示事件的个数。
接下来 M 行,遵循以下格式:“1 T K Z S”或“2 T A B”(含义如题目描述)。其中 T 会严格递增,并且最后一天小于 1000000,Z 和 S 的绝对值也严格小于 1000000。
(注意A可能大于B)
*输出:
对于每次Mirko的审查,每行输出一个整数,表示当天最富有的公司的资产(可以为负)。如果Mirko经过的所有办公室中都没有公司入驻,则输出“nema”(不加引号)。
*题解:
分块。题目的意思大概就是求一个区间的半平面交(相当于bzoj1007的水平可见直线)。然而数据只有10的5次方,可以分块搞。每次修改就暴力重构这个块,在块内做半平面交。查询的话如果在同一块的话就暴力查,否则先把头尾两个不全的块暴力查一边,中间完整的块就按之前维护的半平面交查过去。然后因为t是单调的,所以可以计一个left表示当前这个块内查到了第几条直线上。
*代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <cmath>
  5. #ifdef WIN32
  6. #define LL "%I64d"
  7. #else
  8. #define LL "%lld"
  9. #endif
  10. #ifdef CT
  11. #define debug(...) printf(__VA_ARGS__)
  12. #define setfile()
  13. #else
  14. #define debug(...)
  15. #define filename ""
  16. #define setfile() freopen(filename".in", "r", stdin); freopen(filename".out", "w", stdout);
  17. #endif
  18. #define R register
  19. #define getc() (S == T && (T = (S = B) + fread(B, 1, 1 << 15, stdin), S == T) ? EOF : *S++)
  20. #define dmax(_a, _b) ((_a) > (_b) ? (_a) : (_b))
  21. #define dmin(_a, _b) ((_a) < (_b) ? (_a) : (_b))
  22. #define cmax(_a, _b) (_a < (_b) ? _a = (_b) : 0)
  23. #define cmin(_a, _b) (_a > (_b) ? _a = (_b) : 0)
  24. char B[1 << 15], *S = B, *T = B;
  25. inline int FastIn()
  26. {
  27. R char ch; R int cnt = 0; R bool minus = 0;
  28. while (ch = getc(), (ch < '0' || ch > '9') && ch != '-') ;
  29. ch == '-' ? minus = 1 : cnt = ch - '0';
  30. while (ch = getc(), ch >= '0' && ch <= '9') cnt = cnt * 10 + ch - '0';
  31. return minus ? -cnt : cnt;
  32. }
  33. #define maxn 100010
  34. #define maxsize 3010
  35. #define inf (1ll << 62)
  36. int id[maxn], block, n, m, left[maxsize], right[maxsize], t;
  37. long long ans;
  38. bool in[maxn], build[maxsize];
  39. struct Poi
  40. {
  41. int k;
  42. long long b;
  43. inline bool operator < (const Poi &that) const
  44. {
  45. return k < that.k || (k == that.k && b > that.b);
  46. }
  47. inline bool operator == (const Poi &that) const
  48. {
  49. return k == that.k && b == that.b;
  50. }
  51. inline double operator ^ (const Poi &that) const
  52. {
  53. return 1.0 * (that.b - b) / (k - that.k);
  54. }
  55. }a[maxn], b[maxn], st[maxsize][maxsize];
  56. inline void add(R int x)
  57. {
  58. R int kk = id[x], l = block * kk, r = block * (kk + 1) - 1, cnt = 0;
  59. build[kk] = 1;
  60. cmin(r, n);
  61. for (R int i = l; i <= r; ++i) if (in[i]) b[++cnt] = a[i];
  62. std::sort(b + 1, b + cnt + 1);
  63. #define stack st[kk]
  64. R int top = 0; b[0].k = -inf;
  65. for (R int i = 1; i <= cnt; ++i)
  66. if (b[i].k != b[i - 1].k)
  67. {
  68. for ( ; top; )
  69. {
  70. if ( (stack[top].k == b[i].k)
  71. || (top > 1
  72. && ((b[i] ^ stack[top - 1]) <= (stack[top] ^ stack[top - 1]) ) )
  73. )
  74. top--;
  75. else break;
  76. }
  77. stack[++top] = b[i];
  78. }
  79. left[kk] = 1;
  80. right[kk] = top;
  81. }
  82. inline void voi(R int l, R int r)
  83. {
  84. for (R int i = l; i <= r; ++i) if (in[i])
  85. cmax(ans, 1ll * a[i].k * t + a[i].b);
  86. }
  87. inline void query(R int x)
  88. {
  89. #define q st[x]
  90. if (!build[x]) return ;
  91. for (; left[x] < right[x]; ++left[x])
  92. {
  93. R double tmp = q[left[x]] ^ q[left[x] + 1];
  94. if (tmp >= t) break;
  95. }
  96. cmax(ans, 1ll * q[left[x]].k * t + q[left[x]].b);
  97. }
  98. int main()
  99. {
  100. // setfile();
  101. n = FastIn(), m = FastIn();
  102. block = sqrt(n) / 3 + 1;
  103. for (R int i = 1; i <= n; ++i) id[i] = i / block;
  104. for ( ; m; --m)
  105. {
  106. R int opt = FastIn(); t = FastIn();
  107. if (opt == 1)
  108. {
  109. R int k = FastIn(), z = FastIn(), s = FastIn();
  110. in[k] = 1; a[k] = (Poi) {z, 1ll * s - 1ll * z * t};
  111. add(k);
  112. }
  113. else
  114. {
  115. R int l = FastIn(), r = FastIn();
  116. if (l > r) std::swap(l, r);
  117. ans = -inf;
  118. if (id[l] == id[r]) voi(l, r);
  119. else
  120. {
  121. voi(l, (id[l] + 1) * block - 1);
  122. voi(id[r] * block, r);
  123. for (R int i = id[l] + 1; i < id[r]; ++i) query(i);
  124. }
  125. if (ans == -inf) puts("nema");
  126. else printf("%lld\n", ans );
  127. }
  128. }
  129. return 0;
  130. }

【bzoj3463】[COCI2012] Inspector的更多相关文章

  1. 【UVa】12118 Inspector's Dilemma(欧拉道路)

    题目 题目     分析 很巧秒的一道题目,对着绿书瞎yy一会. 联一下必须要走的几条边,然后会形成几个联通分量,统计里面度数为奇数的点,最后再减去2再除以2.这样不断相加的和加上e再乘以t就是答案, ...

  2. 企业IT管理员IE11升级指南【16】—— 使用Compat Inspector快速定位IE兼容性问题

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  3. 【题解】Informacije [COCI2012]

    [题解]Informacije [COCI2012] 传送门:官方题面 [题目描述] 有一个长度为 \(n\) 的 序列 \(a\)(由 \([1,n]\) 中的数组成,且每个数只会出现一次),现给出 ...

  4. 企业IT管理员IE11升级指南【17】—— F12 开发者工具

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  5. 企业IT管理员IE11升级指南【15】—— 代理自动配置脚本

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  6. 企业IT管理员IE11升级指南【1】—— Internet Explorer 11增强保护模式 (EPM) 介绍

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  7. 企业IT管理员IE11升级指南【2】—— Internet Explorer 11 对Adobe Flash的支持

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  8. 企业IT管理员IE11升级指南【3】—— IE11 新的GPO设置

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  9. 企业IT管理员IE11升级指南【4】—— IE企业模式介绍

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

随机推荐

  1. RPM包或源码包

    安装RPM包或源码包 点击vmware右下角光驱连接. 安装rpm包 -i:表示安装 -v:表示可视化 -h:表示显示安装进度 (同时使用) --force:表示强制安装,即使覆盖属于其他包的文件也要 ...

  2. C++智能指针 原理、使用与实现

    目录 理解智能指针的原理 智能指针的使用 智能指针的设计和实现 1.智能指针的作用 C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理.程序员自己管理堆内存可以提高了程序 ...

  3. Dp test solution

    Dp test solution 按照难易程度排序题解: Problem B Problem Description Tarzan 现在想要知道,区间 [L,R] 内有多少数是优美的.我们定义一个数是 ...

  4. [BZOJ 3509] [CodeChef] COUNTARI (FFT+分块)

    [BZOJ 3509] [CodeChef] COUNTARI (FFT+分块) 题面 给出一个长度为n的数组,问有多少三元组\((i,j,k)\)满足\(i<j<k,a_j-a_i=a_ ...

  5. faker数据填充详解

    安装 在laravel中已经自动集成,无需手动安装.如需在其他地方使用,可使用以下命令进行安装. composer require fzaninotto/faker 为Faker指定中文支持 可通过在 ...

  6. python列表,字典,集合

    初识模块 import sys print(sys.path)#查看化境变量 print(sys.argv)#查看文件的相对路径,但是在pachrm中 会自动转为绝对路径 import os #os. ...

  7. 计算机系统结构总结_Branch prediction

    Textbook:<计算机组成与设计——硬件/软件接口>  HI<计算机体系结构——量化研究方法>          QR Branch Prediction 对于下面的指令: ...

  8. asp.net后台cs中的JSON格式变量在前台Js中调用方法

    //后台cs代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using ...

  9. Android真机测试时无法连接服务器

    之前服务器的通信一直是在模拟机上实现的,今天用在真机上却不成功.百度之后发现是安卓9以后禁止使用HTTP直接访问服务器.记录一下以后使用. 参考博文:https://blog.csdn.net/don ...

  10. http参数传递方式

    url传参 这种在各种method(get,post,delete,put)都能使用,解析速度快 body体中的参数 application/x-www-form-urlencoded 这应该是最常见 ...