# |
제출 시각 |
아이디 |
문제 |
언어 |
결과 |
실행 시간 |
메모리 |
54826 |
2018-07-05T07:45:59 Z |
김세빈(#1509) |
Pipes (CEOI15_pipes) |
C++11 |
|
1450 ms |
15224 KB |
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
vector <pii> T;
vector <int> V[101010];
int P[101010][17];
int R[101010], K[101010], D[101010], S[101010];
bool chk[101010];
int n, m;
int calc(int p, int r)
{
int ret = K[p];
K[p] = 0;
for(auto t: V[p]){
if(t != r) ret += calc(t, p);
}
if(ret > 0) chk[p] = 1;
return ret;
}
void reorder(int x, int p, int r, int f)
{
int i, c;
D[p] = D[r] + 1; R[p] = x;
c = P[p][0]; P[p][0] = r;
for(i=1;i<17;i++){
P[p][i] = P[P[p][i-1]][i-1];
}
for(auto t: V[p]){
if(t != r){
if(t == c) reorder(x, t, p, chk[p]);
else reorder(x, t, p, 0);
}
}
if(c != r) chk[p] = f;
}
int lca(int a, int b)
{
if(D[a] < D[b]) swap(a, b);
int i;
for(i=0;i<17;i++){
if(D[a] - D[b] & (1<<i)) a = P[a][i];
}
for(i=16;i>=0;i--){
if(P[a][i] != P[b][i]) a = P[a][i], b = P[b][i];
}
return a == b? a : P[a][0];
}
int main()
{
int i, a, b, c;
scanf("%d%d", &n, &m);
for(i=1;i<=n;i++){
S[i] = 1;
R[i] = i;
}
for(i=1;i<=m;i++){
scanf("%d%d", &a, &b);
// c = lca(a, b);
if(R[a] != R[b]){
if(S[R[a]] > S[R[b]]) swap(a, b);
calc(R[a], 0);
V[a].push_back(b);
V[b].push_back(a);
S[R[b]] += S[R[a]];
reorder(R[b], a, b, 0);
}
// else{
// K[c] -= 2;
// K[a] ++, K[b] ++;
// }
}
for(i=1;i<=n;i++){
if(R[i] == i) calc(R[i], 0);
}
for(i=1;i<=n;i++){
if(R[i] != i && !chk[i]) printf("%d %d\n", i, P[i][0]);
}
return 0;
}
Compilation message
pipes.cpp: In function 'int lca(int, int)':
pipes.cpp:56:11: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
if(D[a] - D[b] & (1<<i)) a = P[a][i];
~~~~~^~~~~~
pipes.cpp: In function 'int main()':
pipes.cpp:68:15: warning: unused variable 'c' [-Wunused-variable]
int i, a, b, c;
^
pipes.cpp:70:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d", &n, &m);
~~~~~^~~~~~~~~~~~~~~~
pipes.cpp:78:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d", &a, &b);
~~~~~^~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
3 ms |
2688 KB |
Wrong number of edges |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
9 ms |
3328 KB |
Wrong number of edges |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
114 ms |
3160 KB |
Wrong number of edges |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
201 ms |
3856 KB |
Wrong number of edges |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
325 ms |
5732 KB |
Wrong number of edges |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
488 ms |
11520 KB |
Wrong number of edges |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
729 ms |
12844 KB |
Wrong number of edges |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
976 ms |
15124 KB |
Wrong number of edges |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1210 ms |
15224 KB |
Wrong number of edges |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1450 ms |
14528 KB |
Wrong number of edges |
2 |
Halted |
0 ms |
0 KB |
- |