CF1774F Magician and Pigs【性质】
有一个空序列,需要维护如下三个操作:
1 x
:在序列中添加 。2 x
:把序列中每个元素的值减去 。3
:重复从第一条到本条操作的前一条的所有操作,包括操作 。
当一个数的值
趣味题。我们分别考虑每次
code
#include <bits/stdc++.h>
using namespace std;
constexpr int N = 8e5 + 5, mod = 998244353, inf = 1e9;
int n, m, a[N], b[N], c[N], cnt, pw2[N];
signed main() {
ios :: sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
pw2[0] = 1;
for (int i = 1; i <= n; i++) pw2[i] = 1LL * pw2[i - 1] * 2 % mod;
int lim = inf, sum = 0;
for (int i = 1; i <= n; i++) {
cin >> a[i];
if (a[i] == 1 || a[i] == 2) cin >> b[i];
if (a[i] == 2) sum += b[i];
sum = min(sum, lim);
if (a[i] == 3) b[i] = sum, sum = sum * 2;
sum = min(sum, lim);
}
sum = 0;
int coef = 1, ans = 0;
for (int i = n; i >= 1; i--) {
if (a[i] == 2) sum += b[i], sum = min(sum, lim);
else if (a[i] == 3) {
if (b[i] == lim) continue;
if (b[i] == 0) { coef = 1LL * coef * 2 % mod; continue; }
c[++cnt] = b[i];
} else {
b[i] -= sum;
if (b[i] <= 0) continue;
int f = 0, t = b[i];
for (int j = 1; j <= cnt; j++) if (t > c[j]) {
f = (f + pw2[cnt - j]) % mod;
t -= c[j];
}
f = (f + 1) % mod;
ans = (ans + 1LL * coef * f % mod) % mod;
}
}
cout << ans << "\n";
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通