社区讨论

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 条回复,欢迎继续交流。

正在加载回复...