# |
제출 시각 |
아이디 |
문제 |
언어 |
결과 |
실행 시간 |
메모리 |
136305 |
2019-07-25T06:08:34 Z |
임유진(#3261) |
Link (CEOI06_link) |
C++14 |
|
1182 ms |
25784 KB |
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 500005;
const int MAXK = 20005;
int A[MAXN], B[MAXN];
int ed[MAXN], ind[MAXN];
bool chk[MAXN], on[MAXN], cyc[MAXN];
vector<int> cnod[MAXN];
int cn;
queue<int> indz;
void searchgraph(int x) {
//printf("searchgraph(%d)\n", x);
chk[x] = on[x] = true;
if(on[ed[x]]) {
for(int t = x; !cyc[t]; t = ed[t]) {
cyc[t] = true;
cnod[cn].push_back(t);
}
cn++;
}
else if(!chk[ed[x]]) searchgraph(ed[x]);
on[x] = false;
}
void movek(int x, int k) {
for(; k-- >= 0; x = ed[x]) chk[x] = true;
if(--ind[x] == 0) indz.push(x);
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int N, K;
int ans = 0;
cin >> N >> K;
for(int i = 0; i < N; i++) cin >> A[i] >> B[i];
for(int i = 0; i < N; i++) {
ed[A[i]] = B[i];
ind[B[i]]++;
}
for(int i = 1; i <= N; i++) if(!chk[i]) searchgraph(i);
//printf("cn = %d\n", cn);
//for(auto a : cnod[0]) printf("%d ", a);
//printf("\n");
for(int i = 1; i <= N; i++) chk[i] = false;
movek(1, K);
for(int i = 1; i <= N; i++) if(ind[i] == 0) indz.push(i);
while(!indz.empty()) {
if(!chk[indz.front()] && !cyc[indz.front()]) {
//printf("indz = %d\n", indz.front());
movek(indz.front(), K - 1);
ans++;
}
indz.pop();
}
//for(int i = 1; i <= N; i++) printf("%d ", int(chk[i]));
//printf("\nans = %d\n", ans);
for(int i = 0; i < cn; i++) {
//for(auto a : cnod[i]) printf("%d ", a);
//printf("\n");
bool done = true;
for(auto a : cnod[i]) done &= chk[a];
if(done) continue;
if(cnod[i].size() <= K) {
ans++;
continue;
}
int mn = cnod[i].size();
for(int j = 0; j < K; j++) if(j == K - 1 || !chk[cnod[i][j]]) {
int cnt = 0, t = j;
while(t < cnod[i].size() + j) {
while(t < cnod[i].size() + j && chk[cnod[i][t % cnod[i].size()]]) t++;
if(t == cnod[i].size() + j) break;
cnt++;
t += K;
}
mn = min(mn, cnt);
}
ans += mn;
}
cout << ans;
return 0;
}
Compilation message
link.cpp: In function 'int main()':
link.cpp:70:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(cnod[i].size() <= K) {
~~~~~~~~~~~~~~~^~~~
link.cpp:77:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while(t < cnod[i].size() + j) {
~~^~~~~~~~~~~~~~~~~~~~
link.cpp:78:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while(t < cnod[i].size() + j && chk[cnod[i][t % cnod[i].size()]]) t++;
~~^~~~~~~~~~~~~~~~~~~~
link.cpp:79:10: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(t == cnod[i].size() + j) break;
~~^~~~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
12 ms |
12152 KB |
Output is correct |
2 |
Correct |
12 ms |
12152 KB |
Output is correct |
3 |
Correct |
13 ms |
12120 KB |
Output is correct |
4 |
Correct |
13 ms |
12220 KB |
Output is correct |
5 |
Incorrect |
13 ms |
12164 KB |
Output isn't correct |
6 |
Correct |
22 ms |
12920 KB |
Output is correct |
7 |
Correct |
26 ms |
13304 KB |
Output is correct |
8 |
Correct |
34 ms |
13928 KB |
Output is correct |
9 |
Correct |
44 ms |
15224 KB |
Output is correct |
10 |
Correct |
44 ms |
14972 KB |
Output is correct |
11 |
Correct |
69 ms |
19576 KB |
Output is correct |
12 |
Correct |
88 ms |
16408 KB |
Output is correct |
13 |
Correct |
296 ms |
18808 KB |
Output is correct |
14 |
Correct |
118 ms |
19704 KB |
Output is correct |
15 |
Correct |
204 ms |
22384 KB |
Output is correct |
16 |
Incorrect |
171 ms |
23416 KB |
Output isn't correct |
17 |
Correct |
440 ms |
24304 KB |
Output is correct |
18 |
Correct |
194 ms |
23732 KB |
Output is correct |
19 |
Correct |
335 ms |
24308 KB |
Output is correct |
20 |
Correct |
419 ms |
24540 KB |
Output is correct |
21 |
Incorrect |
365 ms |
25204 KB |
Output isn't correct |
22 |
Correct |
572 ms |
25328 KB |
Output is correct |
23 |
Correct |
190 ms |
24696 KB |
Output is correct |
24 |
Correct |
263 ms |
25784 KB |
Output is correct |
25 |
Correct |
1182 ms |
25764 KB |
Output is correct |