QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#856019#9731. Fuzzy Rankingicpc_zhzx034#RE 0ms30232kbC++142.7kb2025-01-13 15:06:092025-01-13 15:06:11

Judging History

你现在查看的是最新测评结果

  • [2025-01-13 15:06:11]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:30232kb
  • [2025-01-13 15:06:09]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int N = 2e5 + 5;

struct edge {
	int to, Next;

	edge() {}
	edge(int to, int Next): to(to), Next(Next) {}
} G[N << 1];

int head[N], cnt;

inline void add_edge(int u, int v) {
	G[++cnt] = edge(v, head[u]);
	head[u] = cnt;
}

int T, n, q, k, c[N];

vector <int> a[N], pre[N], suf[N];
vector <ll> sum[N], Sum[N];

int dfn[N], low[N], tot, col;

stack <int> S;
bitset <N> vis;

inline void Tarjan(int u) {
	S.push(u);
	dfn[u] = low[u] = ++tot;
	vis[u] = 1;
	for (int i = head[u]; i; i = G[i].Next) {
		int v = G[i].to;
		if (!dfn[v]) {
			Tarjan(v);
			low[u] = min(low[u], low[v]);
		} else if (vis[u]) {
			low[u] = min(low[u], dfn[v]);
		}
	}
	if (dfn[u] == low[u]) {
		++col;
		while (!S.empty()) {
			int v = S.top();
			S.pop();
			vis[v] = 0;
			c[v] = col;
			if (v == u) {
				break;
			}
		}
	}
}

ll ans;

inline void solve() {
	cin >> n >> q >> k;
	for (int i = 1; i <= n; ++i) {
		head[i] = 0;
		dfn[i] = 0;
		vis[i] = 0;
	}
	cnt = tot = col = 0;
	for (int i = 1; i <= k; ++i) {
		a[i].resize(n + 1);
		for (int j = 1; j <= n; ++j) {
			cin >> a[i][j];
		}
		for (int j = 1; j < n; ++j) {
			add_edge(a[i][j], a[i][j + 1]);
		}
	}
	for (int i = 1; i <= n; ++i) {
		if (!dfn[i]) {
			Tarjan(i);
		}
	}
	for (int i = 1; i <= k; ++i) {
		pre[i].resize(n + 1);
		for (int j = 1; j <= n; ++j) {
			if (c[a[i][j]] == c[a[i][j - 1]]) {
				pre[i][j] = pre[i][j - 1];
			} else {
				pre[i][j] = j;
			}
		}
		suf[i].resize(n + 1);
		for (int j = n; j; --j) {
			if (j != n && c[a[i][j]] == c[a[i][j + 1]]) {
				suf[i][j] = suf[i][j + 1];
			} else {
				suf[i][j] = j;
			}
		}
		sum[i].resize(n + 1);
		Sum[i].resize(n + 1);
		for (int j = 1; j <= n; ++j) {
			if (j == n || c[a[i][j]] != c[a[i][j + 1]]) {
				ll len = j - pre[i][j] + 1;
				sum[i][j] = len * (len - 1) / 2;
			} else {
				sum[i][j] = 0;
			}
			Sum[i][j] = sum[i][j] + Sum[i][j - 1];
		}
	}
	ans = 0;
	while (q--) {
		int id, l, r;
		cin >> id >> l >> r;
		id = (id + ans) % k + 1;
		l = (l + ans) % n + 1;
		r = (r + ans) % n + 1;
		if (c[a[id][l]] == c[a[id][r]]) {
			ans = (ll)(r - l + 1) * (r - l) / 2;
		} else {
			ans = 0;
			ans += Sum[id][r - 1] - Sum[id][l - 1];
			ans -= sum[id][suf[id][l]];
			ans += (ll)(r - pre[id][r] + 1) * (r - pre[id][r]) / 2;
			ans += (ll)(suf[id][l] - l + 1) * (suf[id][l] - l) / 2;
		}
		cout << ans << "\n";
	}
}

int main() {
	#ifdef LOCAL
		assert(freopen("test.in", "r", stdin));
		assert(freopen("test.out", "w", stdout));
	#endif
	ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
	cin >> T;
	while (T--) {
		solve();
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 30232kb

input:

2
5 2 2
1 2 3 4 5
5 4 3 2 1
1 0 2
1 2 1
5 3 3
1 2 3 4 5
1 3 2 4 5
1 2 3 5 4
0 0 2
0 2 3
1 0 3

output:

3
10
1
1
2

result:

ok 5 lines

Test #2:

score: -100
Runtime Error

input:

2000
10 10 10
4 5 3 6 8 9 2 1 7 10
4 5 6 3 8 9 1 2 10 7
5 4 3 6 8 9 1 2 7 10
4 5 6 3 8 9 1 2 7 10
4 5 3 6 8 9 2 1 10 7
4 5 6 3 8 9 1 2 10 7
5 4 6 3 8 9 1 2 7 10
5 4 6 3 8 9 1 2 10 7
4 5 6 3 8 9 2 1 7 10
5 4 3 6 8 9 2 1 10 7
3 1 6
5 7 8
0 2 3
7 9 9
2 1 9
6 1 6
7 2 3
0 0 4
1 8 1
1 8 7
10 10 10
9 10 5 ...

output:


result: