QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#869319 | #9732. Gathering Mushrooms | hos_lyric | WA | 60ms | 32812kb | C++14 | 6.1kb | 2025-01-25 05:27:02 | 2025-01-25 05:27:03 |
Judging History
answer
#include <cassert>
#include <cmath>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <functional>
#include <iostream>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>
using namespace std;
using Int = long long;
template <class T1, class T2> ostream &operator<<(ostream &os, const pair<T1, T2> &a) { return os << "(" << a.first << ", " << a.second << ")"; };
template <class T> ostream &operator<<(ostream &os, const vector<T> &as) { const int sz = as.size(); os << "["; for (int i = 0; i < sz; ++i) { if (i >= 256) { os << ", ..."; break; } if (i > 0) { os << ", "; } os << as[i]; } return os << "]"; }
template <class T> void pv(T a, T b) { for (T i = a; i != b; ++i) cerr << *i << " "; cerr << endl; }
template <class T> bool chmin(T &t, const T &f) { if (t > f) { t = f; return true; } return false; }
template <class T> bool chmax(T &t, const T &f) { if (t < f) { t = f; return true; } return false; }
#define COLOR(s) ("\x1b[" s "m")
struct Functional {
int n;
vector<int> par;
int cyclesLen;
vector<int> lens;
vector<vector<int>> cycles;
// cycle id or -1
vector<int> on;
// forest
vector<vector<int>> graph;
int zeit;
vector<int> dis, fin, dep;
// root is cycle[k][l]
vector<int> ks, ls;
Functional() {}
Functional(const vector<int> &par_) : par(par_) {
n = par.size();
for (int u = 0; u < n; ++u) {
assert(0 <= par[u]); assert(par[u] < n);
}
cycles.clear();
vector<int> vis(n, -1);
for (int s = 0; s < n; ++s) {
int u = s;
for (; !~vis[u]; u = par[u]) {
vis[u] = s;
}
if (vis[u] == s) {
vector<int> cycle;
for (int v = u; ; ) {
cycle.push_back(v);
if ((v = par[v]) == u) break;
}
cycles.push_back(cycle);
}
}
cyclesLen = cycles.size();
lens.resize(cyclesLen);
on.assign(n, -1);
for (int k = 0; k < cyclesLen; ++k) {
lens[k] = cycles[k].size();
for (const int u : cycles[k]) {
on[u] = k;
}
}
graph.assign(n, {});
for (int u = 0; u < n; ++u) if (!~on[u]) {
graph[par[u]].push_back(u);
}
zeit = 0;
dis.assign(n, -1);
fin.assign(n, -1);
dep.assign(n, 0);
ks.assign(n, -1);
ls.assign(n, -1);
for (int k = 0; k < cyclesLen; ++k) {
for (int l = 0; l < lens[k]; ++l) {
dfs(k, l, cycles[k][l]);
}
}
}
void dfs(int k, int l, int u) {
dis[u] = zeit++;
ks[u] = k;
ls[u] = l;
for (const int v : graph[u]) {
dep[v] = dep[u] + 1;
dfs(k, l, v);
}
fin[u] = zeit;
}
// min d s.t. f^d(u) = v, or -1
int dist(int u, int v) const {
if (ks[u] != ks[v]) return -1;
if (~on[v]) {
int dl = ls[v] - ls[u];
if (dl < 0) dl += lens[ks[u]];
return dep[u] + dl;
}
return (dis[v] <= dis[u] && dis[u] < fin[v]) ? (dep[u] - dep[v]) : -1;
};
};
////////////////////////////////////////////////////////////////////////////////
constexpr Int INF = 1001001001001001001LL;
int N;
Int W;
vector<int> A, P;
vector<int> ans;
Functional F;
// cycle[l] on time l
struct Waf {
// on cycle
int L;
vector<int> ls;
// on tree
vector<int> stack;
void init(int L_) {
L = L_;
ls.clear();
stack.clear();
}
// w ko from time L
Int get(Int w) const {
if (ls.size()) {
const Int quo = (w - 1) / ls.size();
const Int rem = (w - 1) % ls.size();
return (1 + quo) * L + ls[rem];
} else {
return INF;
}
}
Int add(Int t) {
stack.push_back(t);
if (W <= (int)stack.size()) {
return stack.end()[-W];
} else {
return get(W - (int)stack.size());
}
}
void undo() {
stack.pop_back();
}
};
vector<Waf> waf;
void dfs(int u, int t, pair<Int, int> near) {
const Int res = waf[A[u]].add(t);
chmin(near, make_pair(res, A[u]));
// cerr<<"[dfs] u = "<<u<<", t = "<<t<<", near = "<<near<<endl;
ans[u] = near.second;
for (const int v : F.graph[u]) {
dfs(v, t - 1, near);
}
waf[A[u]].undo();
}
int main() {
for (int numCases; ~scanf("%d", &numCases); ) { for (int caseId = 1; caseId <= numCases; ++caseId) {
scanf("%d%lld", &N, &W);
A.resize(N);
for (int u = 0; u < N; ++u) {
scanf("%d", &A[u]);
--A[u];
}
P.resize(N);
for (int u = 0; u < N; ++u) {
scanf("%d", &P[u]);
--P[u];
}
ans.assign(N, -1);
F = Functional(P);
const int K = F.cycles.size();
vector<vector<int>> uss(K);
for (int u = 0; u < N; ++u) uss[F.ks[u]].push_back(u);
waf.resize(N);
for (int k = 0; k < K; ++k) {
const auto &C = F.cycles[k];
const int L = C.size();
for (const int u : uss[k]) waf[A[u]].init(L);
for (int l = 0; l < L; ++l) waf[A[C[l]]].ls.push_back(l);
pair<Int, int> near(INF, -1);
for (int l = 0; l < L; ++l) {
const Int res = waf[A[C[l]]].get(W);
chmin(near, make_pair(res, A[C[l]]));
}
// cerr<<"C = "<<C<<", near = "<<near<<endl;
for (int l = L; --l >= 0; ) {
dfs(C[l], l, near);
const Int res = waf[A[C[l]]].add(l);
chmin(near, make_pair(res, A[C[l]]));
}
}
// cerr<<"ans = "<<ans<<endl;
Int key = 0;
for (int u = 0; u < N; ++u) key += (u + 1) * (ans[u] + 1);
printf("%lld\n", key);
#ifdef LOCAL
vector<int>brt(N,-1);
for(int u=0;u<N;++u){
vector<int>cnt(N,0);
for(int v=u;;v=P[v])if(++cnt[A[v]]==W){brt[u]=A[v];break;}
}
if(brt!=ans){
cerr<<"N = "<<N<<endl;
cerr<<"W = "<<W<<endl;
cerr<<"A = "<<A<<endl;
cerr<<"P = "<<P<<endl;
cerr<<"brt = "<<brt<<endl;
cerr<<"ans = "<<ans<<endl;
assert(false);
}
#endif
}
#ifndef LOCAL
break;
#endif
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3840kb
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: 0
Accepted
time: 32ms
memory: 3968kb
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:
3420 260 254 26 84 759 126 30 1092 1 2493 2422 168 360 298 324 2424 2520 220 228 1107 9 3486 1 796 81 340 272 600 3196 32 495 40 128 140 665 1635 702 68 96 90 288 29 588 16 234 445 2928 140 40 477 1197 19 1994 1082 32 522 672 20 390 32 2204 1938 42 21 885 4 1539 196 420 11 1709 801 720 1 556 40 17 2...
result:
ok 6000 lines
Test #3:
score: -100
Wrong Answer
time: 60ms
memory: 32812kb
input:
1 200000 40000 46988 88148 28442 9596 17281 27561 58024 1062 138912 175273 194682 27958 11240 187099 28869 177531 154933 83035 11300 178646 6952 44234 168671 169483 187602 178519 99885 98196 64731 100802 16974 85402 50616 126862 159025 116795 83016 127770 3067 56860 19833 64583 11977 100045 198272 1...
output:
9734111201699
result:
wrong answer 1st lines differ - expected: '2654974404037027', found: '9734111201699'