QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#744757#9731. Fuzzy Rankingucup-team4975RE 1ms3868kbC++144.3kb2024-11-13 23:12:032024-11-13 23:12:03

Judging History

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

  • [2024-11-25 12:28:53]
  • hack成功,自动添加数据
  • (/hack/1257)
  • [2024-11-13 23:12:03]
  • 评测
  • 测评结果:RE
  • 用时:1ms
  • 内存:3868kb
  • [2024-11-13 23:12:03]
  • 提交

answer

#define LOCAL
#include <bits/stdc++.h>
#define fir first
#define sec second
#define el '\n'

#ifdef LOCAL
#define FINISH cerr << "FINISH" << endl;
#else
#define FINISH ;
#endif

#ifdef LOCAL
#define debug(x) cerr << setw(4) << #x << " == " << x << endl
#else
#define debug(x)
#endif

#ifdef LOCAL
#define debugv(x)                   \
	cerr << setw(4) << #x << ":: "; \
	for (auto i : x)                \
		cerr << i << " ";           \
	cerr << endl
#else
#define debugv(x)
#endif

using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
ostream& operator<<(ostream& out, PII& x)
{
	out << x.fir << " " << x.sec << endl;
	return out;
}

const int mod = 998244353;
const int inf = 0x3f3f3f3f;
const int N = 200020;

struct SCC {
	int n;
	vector<vector<int>> edge;
	vector<int> stk;
	vector<int> dfn, low, col;
	int cur, cnt;

	SCC()
	{
	}
	SCC(int n)
	{
		init(n);
	}

	void init(int n)
	{
		this->n = n;
		edge.assign(n, {});
		dfn.assign(n, -1);
		low.resize(n);
		col.assign(n, -1);
		stk.clear();
		cur = cnt = 0;
	}

	void addEdge(int u, int v)
	{
		edge[u].push_back(v);
	}

	void dfs(int x)
	{
		dfn[x] = low[x] = cur++;
		stk.push_back(x);

		for (auto y : edge[x]) {
			if (dfn[y] == -1) {
				dfs(y);
				low[x] = min(low[x], low[y]);
			}
			else if (col[y] == -1) {
				low[x] = min(low[x], dfn[y]);
			}
		}

		if (dfn[x] == low[x]) {
			int y;
			do {
				y = stk.back();
				col[y] = cnt;
				stk.pop_back();
			} while (y != x);
			cnt++;
		}
	}

	vector<int> work()
	{
		for (int i = 0; i < n; i++) {
			if (dfn[i] == -1) {
				dfs(i);
			}
		}
		return col;
	}
};

void solve()
{
	int n, k, q;
	cin >> k >> n >> q;
	SCC sol(k + 1);
	vector<vector<int>> a(n + 1, vector<int>(k + 1, 0));
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= k; j++) {
			cin >> a[i][j];
			if (j >= 2) {
				sol.addEdge(a[i][j - 1], a[i][j]);
			}
		}
	}
	vector<int> col = sol.work();

	/*FINISH;
	debugv(col);*/

	vector<vector<pair<int, ll>>> ans(n + 1);
	vector<PII> r(k + 2);
	for (int i = 1; i <= n; i++) {
		int st = 1;
		for (int j = 1; j <= k; j++) {
			r[j].fir = inf;
			r[j].sec = 0;
		}
		for (int j = 1; j <= k; j++) {
			r[col[a[i][j]]].fir = min(r[col[a[i][j]]].fir, j);
			r[col[a[i][j]]].sec = max(r[col[a[i][j]]].sec, j);
		}
		r[k + 1].fir = k + 1, r[k + 1].sec = k + 1;
		sort(next(r.begin()), r.end());
		ans[i].push_back(make_pair(0, 0));
		int las = -1;

		for (int j = 1; j <= k + 1; j++) {
			if (r[j].fir == inf)
				break;
			if (r[j].sec == 0)
				continue;
			/*debug(r[j].fir);
			debug(r[j].sec);
			debug(las);*/
			if (r[j].fir > las) {
				int nowl = las + 1;
				ll lassum = ans[i].back().sec;
				int nowr = r[j].fir - 1;
				int len = nowr - nowl + 1;
				// cout << "! " << nowl << " " << nowr << endl;
				if (nowl != 0)
					ans[i].push_back(
						make_pair(nowl, 1ll * len * (len - 1) / 2 + lassum));
				// cout << ans[i].back().fir << " " << ans[i].back().sec << el;
				las = nowr;
			}
		}
		ans[i].push_back(make_pair(k + 1, 0));
	}


	/*for (int i = 1; i <= n; i++) {
		debug(i);
		for (int j = 0; j < ans[i].size(); j++) {
			cout << ans[i][j].fir << " " << ans[i][j].sec << el;
		}
	}
	FINISH*/

	ll lasans = 0;
	for (int i = 1; i <= q; i++) {
		ll id, l, r;
		cin >> id >> l >> r;
		id = (id + lasans) % n + 1;
		l = (l + lasans) % k + 1;
		r = (r + lasans) % k + 1;
		// cout << l << " " << r << endl;
		pair<int, ll> L = make_pair(l, 0);
		pair<int, ll> R = make_pair(r, 0);

		int idx1 =
			upper_bound(ans[id].begin(), ans[id].end(), L) - ans[id].begin();
		int idx2 = upper_bound(ans[id].begin(), ans[id].end(), R) -
				   ans[id].begin() - 1;

		// cout << idx1 << "   " << idx2 << endl;
		if (idx1 == idx2 + 1) {
			lasans = 1ll * (r - l + 1) * (r - l) / 2;
		}
		else {
			lasans = (ans[id][idx2].sec - ans[id][idx1].sec);
			int len1 = ans[id][idx1].fir - l;
			int len2 = r - ans[id][idx2].fir;
			lasans = lasans + 1ll * len1 * (len1 - 1) / 2 +
					 1ll * len2 * (len2 + 1) / 2;
		}
		cout << lasans << el;
	}
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int T = 1;
	cin >> T;
	while (T--) {
		solve();
	}
	return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 3868kb

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: