首页 > 其他分享 >1774F1 - Magician and Pigs (Easy Version)

1774F1 - Magician and Pigs (Easy Version)

时间:2023-03-08 19:12:08浏览次数:58  
标签:int sum ans 1774F1 Pigs mp op Magician mod

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

相关文章

  • POJ 1149 PIGS
       https://vjudge.net/problem/POJ-1149 #include<iostream>#include<queue>#include<cstring>#defineIOSstd::ios::sync_with_stdio(0)usingnamespace......