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

P6619 [省选联考 2020 A/B 卷] 冰火战士

P6619 [省选联考 2020 A/B 卷] 冰火战士

大意

给定一个序列,每个数有两种颜色,要找到一个位置,要找到一个位置使得 \(\min \{ f(p), g(p) \}\) 尽可能大.

思路

我们在温度 \(T\) 下,能参加的冰人必须是 \(y \le T\) 的才能参赛,火人必须是 \(y \ge T\) 才能参赛,我们定义能参赛的冰人的能量和为 \(f(T)\),同理,火人为 \(g(T)\)

那么我们的答案一定是 \(2 \times \min \{ f(T), g(T)\}\),对于这个图,画出来是下面这样的:

image

那么,取 \(\min\) 之后的图像是这样的:

image

就是绿色的部分,那么我们这样的话,答案一定在交点附近,那么我们在求这个交点的过程,可以尝试二分 + 树状数组,由于一个是递增,一个是递减,分别维护前缀和和后缀和即可,那么这样二分到交点 \(p\) 的话,只需要看 \(p\)\(p + 1\) 位置,相当于是冰人和火人的位置,火人的位置比较特殊,因为是可能后面还有段连续的区间,需要继续从 \(p + 1\) 向右跳到最后一个合法的区间。

而上述的做法,不难发现时间复杂度是 \(Q \log^2 Q\) 的,无法通过此题,只能有 \(60pts\),于是我们考虑优化。

有个比较经典的思路(不过我也是刚学会的),在树状数组上倍增,这样的话,我们只需要单 \(\log\) 的复杂度去跳交点,以及查找 \(p + 1\) 的后面最后一个满足情况的点即可。

代码

#include<bits/stdc++.h>
using namespace std;#define ll long long
const int MAXN = 2 * 1e6 + 5;
ll t1[MAXN], t2[MAXN];
int lsh[MAXN], tot;
ll sum = 0;struct node{int op, t, x, y;
}q[MAXN];int lowbit(int x){return x & -x;
}void add(ll *bit, int x, ll k){
//	if(x <= 0) return;while(x <= tot + 1){bit[x] += k;x += lowbit(x);}
}int Q;int main(){cin.tie(0) -> ios::sync_with_stdio(0);cin >> Q;for(int i = 1;i <= Q;i ++){cin >> q[i].op;if(q[i].op == 1){cin >> q[i].t >> q[i].x >> q[i].y;lsh[++ tot] = q[i].x;}else{cin >> q[i].t;}}sort(lsh + 1, lsh + tot + 1);tot = unique(lsh + 1, lsh + tot + 1) - (lsh + 1);for(int i = 1;i <= Q;i ++){if(q[i].op == 1){q[i].x = lower_bound(lsh + 1, lsh + tot + 1, q[i].x) - lsh;}}for(int i = 1;i <= Q;i ++){if(q[i].op == 1){if(q[i].t == 0) add(t1, q[i].x, q[i].y);else add(t2, q[i].x + 1, q[i].y), sum += q[i].y;}else{if(q[q[i].t].t == 0) add(t1, q[q[i].t].x, -q[q[i].t].y);else add(t2, q[q[i].t].x + 1, -q[q[i].t].y), sum -= q[q[i].t].y;}ll p1 = 0, s1 = 0, s2 = 0;for(int j = 20;j >= 0;j --){int nxt = p1 + (1 << j);if(nxt <= tot && s1 + t1[nxt] < sum - (s2 + t2[nxt])){p1 = nxt, s1 += t1[nxt], s2 += t2[nxt];}}ll res1 = s1;ll res2 = 0, p2 = 0;if(p1 < tot){ll ss1 = 0, ss2 = 0;for(int j = p1 + 1;j;j -= lowbit(j)){ss1 += t1[j], ss2 += t2[j];}res2 = sum - ss2;if(res2 >= res1){p2 = 0, ss2 = 0;for(int j = 20;j >= 0;j --){int nxt = p2 + (1 << j);if(nxt <= tot && sum - (ss2 + t2[nxt]) >= res2){p2 = nxt;ss2 += t2[nxt];}}}}if(res1 == res2 && res1 == 0){cout << "Peace\n";}else if(res1 <= res2){cout << lsh[p2] << ' ' << res2 * 2 << '\n';}else{cout << lsh[p1] << ' ' << res1 * 2 << '\n';}}return 0;
}
http://www.jsqmd.com/news/409091/

相关文章:

  • AI代理正颠覆SaaS:小白也能懂的技术革命与收藏指南
  • 【图像加密】基于AES 和伽罗瓦计数器模式 (GCM) 块密码进行图像加密和解密附matlab代码
  • 深度解析豆包接入的Seedance 2.0:字节原生AI视频生成模型,重构技术创作新范式
  • App Store本地化:不仅是翻译,更是ASO的语义扩展利器
  • PositionOCR Augmenting Positional Awareness in Multi-Modal Models via Hybrid Specialist Integration
  • 小国的网站生态 和 不要被域名注册时间骗了
  • 【无人机】无人机辅助无线数据采集分析工具包附matlab代码
  • 虚拟激活脚本示例
  • 前缀和优化 DP
  • MICON-Bench Benchmarking and Enhancing Multi-Image Context Image Generation in Unified Multimodal Mo
  • DeepSeek广告服务商联系方式 - 品牌2025
  • 2026年广州江诗丹顿手表维修评测与推荐:非官方维修点选择与售后网点服务指南 - 十大品牌推荐
  • 2026年广州江诗丹顿手表维修推荐评测:非官方维修点榜单与售后网点服务选择指南 - 十大品牌推荐
  • AI人工智能(十六)错误示范http文件处理—东方仙盟练气期
  • 2026年广州家庭搬家公司推荐评测排行榜:告别搬家烦恼,轻松开启新生活 - 十大品牌推荐
  • 2026年广州家庭搬家公司评测推荐榜单:告别杂乱与纠纷,轻松搬迁全攻略 - 十大品牌推荐
  • 2026年广州家具搬运公司推荐评测榜单:告别杂乱与破损,专业团队让搬迁无忧 - 十大品牌推荐
  • 2026年广州家庭搬家公司评测推荐榜单:告别杂乱与焦虑,轻松搬迁新家指南 - 十大品牌推荐
  • 在DeepSeek做广告联系哪个服务商? - 品牌2025
  • 2026 2.23 - 2026 3.1 日做题题解
  • 宽度学习旋转机械智能故障诊断【附代码】
  • DeepSeek广告服务商?联系谁? - 品牌2025
  • 欧姆龙PLC CP1E与柯力XK3101电子称重仪表的Modbus RTU通信及拓展
  • 深沟球轴承外滚道偏转缺陷建模与动力学分析【附代码】
  • 从单一到融合:机器学习、多模型学习与大语言模型的全面综述
  • 2026年2月24日
  • MySQL从入门到精通:一份全面的数据库实战指南
  • 春节单位发的京东e卡如何回收? - 京顺回收
  • 上海人工智能实验室重磅发布:AI正在学会“偷鸡摸狗“?
  • n8n 节点矩阵总览(分层结构 + 云图 + 教程索引)