当前位置: 首页 > news >正文

CF799C 题解

题目传送门

题目大意:

\(n\) 个喷泉中选择两个,使两座喷泉美丽值总和最大且消耗金币和钻石分别不超过 \(c\)\(d\),求最大美丽值。

题目分析:

先钦定选一个喷泉,那么设剩余的金币及钻石数为 \(c'\)\(d'\),那么选的第二个喷泉要么是要花费金币且花费数不大于 \(c'\),要么是花费钻石且花费数不大于 \(d'\),并且使美丽值最大。这种问题可以开两个树状数组来实现。在插入时根据花费类型插入第一个或第二个树状数组中,查询时取两个树状数组返回结果的 \(\max\),即为答案。

但这里有一个棘手的问题:选定的喷泉不能被再次选择。所以我们要对插入和查询操作进行修改,每个结点要储存前二大的数及编号,这样在查询时,如果最大的数的编号正好等于第一次选择喷泉的编号,则对储存的第二个数取 \(\max\),问题就能完美解决了。

细节:由于不能只选择一个喷泉,树状数组初始最大值和次大值都要设成极小值。答案初始值为 \(0\)

时间复杂度 \(\mathcal{O}(n \log n)\)

Code:

#include <iostream>
#include <algorithm>
#include <vector>
#define lowbit(k) k&(-k)
#define int long long
using namespace std;
int t,n,c,d,A,B;
int tr[200005][2],tr2[200005][2],id[200005][2],id2[200005][2];
struct node
{int x,y,id;char z;
}a[300005];
void add(int opt,int x,int k,int lol)
{while(x <= 200000){if(opt == 1)//插入第一个树状数组{//tr x,0表示最大值,tr x,1表示次大值if(k >= tr[x][0])tr[x][1] = tr[x][0],id[x][1] = id[x][0],tr[x][0] = k,id[x][0] = lol;else if(k > tr[x][1])tr[x][1] = k,id[x][1] = lol;}else //插入第二个树状数组{if(k >= tr2[x][0])tr2[x][1] = tr2[x][0],id2[x][1] = id2[x][0],tr2[x][0] = k,id2[x][0] = lol;else if(k > tr2[x][1])tr2[x][1] = k,id2[x][1] = lol;}x += lowbit(x);}
}
int query(int opt,int x,int ban)//ban:第一个选择喷泉编号
{int su = -1e9;while(x){if(opt == 1){if(id[x][0] == ban)su = max(su,tr[x][1]);else su = max(su,tr[x][0]);}else{if(id2[x][0] == ban)su = max(su,tr2[x][1]);else su = max(su,tr2[x][0]);}x -= lowbit(x);	}return su;
}
signed main()
{cin >> n >> c >> d;int ans = 0;for(int i = 1;i <= 200000;i ++)tr[i][0] = tr[i][1] = tr2[i][0] = tr2[i][1] = -1e9;for(int i = 1;i <= n;i ++){cin >> a[i].x >> a[i].y >> a[i].z,a[i].id = i;swap(a[i].x,a[i].y);//与输入不同,这里代码ai.x表示价格,ai.y表示美丽值if(a[i].z == 'C')add(1,a[i].x,a[i].y,i);else add(2,a[i].x,a[i].y,i);}for(int i = 1;i <= n;i ++){if(a[i].z == 'C' && a[i].x > c)continue ;if(a[i].z == 'D' && a[i].x > d)continue ;if(a[i].z == 'C')c -= a[i].x;else d -= a[i].x;ans = max(ans,a[i].y + max(query(1,c,a[i].id),query(2,d,a[i].id)));if(a[i].z == 'C')c += a[i].x;else d += a[i].x;}cout << ans;
}
http://www.jsqmd.com/news/481139/

相关文章:

  • 微信小程序的 传统手工艺术品非遗传承系统
  • 毕设程序java车辆4s店管理系统 汽车售后服务智能管理平台 基于SpringBoot的汽车维保信息化系统设计与实现
  • 微信小程序的 校园学习互助 活动报名竞赛招募 社交平台
  • 总结依诺岩板杰出领先的原因,在福建地区推荐购买吗 - 工业推荐榜
  • 毕设程序java成人培训机构管理系统 基于Java的成人教育信息化管理平台 Java驱动的职业技能培训综合管理系统
  • 微信小程序的的碎片化学习签到打卡系统
  • 2026年上海公司法律顾问律师价格大揭秘,专业公司法律服务靠谱吗? - 工业品牌热点
  • 信奥赛C++提高组csp-s之数论基础专题课:欧拉函数和欧拉定理2(编程案例实践)
  • 如何配置 PostgreSQL 允许远程连接 - 以 Odoo 数据库为例
  • 商密2(SM2)获取公私钥对、加解密文件
  • 信奥赛C++提高组csp-s之数论基础专题课:中国剩余定理1(数学原理)
  • P15548 题解
  • 人,有了物质才能生存;人,有了理想才谈得上生活
  • 中小企业别再只靠爆款和运气!真正盈利增长需要体系化变革-佛山鼎策创局破局增长咨询
  • 2026年江苏机器外壳钣金加工厂费用分析,哪家价格更合理 - mypinpai
  • 无人机岔路口车辆巡检数据集 城市交通流监测识别 自动驾驶车辆感知检测 低空航拍目标识别 交通违章识别 无人机数据集YOLO第10560期
  • 盘点2026年江苏机械加工品牌,常州布恩机械的市场竞争力强吗 - 工业设备
  • QT编程(12): QDragEvent事件
  • 2026最新!AI论文写作软件 千笔AI VS 灵感ai,全领域适配首选
  • CF862E 题解
  • 学霸同款!普遍认可的AI论文网站 —— 千笔·专业论文写作工具
  • 2026年酒泉戈壁徒步公司口碑排名,靠谱品牌有哪些 - 工业品网
  • 一文讲透|全行业通用降AIGC工具 —— 千笔
  • 深圳区域起重机安装资质办理,亨通靠谱服务排名前列 - myqiye
  • 交稿前一晚!9个降AI率软件降AIGC网站评测对比,全行业通用必看
  • 南京高功率密度电源定制,2026年这些源头厂家有优势,氢能源车载直流转换器/辅助应急电源,高功率密度电源品牌哪个好 - 品牌推荐师
  • 说说上海专业的企业法律在线咨询机构,哪家口碑更好 - 工业品牌热点
  • 毕业论文神器 8个一键生成论文工具:开源免费测评+高效写作推荐
  • 直线轴承品牌新动态:2026年值得关注的品牌,直线轴承排行榜技术领航者深度解析 - 品牌推荐师
  • 深度解析:2026年国内伺服印刷机定制服务哪家强?,目前耐用的伺服印刷机哪家权威优质品牌选购指南 - 品牌推荐师