JZOJ 3167.查税
\(\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.查税的更多相关文章
- [JZOJ3167] 【GDOI2013模拟3】查税
题目 描述 题目大意 维护一个有一次函数组成的序列 具体来说,对于位置xxx,现在的值为sx+zx∗(T−tx)s_x+z_x*(T-t_x)sx+zx∗(T−tx) 有两个操作,修改某个位置上 ...
- 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. ...
- 从程序员之死看 IT 人士如何摆脱低情商诅咒
(1) IT公司的创业者苏享茂忽然跳楼自杀了,自杀前,他留下几万字的文字记录.遗书,并且在自己开发的软件界面上,设置了弹出页面,控诉是恶毒前妻逼死了自己. 生命戛然而止,留给亲人痛苦,留给世人震惊. ...
- Jzoj 初中2249 蒸发学水(并查集)
题目描述 众所周知,TerryHu 是一位大佬,他平时最喜欢做的事就是蒸发学水. 机房的位置一共有n 行m 列,一开始每个位置都有一滴学水,TerryHu 决定在每一个时刻选择 一滴学水进行蒸发,直到 ...
- [jzoj 5782]【NOIP提高A组模拟2018.8.8】 城市猎人 (并查集按秩合并+复杂度分析)
传送门 Description 有n个城市,标号为1到n,修建道路花费m天,第i天时,若gcd(a,b)=m-i+1,则标号为a的城市和标号为b的城市会建好一条直接相连的道路,有多次询问,每次询问某两 ...
- [JZOJ 5910] [NOIP2018模拟10.18] DuLiu 解题报告 (并查集+思维)
题目链接: https://jzoj.net/senior/#contest/show/2530/0 题目: LF是毒瘤出题人中AK IOI2019,不屑于参加NOI的唯一的人.他对人说话,总是满口垃 ...
- 关于年终奖励的扣税算法BUG
这么多年,第一次拿年终奖,于是查一下年终奖是怎么扣税的,根据 国税发[2005]9号 适用公式为: 应纳税额=雇员当月取得全年一次性奖金×适用税率一速算扣除数 年终奖: /= 的税率是3% 按照网上说 ...
- 税号输入框 将input框中的输入自动转化成半角大写
这两天出了这么一个需求,输入税号的时候,需要自动将其转化为半角大写,并且阻止标点符号中文汉字的输入.(下面会有:全半角转换.文本框选中.光标位置判断.设置光标位置 这些内容) 然后我就开始了慢慢查找资 ...
- [jzoj]3875.【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)
Link https://jzoj.net/senior/#main/show/3875 Problem 在遥远的S星系中一共有N个星球,编号为1…N.其中的一些星球决定组成联盟,以方便相互间的交流. ...
- python操作三大主流数据库(8)python操作mongodb数据库②python使用pymongo操作mongodb的增删改查
python操作mongodb数据库②python使用pymongo操作mongodb的增删改查 文档http://api.mongodb.com/python/current/api/index.h ...
随机推荐
- sublime text配置java运行环境
java正常运行流程 首先一个 test.java 文件 如果要运行这个文件需要先编译 javac test.java 然后在同级目录会生成一个test.class 文件 然后 java test 来 ...
- 初始化一个ArrayList的多种方式
序言 本片文章用于归纳java中初始化一个ArrayList的几种方式 add方法添加 最基础的方式就是我们在new一个ArrayList之后使用add方法添加元素 /** * 第一种方式,通过add ...
- 【大数据课程】高途课程实践-Day03:Scala实现商品实时销售统计
〇.概述 1.实现内容 使用Scala编写代码,通过Flink的Source.Sink以及时间语义实现实时销量展示 2.过程 (1)导包并下载依赖 (2)创建数据源数据表并写⼊数据 (3)在Mysql ...
- TypeScript 之 控制流分析(Control Flow Analysis)
控制流分析(Control Flow Analysis) 描述: CFA 几乎总是采用联合,基于代码逻辑去减少联合里面的类型数量. 大多数时候,CFA 在自然的JavaScript布尔逻辑中工作,但是 ...
- JS传值与应用
问题提出:在进行页面书写的时候,有时候需要进行动态页面拼接,在动态拼接的时候,涉及到函数的调用,函数的传值可能是HTML标签,或者含有json的标签,这样在传值时就有可能出现问题,由于"&q ...
- VC实例和VM实例的区别!!!
1.内置关系是什么 VueComponent.prototype.__proto__ === Vue.prototype 2.为什么要有这个关系 让组件实例对象可以访问到 Vue原型上的属性.方法.
- 01.Java面试都问啥?
大家好,我是王有志.好久不见,不过这次没有休假,而是搞了个"大"工程,花了点时间自学Python,然后写了"玩具爬虫",爬某准网的面经数据,为来年的" ...
- CH565/CH569W ETH-MAC例程现象使用说明
ETH-GMAC例程 使用MounRiver Studio(MRS)打开工程. 点击编译按键,编译完成出现0错误,0警告. 打开WCHISPTOOLS,芯片型号选择CH569或者CH565(根据评估版 ...
- Centos7下git最新版本安装
刚重新装了centos7最小版的系统,发现没有git,只好重新安装了,记录下以防忘记.(以下命令最好在root用户下执行,要么你有管理员权限也行,则需要在命令前加sudo) 安装方法有两种: 一.yu ...
- R语言|ggplot2| 绘制KEGG气泡图
在 RStudio 中使用 BiocManager 安装包 install.packages("BiocManager") install.packages("ggplo ...