\(\text{Solution}\)

记 \(k\) 这个办公室相关属性有 \(t,z,s\)

对于以后的某一天 \(T\),其账户余额为 \((T-t)z+s\)

要最大化这东西,不妨另 \(b=(T-t)z+s\)

则等价于 \(tz-s=Tz-b\),要最大化 \(-b\) 即最小化 \(b\)

把 \((z,tz-s)\) 视为坐标系一点,用斜率为 \(T\) 的直线过点,最小化截距

且 \(T\) 递增

那么就是很简单的维护凸包的题了

但发现能用的办公室为一个区间,且需要支持加点和删点

考虑分块,每个块内维护一个凸包

修改只涉及一个点所在的块,直接暴力重构凸包

为支持操作需要辅助数组记录一些信息,这些都是小细节了

\(\text{Code}\)

#include <cstdio>
#include <iostream>
#include <cmath>
#define RE register
#define IN inline
#define LL long long
using namespace std; const int N = 1e5 + 5, M = 325;
const LL INF = 0x3f3f3f3f3f3f3f3f;
int n, m, st[M], ed[M], id[N], L[M], R[M], bz[N], bb[N], aa[M][M], ct[M];
struct Point{LL x, y;}a[N], b[M][M], c[M][M]; IN void Prework()
{
int num = sqrt(n);
for(RE int i = 1; i <= num; i++)
{
st[i] = ed[i - 1] + 1, ed[i] = (i == num ? n : ed[i - 1] + n / num);
for(RE int j = st[i]; j <= ed[i]; j++) id[j] = i;
}
}
IN double slope(Point a, Point b)
{
if (a.x == b.x) return INF;
return 1.0 * (a.y - b.y) / (a.x - b.x);
}
IN void Rebuild(int l)
{
int x = id[l];
if (bb[l])
{
for(RE int i = bb[l]; i < ct[x]; i++) b[x][i] = b[x][i + 1], bb[aa[x][i] = aa[x][i + 1]] = i;
--ct[x], bb[l] = 0;
}
for(RE int i = 1; i <= ct[x]; i++)
if (b[x][i].x > a[l].x || (b[x][i].x == a[l].x && b[x][i].y > a[l].y))
{
for(RE int j = ct[x] + 1; j > i; j--) b[x][j] = b[x][j - 1], bb[aa[x][j] = aa[x][j - 1]] = j;
b[x][i] = a[l], aa[x][i] = l, bb[l] = i, ++ct[x];
break;
}
if (!bb[l]) b[x][++ct[x]] = a[l], aa[x][ct[x]] = l, bb[l] = ct[x];
L[x] = R[x] = 0;
for(RE int i = 1; i <= ct[x]; i++)
{
while (R[x] && slope(c[x][R[x]], c[x][R[x] - 1]) > slope(b[x][i], c[x][R[x]])) --R[x];
c[x][++R[x]] = b[x][i];
}
if (R[x]) L[x] = 1;
}
IN LL query(int x, int T)
{
while (L[x] < R[x] && slope(c[x][L[x]], c[x][L[x] + 1]) < T) ++L[x];
if (L[x]) return c[x][L[x]].x * T - c[x][L[x]].y;
return -INF;
}
IN LL Query(int T, int l, int r)
{
if (l > r) swap(l, r);
int x = id[l], y = id[r]; LL ans = -INF;
if (x == y)
{
for(RE int i = l; i <= r; i++) if (bz[i]) ans = max(ans, a[i].x * T - a[i].y);
return ans;
}
for(RE int i = l; i <= ed[x]; i++) if (bz[i]) ans = max(ans, a[i].x * T - a[i].y);
for(RE int i = st[y]; i <= r; i++) if (bz[i]) ans = max(ans, a[i].x * T - a[i].y);
for(RE int i = x + 1; i < y; i++) ans = max(ans, query(i, T));
return ans;
}
IN void read(int &x)
{
x = 0; char ch = getchar(); int f = 1;
for(; !isdigit(ch); f = (ch == '-' ? -1 : f), ch = getchar());
for(; isdigit(ch); x = (x<<3)+(x<<1)+(ch^48), ch = getchar());
if (f - 1) x = ~x + 1;
} int main()
{
read(n), read(m), Prework();
for(RE int op, t, k, z, s; m; --m)
{
read(op), read(t), read(k), read(z);
if (op == 1) read(s), bz[k] = 1, a[k] = (Point){z, (LL)z * t - s}, Rebuild(k);
else{
LL ans = Query(t, k, z);
if (ans == -INF) printf("nema\n");
else printf("%lld\n", ans);
}
}
}

JZOJ 3167.查税的更多相关文章

  1. [JZOJ3167] 【GDOI2013模拟3】查税

    题目 描述 题目大意 维护一个有一次函数组成的序列 具体来说,对于位置xxx,现在的值为sx+zx∗(T−tx)s_x+z_x*(T-t_x)sx​+zx​∗(T−tx​) 有两个操作,修改某个位置上 ...

  2. ABAP技术总结

      SAP ——ABAP/4 技术总结 V3.0 2014-10-14 --江正军 1. 1.1. 1.1.1. 1.2. 1.3. 1.4. 1.5. 1.6. 1.7. 1.7.1. 1.7.2. ...

  3. 从程序员之死看 IT 人士如何摆脱低情商诅咒

    (1) IT公司的创业者苏享茂忽然跳楼自杀了,自杀前,他留下几万字的文字记录.遗书,并且在自己开发的软件界面上,设置了弹出页面,控诉是恶毒前妻逼死了自己. 生命戛然而止,留给亲人痛苦,留给世人震惊. ...

  4. Jzoj 初中2249 蒸发学水(并查集)

    题目描述 众所周知,TerryHu 是一位大佬,他平时最喜欢做的事就是蒸发学水. 机房的位置一共有n 行m 列,一开始每个位置都有一滴学水,TerryHu 决定在每一个时刻选择 一滴学水进行蒸发,直到 ...

  5. [jzoj 5782]【NOIP提高A组模拟2018.8.8】 城市猎人 (并查集按秩合并+复杂度分析)

    传送门 Description 有n个城市,标号为1到n,修建道路花费m天,第i天时,若gcd(a,b)=m-i+1,则标号为a的城市和标号为b的城市会建好一条直接相连的道路,有多次询问,每次询问某两 ...

  6. [JZOJ 5910] [NOIP2018模拟10.18] DuLiu 解题报告 (并查集+思维)

    题目链接: https://jzoj.net/senior/#contest/show/2530/0 题目: LF是毒瘤出题人中AK IOI2019,不屑于参加NOI的唯一的人.他对人说话,总是满口垃 ...

  7. 关于年终奖励的扣税算法BUG

    这么多年,第一次拿年终奖,于是查一下年终奖是怎么扣税的,根据 国税发[2005]9号 适用公式为: 应纳税额=雇员当月取得全年一次性奖金×适用税率一速算扣除数 年终奖: /= 的税率是3% 按照网上说 ...

  8. 税号输入框 将input框中的输入自动转化成半角大写

    这两天出了这么一个需求,输入税号的时候,需要自动将其转化为半角大写,并且阻止标点符号中文汉字的输入.(下面会有:全半角转换.文本框选中.光标位置判断.设置光标位置 这些内容) 然后我就开始了慢慢查找资 ...

  9. [jzoj]3875.【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)

    Link https://jzoj.net/senior/#main/show/3875 Problem 在遥远的S星系中一共有N个星球,编号为1…N.其中的一些星球决定组成联盟,以方便相互间的交流. ...

  10. python操作三大主流数据库(8)python操作mongodb数据库②python使用pymongo操作mongodb的增删改查

    python操作mongodb数据库②python使用pymongo操作mongodb的增删改查 文档http://api.mongodb.com/python/current/api/index.h ...

随机推荐

  1. sublime text配置java运行环境

    java正常运行流程 首先一个 test.java 文件 如果要运行这个文件需要先编译 javac test.java 然后在同级目录会生成一个test.class 文件 然后 java test 来 ...

  2. 初始化一个ArrayList的多种方式

    序言 本片文章用于归纳java中初始化一个ArrayList的几种方式 add方法添加 最基础的方式就是我们在new一个ArrayList之后使用add方法添加元素 /** * 第一种方式,通过add ...

  3. 【大数据课程】高途课程实践-Day03:Scala实现商品实时销售统计

    〇.概述 1.实现内容 使用Scala编写代码,通过Flink的Source.Sink以及时间语义实现实时销量展示 2.过程 (1)导包并下载依赖 (2)创建数据源数据表并写⼊数据 (3)在Mysql ...

  4. TypeScript 之 控制流分析(Control Flow Analysis)

    控制流分析(Control Flow Analysis) 描述: CFA 几乎总是采用联合,基于代码逻辑去减少联合里面的类型数量. 大多数时候,CFA 在自然的JavaScript布尔逻辑中工作,但是 ...

  5. JS传值与应用

    问题提出:在进行页面书写的时候,有时候需要进行动态页面拼接,在动态拼接的时候,涉及到函数的调用,函数的传值可能是HTML标签,或者含有json的标签,这样在传值时就有可能出现问题,由于"&q ...

  6. VC实例和VM实例的区别!!!

    1.内置关系是什么 VueComponent.prototype.__proto__ === Vue.prototype 2.为什么要有这个关系 让组件实例对象可以访问到 Vue原型上的属性.方法.

  7. 01.Java面试都问啥?

    大家好,我是王有志.好久不见,不过这次没有休假,而是搞了个"大"工程,花了点时间自学Python,然后写了"玩具爬虫",爬某准网的面经数据,为来年的" ...

  8. CH565/CH569W ETH-MAC例程现象使用说明

    ETH-GMAC例程 使用MounRiver Studio(MRS)打开工程. 点击编译按键,编译完成出现0错误,0警告. 打开WCHISPTOOLS,芯片型号选择CH569或者CH565(根据评估版 ...

  9. Centos7下git最新版本安装

    刚重新装了centos7最小版的系统,发现没有git,只好重新安装了,记录下以防忘记.(以下命令最好在root用户下执行,要么你有管理员权限也行,则需要在命令前加sudo) 安装方法有两种: 一.yu ...

  10. R语言|ggplot2| 绘制KEGG气泡图

    在 RStudio 中使用 BiocManager 安装包 install.packages("BiocManager") install.packages("ggplo ...