南外集训 2024.2.23 T3
Kubic 素质如此,如何国家队?
有一个初始为空的序列,对其进行
次操作(强制在线)。操作分为两种:
表示在序列末尾插入一个 。
表示询问当前序列中长度等于 的区间的价值之和 。 定义一个区间的价值为中前
大的数的乘积,其中 是给定的常数。如果区间长度不到 则其价值为区间中所有数的乘积。 保证
操作个数恰好为给定常数 ,且任意时刻序列中所有数互不相同。 数据范围:
。
首先暴力跳链表是经典的套路(所谓的 EX 单调栈),似乎还考过,就不赘述。理解一下题解中说的这个
被重新计算的一定是被扫描到的元素,这保证这一部分的复杂度均摊正确。我们插入的数记为 nth_element
求第
于是我们扫描到了
考虑维护答案的部分。把区间
代码如下(最劣解取之 被艾伦赵打败了我去)。注意询问时要减掉最后
// Author: kyEEcccccc #include <bits/stdc++.h> using namespace std; using LL = long long; using ULL = unsigned long long; #define F(i, l, r) for (int i = (l); i <= (r); ++i) #define FF(i, r, l) for (int i = (r); i >= (l); --i) #define MAX(a, b) ((a) = max(a, b)) #define MIN(a, b) ((a) = min(a, b)) #define SZ(a) ((int)((a).size()) - 1) constexpr int N = 100005, B = 330, MOD = 998244353; LL kpow(LL x, ULL k = MOD - 2) { x = x % MOD; LL r = 1; while (k) { if (k & 1) r = r * x % MOD; x = x * x % MOD; k >>= 1; } return r; } int typ; int n, nn, m, q; int a[N], b[N], lv[N]; int inv[10000005]; LL val[N]; int nxt[N], hd; int nb[N]; struct Blocks { LL val[N], valp[N]; LL sum[N / B + 5], sump[N / B + 5]; void add(int pos, LL x) { // assert(pos >= 0 && pos <= nn); x %= MOD; (val[pos] += x) %= MOD; (sum[pos / B] += x) %= MOD; (valp[pos] += x * pos) %= MOD; (sump[pos / B] += x * pos) %= MOD; } array<LL, 2> get_sum(int pos) { // assert(pos >= 0); LL x = 0, y = 0; F(i, 0, pos / B - 1) { x += sum[i]; y += sump[i]; } F(i, pos / B * B, pos) { x += val[i]; y += valp[i]; } return {x % MOD, y % MOD}; } } blka, blkb, blkc; void add(int a, int b, int r, LL x) { // cerr << "perf: " << a << ' ' << b << ' ' << r << ' ' << x << '\n'; blka.add(r - b, x); blkb.add(r - a, x); blkc.add(nn - (a - 1), -x); blkc.add(nn - b, x); } int vec[N], tv, cv[N]; signed main(void) { freopen("formalized.in", "r", stdin); freopen("formalized.out", "w", stdout); ios::sync_with_stdio(0), cin.tie(nullptr); inv[0] = 1; F(i, 1, 10000000) inv[i] = (LL)inv[i - 1] * i % MOD; inv[10000000] = kpow(inv[10000000]); FF(i, 10000000, 1) inv[i - 1] = (LL)inv[i] * i % MOD; LL pd = 1; F(i, 1, 10000000) { inv[i] = inv[i] * pd % MOD; (pd *= i) %= MOD; } // F(i, 1, 10000000) assert((LL)inv[i] * i % MOD == 1); cin >> typ >> n >> m >> q; nn = n; n = 0; int lst_ans = 0; hd = 0; pd = 0; F(_, 1, q) { // cerr << _ << ":" << '\n'; int op, d; cin >> op >> d; d ^= lst_ans * typ; if (op == 1) { (pd += d) %= MOD; ++n; // assert(n <= nn); a[n] = d; lv[n] = 0; b[n] = a[n]; val[n] = 1; nxt[n] = hd; hd = n; int p = n; tv = 0; int ct = 0; while (1) { if (nxt[p] == 0) { vec[++tv] = p; break; } if (a[nxt[p]] < a[n]) { ++lv[nxt[p]]; if (lv[nxt[p]] == m) { add(nxt[nxt[p]] + 1, nxt[p], n, -val[nxt[p]]); // cerr << "! " << nxt[p] << '\n'; nxt[p] = nxt[nxt[p]]; } else { vec[++tv] = p; p = nxt[p]; add(nxt[p] + 1, p, n, -val[p]); } } else { ++ct; vec[++tv] = p; if (ct == m) break; p = nxt[p]; add(nxt[p] + 1, p, n, -val[p]); } } if (m == 1) { val[n] = a[n]; add(nxt[n] + 1, n, n, val[n]); } else if (n <= m) { F(i, 1, tv) { int x = vec[i]; MIN(b[x], a[n]); (val[x] *= a[n]) %= MOD; add(nxt[x] + 1, x, n, val[x]); } } else { F(i, 1, tv - 1) cv[i] = a[vec[i + 1]]; nth_element(cv + 1, cv + tv - (m - 1), cv + tv); nb[vec[tv]] = cv[tv - (m - 1)]; FF(i, tv - 1, 1) { if (n - vec[i] + 1 <= m) nb[vec[i]] = min(b[vec[i]], a[n]); else if (a[vec[i + 1]] == b[vec[i + 1]]) nb[vec[i]] = nb[vec[i + 1]]; else nb[vec[i]] = b[vec[i + 1]]; } MIN(nb[vec[tv]], a[n]); F(i, 1, tv) { int x = vec[i]; if (n - x + 1 > m) (val[x] *= inv[b[x]]) %= MOD; (val[x] *= a[n]) %= MOD; add(nxt[x] + 1, x, n, val[x]); b[x] = nb[x]; } } } else { --d; if (d == 0) lst_ans = pd; else if (d >= n) lst_ans = 0; else { auto ra = blka.get_sum(d), rb = blkb.get_sum(d - 1), rc = blkc.get_sum(nn - (n - d + 1)); lst_ans = (((ra[0] * (d + 1) - ra[1]) - (rb[0] * d - rb[1]) - (rc[0] * (nn - (n - d + 1) + 1) - rc[1])) % MOD + MOD) % MOD; } cout << lst_ans << '\n'; } } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现