# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
136264 |
2019-07-25T05:12:06 Z |
윤교준(#3260) |
Link (CEOI06_link) |
C++14 |
|
333 ms |
20308 KB |
#include <bits/stdc++.h>
#define eb emplace_back
#define sz(V) ((int)(V).size())
#define allv(V) ((V).begin()),((V).end())
#define sorv(V) sort(allv(V))
#define univ(V) (V).erase(unique(allv(V)),(V).end())
#define INF (0x3f3f3f3f)
using namespace std;
typedef pair<int, int> pii;
const int MAXN = 500055;
struct DJF {
DJF() { init(); }
int ud[MAXN];
void init() { iota(ud, ud+MAXN, 0); }
int uf(int i) { return i == ud[i] ? i : (ud[i] = uf(ud[i])); }
void uf(int a, int b) { ud[uf(b)] = uf(a); }
} djf, djfC;
vector<vector<int>> CV;
int CI[MAXN], CJ[MAXN], CL[MAXN], Cn;
bitset<MAXN> isC;
int dep[MAXN];
int A[MAXN], O[MAXN];
bitset<MAXN> ison, isdead, chk;
int N, K, Ans;
int getDC(int a, int b) { return CJ[a] <= CJ[b] ? CJ[b]-CJ[a] : CL[CI[a]] - (CJ[a]-CJ[b]); }
void goCycle(int v, int l) {
for(int i = v;;) {
i = djfC.uf(i);
if(chk[i] || getDC(v, i) > l) break;
chk[i] = true;
djfC.uf(A[i], i);
}
}
void goTree(int v, int l) {
int i = v;
for(;;) {
i = djf.uf(i);
if(isC[i]) break;
if(dep[v] - dep[i] > l) break;
chk[i] = true;
djf.uf(A[i], i);
}
if(isC[i] && dep[v] - dep[i] <= l)
goCycle(i, l - (dep[v] - dep[i]));
}
void dfs(int i) {
isdead[i] = true;
if(!isC[A[i]] && !isdead[A[i]]) dfs(A[i]);
dep[i] = dep[A[i]] + 1;
CI[i] = CI[A[i]];
}
int predfs(vector<int> &V, int i) {
ison[i] = true; V.eb(i);
if(isdead[A[i]]) return 0;
if(ison[A[i]]) return A[i];
int ret = predfs(V, A[i]);
isdead[i] = true;
return ret;
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> N >> K;
for(int i = 0, a, b; i < N; i++) {
cin >> a >> b;
A[a] = b;
}
for(int i = 1, v; i <= N; i++) if(!isdead[i]) {
vector<int> V;
v = predfs(V, i);
if(!v) continue;
V.erase(V.begin(), find(allv(V), v));
CV.eb(V);
for(int j = 0, n = sz(V), v; j < n; j++) {
v = V[j];
isC[v] = true;
CI[v] = Cn;
CJ[v] = j;
}
CL[Cn] = sz(V);
Cn++;
}
isdead.reset();
for(int i = 1; i <= N; i++) if(!isC[i] && !isdead[i]) dfs(i);
iota(O, O+N+1, 0); sort(O+2, O+N+1, [&](int a, int b) {
return dep[a] > dep[b];
});
for(int oi = 1, i; oi <= N; oi++) {
i = O[oi];
if(chk[i]) continue;
if(isC[i]) goCycle(i, 1 == i ? K : K-1);
else goTree(i, 1 == i ? K : K-1);
Ans++;
}
cout << Ans-1 << endl;
return 0;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
5 ms |
4344 KB |
Output isn't correct |
2 |
Incorrect |
5 ms |
4344 KB |
Output isn't correct |
3 |
Incorrect |
6 ms |
4344 KB |
Output isn't correct |
4 |
Incorrect |
6 ms |
4472 KB |
Output isn't correct |
5 |
Incorrect |
7 ms |
4600 KB |
Output isn't correct |
6 |
Incorrect |
17 ms |
5240 KB |
Output isn't correct |
7 |
Incorrect |
26 ms |
5656 KB |
Output isn't correct |
8 |
Incorrect |
36 ms |
6392 KB |
Output isn't correct |
9 |
Incorrect |
51 ms |
8020 KB |
Output isn't correct |
10 |
Incorrect |
52 ms |
7636 KB |
Output isn't correct |
11 |
Incorrect |
78 ms |
14112 KB |
Output isn't correct |
12 |
Incorrect |
108 ms |
8768 KB |
Output isn't correct |
13 |
Incorrect |
144 ms |
12448 KB |
Output isn't correct |
14 |
Incorrect |
170 ms |
12972 KB |
Output isn't correct |
15 |
Incorrect |
221 ms |
16228 KB |
Output isn't correct |
16 |
Incorrect |
235 ms |
17636 KB |
Output isn't correct |
17 |
Incorrect |
293 ms |
18524 KB |
Output isn't correct |
18 |
Incorrect |
309 ms |
17496 KB |
Output isn't correct |
19 |
Incorrect |
309 ms |
18160 KB |
Output isn't correct |
20 |
Incorrect |
326 ms |
18240 KB |
Output isn't correct |
21 |
Incorrect |
333 ms |
19428 KB |
Output isn't correct |
22 |
Incorrect |
319 ms |
19644 KB |
Output isn't correct |
23 |
Incorrect |
308 ms |
18904 KB |
Output isn't correct |
24 |
Incorrect |
315 ms |
20028 KB |
Output isn't correct |
25 |
Incorrect |
323 ms |
20308 KB |
Output isn't correct |