QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#745604#9731. Fuzzy RankingatuerWA 29ms18784kbC++233.0kb2024-11-14 10:46:052024-11-14 10:46:05

Judging History

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

  • [2024-11-25 12:28:53]
  • hack成功,自动添加数据
  • (/hack/1257)
  • [2024-11-14 10:46:05]
  • 评测
  • 测评结果:WA
  • 用时:29ms
  • 内存:18784kb
  • [2024-11-14 10:46:05]
  • 提交

answer

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

#define int long long
#define double long double
#define endl "\n"

const int maxn = 2e5 + 7, oo = 1e18 + 7;

int val[maxn];

int n, m, q;
vector<int> a[maxn];
set<int> edge[maxn];

unordered_map<int, int> mp;
int idx = 0;

int b[maxn], vis[maxn];

void dfs(int x)
{
	// cout << " -> " << x << endl;
	b[x] = x, vis[x] = 1;

	for (int y : edge[x])
	{
		// cout << "?" << y << endl;

		if (!vis[y])
			dfs(y);

		b[x] = min(b[x], b[y]);
	}
}

void solve()
{
	cin >> n >> m >> q;

	mp.clear(), idx = 0;
	for (int i = 1; i <= n; i++)
		edge[i].clear(), vis[i] = 0;

	for (int j = 1; j <= m; j++)
	{
		a[j].clear(), a[j].push_back(-1);
		for (int i = 1; i <= n; i++)
		{
			int x;
			cin >> x;
			if (!mp[x])
				mp[x] = ++idx;
			a[j].push_back(mp[x]);

			if (i > 1)
			{
				// cout << a[j][i - 1] << " ->>> " << a[j][i] << endl;
				edge[a[j][i - 1]].insert(a[j][i]);
			}
		}
	}

	// for (int j = 1; j <= m; j++)
	// {
	// 	for (int i = 1; i <= n; i++)
	// 		cout << a[j][i] << " ";
	// 	cout << endl;
	// }

	dfs(1);

	// for (int j = 1; j <= m; j++)
	// 	for (int i = 2; i <= n; i++)
	// 		b[a[j][i - 1]] = min(b[a[j][i - 1]], a[j][i]);
	// for (int i = n; i >= 1; i--)
	// 	b[i] = min(b[i + 1], b[i]);

	// for (int i = 1; i <= n; i++)
	// 	cout << b[i] << " ";
	// cout << endl;

	map<int, int> qj;
	qj[0] = 0;
	int now = 1;
	while (now <= n)
	{
		int j = now;
		while (j < n && b[j + 1] == b[now])
			j++;
		qj[now] = qj.rbegin()->second + val[j - now + 1];
		now = j + 1;
	}
	qj[n + 1] = qj.rbegin()->second;

	// for (auto i : qj)
	// {
	// 	cout << i.first << " " << i.second << endl;
	// }

	int ans = 0;
	while (q--)
	{
		int x, l, r;
		cin >> x >> l >> r;

		x = ((x + ans) % m) + 1;
		l = ((l + ans) % n) + 1;
		r = ((r + ans) % n) + 1;

		// cout << "{ " << x << " " << l << " " << r << endl;

		auto ll = qj.lower_bound(l);
		auto rr = -- --qj.upper_bound(r + 1);

		// cout << "[ " << ll->first << " " << rr->first << " " << endl;

		// cout << ll << "~" << rr << endl;

		int res = 0;

		if ((--ll)->first <= rr->first)
		{
			res += rr->second - ll->second;
			int qr = (++ll)->first - 1, ql = (++rr)->first;
			res += val[max(qr - l + 1, 0ll)];
			res += val[max(r - ql + 1, 0ll)];
		}
		else
		{
			// int ql = l, qr = r;
			// while (ql < qr)
			// {
			// 	int mid = (ql + qr + 1) / 2;
			// 	if (b[l] == b[mid])
			// 		ql = mid;
			// 	else
			// 		qr = mid - 1;
			// }
			// res += val[max(ql - l + 1, 0ll)];
			// res += val[max(r - (ql + 1) + 1, 0ll)];
			res += val[max(r - l + 1, 0ll)];
		}

		// cout << qj[rr] - qj[ll1] << endl;

		cout << res << endl;

		ans = res;
	}
}

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cout << fixed << setprecision(10);

	val[0] = 0;
	for (int i = 1; i < maxn; i++)
		val[i] = val[i - 1] + i - 1;

	int t = 1;
	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: 18560kb

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: 0
Accepted
time: 17ms
memory: 18784kb

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:

1
1
0
0
3
2
0
2
2
4
1
0
1
1
1
1
2
4
4
3
1
6
28
0
0
10
10
6
6
15
0
3
10
6
16
6
11
1
2
1
1
6
3
3
0
4
5
3
4
1
1
3
2
4
0
3
4
4
4
4
0
0
1
1
2
0
0
1
2
1
1
0
0
1
4
3
0
4
4
1
3
6
16
16
0
11
16
1
4
15
1
4
2
0
0
2
0
1
2
4
0
0
0
0
0
0
0
0
0
0
1
0
0
6
3
0
3
4
0
0
0
0
0
0
0
0
0
0
0
0
3
0
0
1
3
1
0
0
3
3
9
1
9
4
...

result:

ok 20000 lines

Test #3:

score: -100
Wrong Answer
time: 29ms
memory: 17940kb

input:

8000
5 5 10
3 5 2 4 1
3 2 5 4 1
3 5 2 4 1
3 5 2 4 1
3 5 2 4 1
1 1 1
4 1 3
1 0 3
4 2 3
1 0 1
3 2 3
1 2 3
3 0 2
1 1 3
1 1 2
5 5 10
5 3 1 2 4
3 5 1 2 4
5 3 1 2 4
3 5 1 2 4
5 3 1 2 4
0 0 1
2 0 1
4 1 2
1 3 4
2 0 1
4 3 3
1 4 4
1 3 4
0 0 4
0 0 3
5 5 10
2 3 4 1 5
5 1 4 3 2
1 3 4 2 5
2 3 4 1 5
5 1 3 4 2
1 2 ...

output:

0
1
1
0
0
0
0
1
0
1
1
0
0
0
1
0
0
0
1
0
3
0
3
1
0
3
1
6
1
0
0
0
0
0
0
0
0
0
0
0
1
1
2
1
0
3
0
0
3
0
1
0
0
0
0
0
0
1
0
0
6
1
0
6
0
3
3
3
0
0
3
3
6
1
10
1
3
0
1
0
3
1
0
0
1
0
1
1
1
2
0
0
0
0
0
0
0
0
0
0
0
0
3
1
3
3
1
3
1
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
0
1
6
0
6
6
1
1
1
0
1
1
0
0
1
0
0
0
3
0
1
1
0
2
3
3...

result:

wrong answer 924th lines differ - expected: '10', found: '6'