QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#853947#9732. Gathering Mushroomsucup-team3670#WA 60ms3576kbC++173.4kb2025-01-11 20:29:172025-01-11 20:29:18

Judging History

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

  • [2025-01-11 20:29:18]
  • 评测
  • 测评结果:WA
  • 用时:60ms
  • 内存:3576kb
  • [2025-01-11 20:29:17]
  • 提交

answer

#include<bits/stdc++.h>

using namespace std;   

#define forn(i, n) for(int i = 0; i < int(n); i++)
#define fore(i, l, r) for(int i = int(l); i < int(r); i++)
#define sz(a) int((a).size())

typedef long long li;

const li INF64 = 1e18;

int n, k;
vector<int> a, g;

bool read() {
	if (!(cin >> n >> k))
		return false;
	a.resize(n);
	forn(i, n){
		cin >> a[i];
		--a[i];
	}
	g.resize(n);
	forn(i, n){
		cin >> g[i];
		--g[i];
	}
	--k;
	return true;
}

vector<vector<int>> gg;
vector<char> used;
vector<pair<int, li>> ans;

vector<pair<int, int>> st;
vector<int> nxt;
vector<char> cyc;

const int LOGN = 30;
vector<vector<int>> up;
vector<vector<li>> uplen;

void extend(int u){
	up[u][0] = (nxt[a[u]] == -1 ? n : st[nxt[a[u]]].first);
	uplen[u][0] = (nxt[a[u]] == -1 ? 0 : sz(st) - nxt[a[u]]);
	fore(i, 1, LOGN){
		up[u][i] = up[up[u][i - 1]][i - 1];
		uplen[u][i] = uplen[u][i - 1] + uplen[up[u][i - 1]][i - 1];
	}
	st.push_back({u, nxt[a[u]]});
	nxt[a[u]] = sz(st) - 1;
}

void pop(){
	int u = st.back().first;
	nxt[a[u]] = st.back().second;
	st.pop_back();
}

void dfs(int v, int p){
	used[v] = true;
	extend(v);
	ans[v] = ans[p];
	++ans[v].second;
	int w = v;
	li dist = 1;
	forn(i, LOGN) if ((k >> i) & 1){
		dist += uplen[w][i];
		w = up[w][i];
	}
	if (w != n && dist < ans[v].second){
		ans[v] = {a[v], dist};
	}
	for (int u : gg[v]) if (!cyc[u]){
		dfs(u, v);
	}
	pop();
}

vector<li> cnt;

void calc(int v){
	int len = 1;
	int u = g[v];
	cyc[u] = true;
	vector<int> cur({v});
	while (u != v){
		cur.push_back(u);
		u = g[u];
		cyc[u] = true;
		++len;
	}
	reverse(cur.begin(), cur.end());
	forn(i, 2 * len){
		int u = cur[i % len];
		extend(u);
	}
	auto check = [&](li d){
		for (int v : cur) cnt[a[v]] = 0;
		for (int v : cur) cnt[a[v]] += d / len;
		forn(i, d % len) ++cnt[a[cur[len - i - 1]]];
		li mx = 0;
		for (int v : cur) mx = max(mx, cnt[a[v]]);
		if (mx <= k) return false;
		ans[cur.back()].second = d;
		ans[cur.back()].first = a[cur[len - d % len - 1]];
		return true;
	};
	li l = 0, r = n * li(k);
	while (l <= r){
		li m = (l + r) / 2;
		if (check(m))
			r = m - 1;
		else
			l = m + 1;
	}
	
	//for (auto [v, lst] : st) cerr << "(" << v + 1 << " " << lst << ") ";
	//cerr << endl;
	forn(i, len){
		int u = cur[i];
		dfs(u, cur[(i - 1 + len) % len]);
		extend(u);
	}
	
	//cerr << ans[cur.back()].first + 1 << " " << ans[cur.back()].second << endl;
	//forn(i, n) cerr << int(used[i]);
	//cerr << endl;
	//cerr << "!";
	//exit(0);
	for (auto [x, _] : st)
		nxt[a[x]] = -1;
	st.clear();
}

void solve() {
	up.assign(n + 1, vector<int>(LOGN, n));
	uplen.assign(n + 1, vector<li>(LOGN, 0));
	cyc.assign(n, false);
	gg.assign(n, {});
	forn(i, n) gg[g[i]].push_back(i);
	
	cnt.assign(n, 0);
	used.assign(n, false);
	vector<char> used2(n);
	ans.assign(n, {-1, INF64});
	nxt.assign(n, -1);
	forn(i, n) if (!used[i]){
		int v = i;
		while (!used2[v]){
			used2[v] = true;
			v = g[v];
		}
		calc(v);
	}
	
	li res = 0;
	//forn(i, n) cerr << ans[i].first + 1 << " " << ans[i].second << endl;
	forn(i, n) res += (ans[i].first + 1) * li(i + 1);
	cout << res << '\n';
}

int main() {
#ifdef _DEBUG
	freopen("input.txt", "r", stdin);
#endif
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int t = 1;
	cin >> t;
	forn(i, t) {
	 	read();
		solve();
	}
}

详细

Test #1:

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

input:

3
5 3
2 2 1 3 3
2 5 1 2 4
5 4
2 2 1 3 3
2 5 1 2 4
3 10
1 2 3
1 3 2

output:

41
45
14

result:

ok 3 lines

Test #2:

score: -100
Wrong Answer
time: 60ms
memory: 3576kb

input:

6000
19 48
18 19 18 19 11 9 15 19 12 18 11 18 9 18 9 18 19 11 15
12 14 18 8 1 3 19 5 13 14 15 2 14 5 19 2 19 12 9
15 23
3 1 1 3 6 1 4 1 1 6 6 4 12 4 6
14 1 8 8 6 6 12 14 6 8 5 7 14 2 5
9 140979583
4 5 8 9 2 7 6 8 2
8 9 4 6 9 2 4 7 8
4 976357580
2 3 1 3
2 1 1 4
6 508962809
4 3 4 3 4 4
4 5 4 5 5 6
13 ...

output:

2097
260
254
26
84
759
122
30
1092
1
2493
2422
168
384
298
324
2424
2520
208
228
1107
9
3486
1
796
81
340
272
600
3196
32
495
40
128
140
665
1527
702
68
96
90
288
29
588
16
234
445
2928
140
40
477
1197
19
1646
1082
32
522
672
20
390
32
2204
1768
42
21
885
4
1539
196
420
11
1709
801
720
1
589
40
17
2...

result:

wrong answer 1st lines differ - expected: '3420', found: '2097'