# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
153172 | Mercenary | Pipes (CEOI15_pipes) | C++14 | 4709 ms | 14888 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/trie_policy.hpp>
#define pb push_back
#define mp make_pair
#define taskname "A"
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> ii;
typedef tree <int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set;
const int maxn = 1e5 + 5;
const int logn = log2(maxn) + 1;
int n , m , nEdge = 0;
int P[maxn][logn];
int lab[maxn] , h[maxn] , dp[maxn];
vector<int> adj[maxn];
bitset<6000000 + 5> checked;
void Read(int & x){
char ch;
x = 0;
for(ch = getchar() ; ch > '9' && ch < '0' ; ch = getchar());
for( ; ch <= '9' && ch >= '0' ; ch = getchar())x = x * 10 + ch - '0';
}
int FindLab(int u){
return lab[u] < 0 ? u : lab[u] = FindLab(lab[u]);
}
void BuildLCA(int u , int par){
P[u][0] = par;
for(int i = 1 ; i < logn && P[u][i - 1] ; ++i){
P[u][i] = P[P[u][i - 1]][i - 1];
}
}
void dfs(int u , int par){
for(int c : adj[u]){
if(par != c){
h[c] = h[u] + 1;
BuildLCA(c , u);
dfs(c , u);
}
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
if(fopen(taskname".INP","r")){
freopen(taskname".INP", "r",stdin);
freopen(taskname".OUT", "w",stdout);
}
fill_n(lab,maxn,-1);
// cin >> n >> m;
Read(n);Read(m);
for(int u , v , s , t , i = 1 ; i <= m ; ++i){
// cin >> u >> v;
Read(u);Read(v);
s = FindLab(u);
t = FindLab(v);
if(s != t){
if(lab[s] > lab[t])swap(s , t) , swap(u , v);
lab[s] += lab[t];
lab[t] = s;
adj[u].pb(v);
adj[v].pb(u);
checked[i] = 1;
}
}
for(int i = 1 ; i <= n ; ++i){
if(h[i] == 0){
h[i] = 1;
dfs(i , 0);
}
}
rewind(stdin);
// cin >> n >> m;
Read(n);Read(m);
for(int u , v , s , t , i = 1 ; i <= m ; ++i){
// cin >> u >> v;
Read(u);Read(v);
if(checked[i])continue;
auto lca = [&](int u , int v){
if(h[u] < h[v])swap(u , v);
for(int i = 0 ; i < logn && h[u] != h[v] ; ++i){
if((h[u] - h[v]) & (1 << i))u = P[u][i];
}
if(u == v)return u;
for(int i = logn - 1 ; i >= 0 ; --i){
if(P[u][i] != P[v][i])u = P[u][i] , v = P[v][i];
}
return P[u][0];
};
dp[u]++;dp[v]++;
dp[lca(u,v)] -= 2;
}
fill_n(h,maxn,0);
for(int i = 1 ; i <= n ; ++i){
if(h[i] == 0){
h[i] = 1;
function<void(int,int)> dfs = [&](int u , int par){
for(int v : adj[u]){
if(v != par){
h[v] = h[u] + 1;
dfs(v , u);
dp[u] += dp[v];
if(dp[v] == 0)cout << u << " " << v << '\n';
}
}
};
dfs(i , i);
}
}
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |