社区讨论
wa * 12 求调
AT_abc438_g[ABC438G] Sum of Min参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mju1bg12
- 此快照首次捕获于
- 2025/12/31 21:11 2 个月前
- 此快照最后确认于
- 2026/01/03 10:15 2 个月前
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ai2 = array<int, 2>;
const int N = 2e5 + 10;
const ll P = 998244353;
int n, m, g, a[N], b[N], id;
ll k, ans;
ai2 cir[N];
bool vis[N];
vector<ai2> vec[N];
int ls[N * 81], rs[N * 81], tot, cnt[N * 81], node, rt[N];
ll sum[N * 81];
void modify(int q, int &p, int x, int s = 1, int t = 1e9) {
p = ++ node;
ls[p] = ls[q], rs[p] = rs[q], cnt[p] = (cnt[q] + 1) % P, sum[p] = (sum[q] + x) % P;
if(s == t) return ;
int mid = s + t >> 1;
if(x <= mid) modify(ls[q], ls[p], x, s, mid);
else modify(rs[q], rs[p], x, mid + 1, t);
}
ll qs(int q, int p, int l, int r, int s = 1, int t = 1e9) {
// cerr << "q = " << q << " p = " << p << " s = " << s << " t = " << t << '\n';
if(p < q || !r || l > r) return 0;
if(s >= l && t <= r) {
// cerr << "res = " << ((sum[p] - sum[q]) % P + P) % P << '\n';
return ((sum[p] - sum[q]) % P + P) % P;
}
int mid = s + t >> 1;
ll res = 0;
if(l <= mid) res = qs(ls[q], ls[p], l, r, s, mid);
if(r > mid) res += qs(rs[q], rs[p], l, r, mid + 1, t);
if(res >= P) res -= P;
res = (res % P + P) % P;
return res;
}
int qc(int q, int p, int l, int r, int s = 1, int t = 1e9) {
if(p < q || !r || l > r) return 0;
if(s >= l && t <= r) return cnt[p] - cnt[q];
int mid = s + t >> 1, res = 0;
if(l <= mid) res = qc(ls[q], ls[p], l, r, s, mid);
if(r > mid) res += qc(rs[q], rs[p], l, r, mid + 1, t);
return res;
}
signed main() {
// freopen("data.in", "r", stdin);
// freopen("G.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m >> k;
if(n <= m) {
for(int i = 0; i < n; i ++) cin >> a[i];
for(int i = 0; i < m; i ++) cin >> b[i];
} else {
for(int i = 0; i < n; i ++) cin >> b[i];
for(int i = 0; i < m; i ++) cin >> a[i];
swap(n, m);
}
for(int i = 0; i < n; i ++) {
if(!vis[i]) {
int cur = i, j = 0;
++ tot;
for(; !vis[cur]; vec[tot].push_back({cur, ++ id}), cir[cur] = ai2{tot, j ++}, vis[cur] = true, cur = (cur + n) % m);// cerr << "cur = " << cur << '\n';
}
}
// cerr << "cir\n";
// for(int i = 0; i < m; i ++) cerr << cir[i][0] << ' ' << cir[i][1] << '\n';
for(int i = 1; i <= tot; i ++) {
for(int j = 0; j < vec[i].size(); j ++) {
if(j == 0) modify(rt[0], rt[vec[i][j][1]], b[vec[i][j][0]]);
else modify(rt[vec[i][j - 1][1]], rt[vec[i][j][1]], b[vec[i][j][0]]);
// if(b[vec[i][j][0]] == 5) cerr << "rt = " << rt[vec[i][j][1]] << '\n';
}
}
// vec[i][j] 表示 i 环上第 j 个位置是 {cur, id},cur 是 b 的下标,id 是所有的下标
for(int i = 0; i < n; i ++) {
int id = cir[i][0], j = cir[i][1], all = vec[id].size();
// cerr << "id = " << id << " j = " << j << " all = " << all << '\n';
// ll t = k / (n * all - (n - i));
ll t = ((k - i) / n + ((k - i) % n > 0)) / all % P;
// cerr << "vec[id][all - 1][1] = " << vec[id][all - 1][1] << '\n';
ans = (ans + t % P * qs(rt[0], rt[vec[id][all - 1][1]], 1, a[i] - 1) % P + t % P * qc(rt[0], rt[vec[id][all - 1][1]], a[i], 1e9) * a[i] % P) % P;
// cerr << "ans1 = " << ans << '\n';
// int e = k % (n * all - (n - i)) / ;
// int e = (k - i) % (all * n - (n - i));
int e = ((k - i) / n + ((k - i) % n > 0)) % all % P;
// e /= n;
// cerr << "a[i] = " << a[i] << " t = " << t << " e = " << e << '\n';
if(!e) continue;
// cerr << "e = " << e << '\n';
// cerr << "all = " << all << " j = " << j << '\n';
if(j + e - 1 >= all) {
ans = (ans + qs(rt[vec[id][j - 1][1]], rt[vec[id][all - 1][1]], 1, a[i] - 1) + qc(rt[vec[id][j - 1][1]], rt[vec[id][all - 1][1]], a[i], 1e9) * a[i] % P) % P;
ans = (ans % P + P) % P;
// cerr << "rt[lst] = " << rt[vec[id][j - 1][1]] << " rt[now] = " << rt[vec[id][all - 1][1]] << '\n';
// cerr << "ans2 = " << ans << " qs = " << qs(rt[vec[id][j - 1][1]], rt[vec[id][all - 1][1]], 1, a[i] - 1) << '\n';
e = j + e - 1 - (all - 1);
// cerr << "ne = " << e << '\n';
ans = (ans + qs(rt[0], rt[vec[id][e - 1][1]], 1, a[i] - 1) + qc(rt[0], rt[vec[id][e - 1][1]], a[i], 1e9) * a[i] % P) % P;
ans = (ans % P + P) % P;
} else {
// cerr << "Yes" << '\n';
if(!j) ans = (ans + qs(rt[0], rt[vec[id][e - 1][1]], 1, a[i] - 1) + qc(rt[0], rt[vec[id][e - 1][1]], a[i], 1e9) * a[i] % P) % P;
else ans = (ans + qs(rt[vec[id][j - 1][1]], rt[vec[id][j + e - 1][1]], 1, a[i] - 1) + qc(rt[vec[id][j - 1][1]], rt[vec[id][j + e - 1][1]], a[i], 1e9) * a[i] % P) % P;
ans = (ans % P + P) % P;
}
// cerr << "ans2 = " << ans << '\n';
}
cout << ans << '\n';
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...