捐赠

news/2025/10/27 21:07:43/文章来源:https://www.cnblogs.com/kklxy/p/19170165

题目

题目描述

\(A\)\(B\) 两类物品。

paper 打算每类各选 \(k\) 个(\(k\) 可自由决定,可取 \(0\))一起捐出。捐赠的总贡献为所选物品的价值总和。

初始时 paper 没有物品,但是 paper 可以通过一些操作改变物品的数量,一共进行了 \(m\) 次操作,分为三种类型:

  • 增加或减少若干个价值相同的 \(A\) 类物品。
  • 增加或减少若干个价值相同的 \(B\) 类物品。
  • 询问当前能获得的最大捐赠总贡献。

请你帮助 paper 处理这些操作。

保证在减少操作中物品个数一定充足。

输入格式

第一行有一个整数,表示操作的总数 \(m\)

接下来 \(m\) 行,每行表示一次操作,首先有一个整数 \(op\)

  • \(op\)\(1\),则后面有两个整数 \(x, y\)。若 \(y \ge 0\) 则表示增加 \(y\) 个价值为 \(x\)\(A\) 类物品,否则表示减少 \(-y\) 个。
  • \(op\)\(2\),则后面有两个整数 \(x, y\)。若 \(y \ge 0\) 则表示增加 \(y\) 个价值为 \(x\)\(B\) 类物品,否则表示减少 \(-y\) 个。
  • \(op\)\(3\),代表询问目前最大可能贡献。

输出格式

对于每一个 \(op = 3\),输出此时的最大贡献。

输入输出样例 #1

输入 #1

5
1 2 3
2 -1 3
3
1 2 -2
3

输出 #1

3
1

说明/提示

本题采用捆绑测试。

  • Subtask 0(10 points):\(m \le 200\)
  • Subtask 1(30 points):\(m \le 5000\)
  • Subtask 2(20 points):\(y = 1\)
  • Subtask 3(40 points):无特殊限制。

对于所有测试数据,\(1\le m\le10^6,-10^6 \le x,y\le 10^6\)

思路链

观察题目->看出我对于A和B类物品一定要满足能选大的就选大的->然后又发现他这个选k个的函数是一个凸的单峰最大值函数->考虑三分->三分TLE->考虑这个凸的单峰最大值函数会在第一个A类物品加B类物品为负数时开始降低->二分最后一个和不为负数的位置->AC。

代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
char *SSSS, *TTTT;
char pori[1 << 22];
#define gc() (SSSS == TTTT && (TTTT = (SSSS = pori) + fread(pori, 1, 1 << 22, stdin)), SSSS == TTTT ? EOF : *SSSS++)
using namespace std;
inline ll read()
{ll x = 0, f = 1;char ch = gc();while (ch < '0' || ch > '9'){if (ch == '-'){f = -1;}ch = gc();}while (ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + ch - '0';ch = gc();}return x * f;
}
struct node
{int lc, rc;ll tot, cnt;
} tr1[2000005], tr2[2000005];
int tot1 = 0, tot2 = 0;
inline void pushup1(int p)
{tr1[p].tot = tr1[tr1[p].lc].tot + tr1[tr1[p].rc].tot;tr1[p].cnt = tr1[tr1[p].lc].cnt + tr1[tr1[p].rc].cnt;
}
inline void pushup2(int p)
{tr2[p].tot = tr2[tr2[p].lc].tot + tr2[tr2[p].rc].tot;tr2[p].cnt = tr2[tr2[p].lc].cnt + tr2[tr2[p].rc].cnt;
}
void add1(int &rt, int l, int r, ll x, ll d)
{if (!rt){rt = ++tot1;}if (l == r){tr1[rt].tot += d * x;tr1[rt].cnt += d;return;}ll mid = (l + r) >> 1;if (x <= mid){add1(tr1[rt].lc, l, mid, x, d);}else{add1(tr1[rt].rc, mid + 1, r, x, d);}pushup1(rt);
}
void add2(int &rt, int l, int r, ll x, ll d)
{if (!rt){rt = ++tot2;}if (l == r){tr2[rt].tot += d * x;tr2[rt].cnt += d;return;}int mid = (l + r) >> 1;if (x <= mid){add2(tr2[rt].lc, l, mid, x, d);}else{add2(tr2[rt].rc, mid + 1, r, x, d);}pushup2(rt);
}
ll qry1(int rt, int l, int r, ll k)
{if (!k){return 0;}if (!rt){return 0;}// cout << l << " " << r << "\n";if (l == r){return l;}int mid = (l + r) >> 1;// cout << rt << " " << tr1[rt].cnt << " " << tr1[tr1[rt].rc].cnt << " " << k << "\n";if (tr1[tr1[rt].rc].cnt >= k){return qry1(tr1[rt].rc, mid + 1, r, k);}else{return qry1(tr1[rt].lc, l, mid, k - tr1[tr1[rt].rc].cnt);}
}
ll qry2(int rt, int l, int r, ll k)
{if (!k){return 0;}if (!rt){return 0;}if (l == r){return l;}int mid = (l + r) >> 1;if (tr2[tr2[rt].rc].cnt >= k){return qry2(tr2[rt].rc, mid + 1, r, k);}else{return qry2(tr2[rt].lc, l, mid, k - tr2[tr2[rt].rc].cnt);}
}
ll query1(int rt, int l, int r, ll k)
{if (!k){return 0;}if (!rt){return 0;}if (tr1[rt].cnt == k){return tr1[rt].tot;}// cout << l << " " << r << "\n";if (l == r){return l * k;}int mid = (l + r) >> 1;// cout << rt << " " << tr1[rt].cnt << " " << tr1[tr1[rt].rc].cnt << " " << k << "\n";if (tr1[tr1[rt].rc].cnt >= k){return query1(tr1[rt].rc, mid + 1, r, k);}else{return query1(tr1[rt].lc, l, mid, k - tr1[tr1[rt].rc].cnt) + tr1[tr1[rt].rc].tot;}
}
ll query2(int rt, int l, int r, ll k)
{if (!k){return 0;}if (!rt){return 0;}if (tr2[rt].cnt == k){return tr2[rt].tot;}if (l == r){return l * k;}int mid = (l + r) >> 1;if (tr2[tr2[rt].rc].cnt >= k){return query2(tr2[rt].rc, mid + 1, r, k);}else{return query2(tr2[rt].lc, l, mid, k - tr2[tr2[rt].rc].cnt) + tr2[tr2[rt].rc].tot;}
}
int main()
{// freopen("ex_donate2.in","r",stdin);// freopen("donate.out","w",stdout);ll _ = read();ll lc = 0, rc = 0;int rt1 = 0, rt2 = 0;const int L = -1000000, R = 1000000;while (_--){int op = read();if (op == 1){int x = read(), y = read();lc += y;add1(rt1, L, R, x, y);// cout<<"**"<<tr1[rt1].tot<<"\n";}else if (op == 2){int x = read(), y = read();rc += y;add2(rt2, L, R, x, y);// cout << "***" << tr2[rt2].tot << "\n";}else{ll mn = min(lc, rc);ll l = 0, r = mn, ans = 0;// cout << mn << "\n";// cout << query2(rt2,-1000000,1000000, 2) << "\n";while (l <= r){// cout<<l<<" "<<r<<"\n";ll mid = (l + r) >> 1;if (qry1(rt1, L, R, mid) + qry2(rt2, L, R, mid) < 0){r = mid - 1;}else{l = mid + 1;ans = mid;}}// assert(l <= r);// cout << l << " " << r << "\n";// ll ans = 0;// ans = max(ans, query1(rt1, L, R, l) + query2(rt2, L, R, l));// ans = max(ans, query1(rt1, L, R, r) + query2(rt2, L, R, r));printf("%lld\n", query1(rt1, L, R, ans) + query2(rt2, L, R, ans));}}// cout<<tot1<<" "<<tot2<<"\n";return 0;
}
/*
5
1 -655 849
2 -604 508
2 861 599
2 720 186
3
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/948083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记:重链剖分

本文写于 2025 年 9 月 28 日。 前言 这几天一下课,班里的某位同学就走到我座位旁边,念叨着“来学树剖”。在他的 传销 诈骗 怂恿 鼓励之下,我也终于来到了这座大山面前,但发现似乎也并不难…… 何为重链剖分 考虑…

P3232 [HNOI2013] 游走

考虑贪心。 随机游走则显然每条边期望经过次数越大则其编号应越小。 每条边的期望经过次数难以计数,考虑每个店期望经过次数,设计状态 \(f_i\) 表示点 \(i\) 期望经过次数。 转移: \(f_i=\sum_{v\in e_i}f_v\cdot \…

FRP 后端无法获取请求者IP解决方案

FRP 后端无法获取请求者IP解决方案📝 FRP 后端无法获取请求者真实 IP?别慌,解决方案来啦!🧐 问题背景 当你使用 FRP 进行内网穿透或代理服务时,是否遇到过这样的困扰: 后端服务拿到的客户端 IP 全都是 FRP 服…

正睿 2025 NOIP 20连测 Day9

坐在前面的老哥 AK 了。他怎么这么成功,我怎么这么失败/ll。 T1小 W 有 \(n\) 个球,每个球都有一种颜色,其中第 \(i\) 个球初始的颜色可以用正整数 \(a_i\) 来表示,一共有 \(m\) 种颜色。 在一次染色操作中,小 W …

计算几何初步:CCW 与判断两线段的相交性

本文写于 2025 年 9 月 18 日。 前言 昨天在正睿的“IOI 普及联赛”中,有这样一道题,极大地冲击了本蒟蒻的心灵。赛后查看题解,此题竟然涉及计算几何,这更是本蒟蒻从未涉足的领域。我遂查询资料,学习了 CCW 算法以…

如何选择合适的团队共享网盘?坚果云、亿方云等15款产品横向测评

面对市场上琳琅满目的产品,管理者和技术决策者往往在可靠性、性能、安全性与成本之间难以取舍。本篇文章将围绕企业共享网盘,从功能覆盖、同步效率、安全合规、协作体验等维度,深度评测并对比市面上15款主流产品,帮…

软件工程学习日志2025.10.27

🎯 今日目标 完成基于Trae框架的IT岗位求职记录系统开发,重点训练数据库的增删改查操作能力 💻 项目启动:9:00 AM 技术选型确定 今天开始着手开发老师布置的IT岗位求职记录系统。经过技术调研,我决定采用以下技…

深入解析:TCP/IP 四层模型协作流程详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Windows全版本激活教程(仅供测试)

Windows全版本激活教程(仅供测试)Windows 系统激活指南 注意:本文档及所提供的工具仅供学习、测试和环境验证使用。请确保您遵守软件许可协议,在合法范围内使用。 免责声明 使用任何激活工具都存在潜在风险,包括但不…

基本概念2

1, 访问控制列表步骤一:创建一个访问控制规则 步骤二:调用这个规则基本配置和高级配置 基本配置只能限制源地址,不检查目标地址 高级配置源地址与目标地址都检查步骤一: 命令: acl name test advance # test是给…

20251027周一日记

20251027周一日记前些日: 1.周五玩得挺爽,熬到五点多睡的,转天有点遗憾但还是玩得挺爽。见识到了大城市之间的差距。 2.周六回家,出去吃饭;周日在家,出去吃饭。听家人说各有各在拼搏的方向。 今日: 1.早上睡过了…

【通讯协议】IIC

前言 对于各种协议的知识,假如不常用的话还是很容易忘记和生疏的,于是我会在这篇文章重新学习,顺带记录一下,以便下次复习。由于最近要用到 IIC,所以最先复习 IIC 的内容。 网上有关 IIC 的资料很多也很全面,所以…

Robot Queries

题目传送门 前置知识——向量的加减 \((x_1,y_1) \pm (x_2,y_2) = (x_1\pm x_2,y_1\pm y_2)\)。 满足交换律和结合律。 题目大意 有一个在 \((0,0)\) 的点。现在给出 \(n\) 个操作序列 \({f}\),每个指令形如 \((x, y)…

10月27日

今天上午学了统一建模语言和数构,下午学了Java

特殊的数字签名

盲签名 -- 部分盲签名 -- 群签名盲签名 Chaum盲签名协议 协议流程: \[\begin{flalign} &Setup:\\ &\quad p,q = getPrime(safe.bit\_length);n = p * q;Pubkey = (n, e);Pravitekey = d\\ &Sign:\\ &…

CSP-S 40(爆零记)

10.2710.27 赤到了。 第一次爆蛋。 t1 特判没卡掉11个人。 乐死了。 暴力有80pts。 正解: 发现值域很小只有1000,从此入手。 先预处理 1000 以内的素数,发现很少只有168个,空间可开下,这启发我们对于每个素数记录…

javascript构造对象数组向服务器端传输

javascript构造对象数组向服务器端传输客户端发送数据1 $("#saveEnable").click(function () {2 var selectedRows = $(#userTab).datagrid(getSelections);3 4 var users…

102302136 林伟杰 数据采集与融合作业1

目录作业一实验过程及结果-1 心得体会-1作业二实验过程及结果-2 心得体会-2作业三实验过程及结果-3 心得体会-3作业一: 实验过程及结果-1要想爬取到网站中大学的信息,应当先查看该网站中html的结构,通过搜索框搜索&…

TCP/IP协议概述

TCP/IP分层模型是互联网协议套件的基础,它简化了OSI模型,将网络通信过程划分为四个层次。TCP/IP模型的主要目的是提供一个实际可行的网络通信架构,它是互联网和许多其他网络的基础。TCP /IP,是一组不同层次上的多个…

极值定理

若函数 \(f\) 在 \(x = c\) 处有一个局部最大值或局部最小值,则 \(f\) 在 \(x = c\) 处不可导或者 \(f(c)=0\) 。 比如说 \(f\) 在 \(x = c\) 处是个尖角,那么肯定就不可导。 若可导,不妨令是最大值(最小值类似)则…