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;
}
标签:int,sum,ans,1774F1,Pigs,mp,op,Magician,mod
From: https://www.cnblogs.com/basicecho/p/17195766.html