QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#853947 | #9732. Gathering Mushrooms | ucup-team3670# | WA | 60ms | 3576kb | C++17 | 3.4kb | 2025-01-11 20:29:17 | 2025-01-11 20:29:18 |
Judging History
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'