1774F1 - Magician and Pigs (Easy Version)
1774F1 - Magician and Pigs (Easy Version)
思路
1) 3操作其实就是,把原有的猪都减去一个总的sum,然后加上原来自己的值,
之后sum会翻倍。也就是sum太大之后,就不变了,因为减去的都变成了0
2) 如果sum一直为0,然后还进行暴力的话,就肯定会T,所以需要对没有2操作之前的进行特殊处理,也就是所有的人都会翻倍,那也就是说将后面的人减少相应的倍数就可以了。之后就是使用map进行模拟了。
代码
/* 对于操作3,每次结束后总伤害sum都会翻倍 如果sum >= 2e5 那也就是不会变了 然后为了防止前面无脑的进行3操作,但是又没有sum这个值 所以需要用一个x1来记录倍数,同时用x2记录它的逆元就可以了 */ #include <bits/stdc++.h> using namespace std; #define int long long const int mod = 998244353; const int inv = (mod + 1) / 2; map<int, int>mp; signed main() { int n; cin >> n; int sum = 0, x1 = 1, x2 = 1; //总的伤害的和,前面的总的倍数,后面需要除上的倍数 for(int i = 1; i <= n; i++) { int op, x; cin >> op; if(op != 3)cin >> x; if(op == 1)mp[x + sum] = (mp[x + sum] + x2) % mod; else if(op == 2)sum += x; else if(sum <= 2e5) {//大于2e5就相当于每次都不变了 if(sum == 0) { x1 = x1 * 2 % mod; x2 = x2 * inv % mod; } else { for(int i = sum + 2e5; i > sum; i--) mp[i + sum] = (mp[i + sum] + mp[i]) % mod; } sum *= 2; } } int ans = 0; for(auto [x, y] : mp) if(x > sum)ans += y; ans = ans % mod * x1 % mod; cout << ans << endl; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现