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;
}
posted @   basicecho  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示