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

贪吃蛇

首先是一个观察:由于蛇很智慧,所以如果能轮到它决策,它就绝对不会死,因为如果它预料到它会死它就会直接选择结束。

分讨一条蛇吃完后的情况:

  1. 如果这条蛇吃完之后还是最强的,那么肯定会吃
  2. 如果不是最强的也不是最弱的,那么下一轮是次强的决策,且这时候最弱的变为了原先次弱的,所以如果次强蛇吃了,次强蛇就会比最强蛇小,如果最强蛇死了,那么次强蛇必定先死,由于次强蛇能够决策,所以它肯定不会死,所以最强蛇也不会死。
  3. 是最弱的。那么假设现在开始每条决策的蛇是 \(1, 2, 3, \cdots, k\), 如果 \(1\) 吃了之后变成了最弱的,由 \(2\) 决策,如果 \(2\) 吃了 \(1\) 不是最弱的,那根据第二点,\(1\) 会死,\(1\) 知道这点,不会吃。否则,\(2\) 需要看 \(3\) 来决定吃不吃,如果 \(2\) 会吃 \(1\)\(1\) 就会选择结束,否则 \(1\) 会吃,对于 \(2\) 也同理,同时 \(3\) 需要依赖 \(4\), 以此类推,如果只剩两条蛇了,那么当前决策的蛇肯定不敢吃,不然会被最后一条吃掉,所以我们发现如果 \(k\) 是奇数就会吃。并且吃了之后 \(2\) 也不会吃了,因为 \(2\) 变成了新的 \(1\), \(k\) 变成了偶数,所以一旦出现这种情况,最多再吃一次了。

这样可以直接 set 维护最大值和最小值,时间复杂度 \(\mathcal{O}(Tn \log n)\)

考虑经典 trick 把队列当优先队列做,需要满足每次入队的点有单调性,首先一开始的蛇本身有单调性,其次根据第二点的观察,如果一条蛇吃了,那肯定会比上一条吃了的蛇弱,所以再开一个队列维护吃过的蛇,每次入队即可。

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

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
// typedef __int128 i128;
typedef pair<int, int> pii;
const int N = 1e6 + 10, mod = 998244353;
template<typename T>
void dbg(const T &t) { cout << t << endl; }
template<typename Type, typename... Types>
void dbg(const Type& arg, const Types&... args) {cout << arg << ' ';dbg(args...);
}
int T, n, a[N];
int main() {// freopen("data.in", "r", stdin);// freopen("data.out", "w", stdout);ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);cin >> T >> n;for (int tc = 1; tc <= T; tc++) {if (tc == 1) for (int i = 1; i <= n; i++) cin >> a[i];else {int k, x, y; cin >> k;while (k--) { cin >> x >> y; a[x] = y; }}deque<pii>q1, q2;for (int i = 1; i <= n; i++) q1.push_back({a[i], i});int ans;while (1) {if (q1.size() + q2.size() == 2) {ans = 1;break;}int x, y, id; y = q1.front().first; q1.pop_front();if (q2.empty() || (!q1.empty() && q1.back() > q2.back())) { tie(x, id) = q1.back(); q1.pop_back(); } else { tie(x, id) = q2.back(); q2.pop_back(); }pii now = {x - y, id};if (q1.empty() || q1.front() > now) {ans = q1.size() + q2.size() + 2; int cnt = 0;while (1) {cnt ^= 1;if (q1.size() + q2.size() == 1) { if (!cnt) ans--; break; }if (q2.empty() || (!q1.empty() && q1.back() > q2.back())) { tie(x, id) = q1.back(); q1.pop_back(); } else { tie(x, id) = q2.back(); q2.pop_back(); }now = {x - now.first, id};if ((q1.empty() || now < q1.front()) && (q2.empty() || now < q2.front())) continue;if (!cnt) ans--;break;}break;} else q2.push_front(now);}cout << ans << '\n';}return 0;
}
http://www.zskr.cn/news/116271.html

相关文章:

  • Hooks-Admin终极指南:快速搭建现代化后台管理系统
  • VSCode集成Jupyter量子计算实战指南(量子模拟内核全解密)
  • 2026数字经济定调:数据要素成核心引擎,可信数据空间建设引行业升级
  • 如何在30分钟内完成量子电路的高精度VSCode可视化渲染?
  • 被低估的前置语音技术——为什么你的语音 AI 总「听不清」?一篇文章讲清楚 3A、VAD 和声纹识别丨社区来稿
  • 2025年高口碑十大NMN抗衰产品评测,NMN哪个牌子最靠谱?深度解析NMN牌子 - 资讯焦点
  • 2025年喷雾型聚合氯化铝厂商权威推荐榜单:工业级聚合氯化铝/聚合氯化铝絮凝剂/聚合氯化铝源头厂商精选 - 品牌推荐官
  • PLC通讯编程系列之一,为什么复位发送请求信号要在发送块的前面?
  • 长沙GEO优公司,ai搜索推广,让企业节省80%的广告费 - 舆通Geo
  • 一键部署EmotiVoice:Docker镜像使用指南
  • 2025恒温恒湿试验箱年终大盘点:国货崛起,如何选择最适合你的品牌? - 品牌推荐大师1
  • 可信数据空间能给企业和个人带来什么?2026政策下的新机遇
  • 2025年山东软件项目验收测试报告服务商权威推荐榜单:山东安全渗透性测试/山东系统验收报告/山东第三方软件测试资质机构精选 - 品牌推荐官
  • 176. 第二高的薪水
  • 如何从零开始打造你的第一台四足机器人:Mini Pupper完全实战手册
  • Windows Terminal:一站式多设备远程管理终极解决方案
  • 从“监控”到“可观测”:2025年主流IT监控系统架构演进与选型建议
  • Element Plus自动化部署终极指南:从零到一的完整指南
  • Feishin音乐播放器:为什么它是最佳的自托管音乐解决方案?
  • 智能内容本地化革命:打造永久收藏的数字宝库
  • 量子计算结果不稳定?你必须知道的VSCode+Jupyter 7个调试秘籍
  • 三分钟带你掌握Function Calling
  • 【linux期末大作业】在Ubuntu22.04上通过XQUME安装RISC-V架构的linux系统并写hello world进行测试
  • 你还在手动调试量子代码?VSCode自动化性能分析实战详解
  • 【开题答辩全过程】以 基于SSM的考研信息共享平台为例,包含答辩的问题和答案
  • 【VSCode量子开发插件集成指南】:掌握未来编程的5大核心工具
  • 终极指南:用Oni-Duplicity轻松定制《缺氧》游戏存档
  • CRT-Royale 重塑游戏视觉:从物理模拟到艺术创造的完整指南
  • 开发改了接口,经常忘通知测试,有什么好的解决方案吗?
  • 3步提升语音识别准确率:FunASR热词技术实战解析