# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
652135 |
2022-10-21T12:25:45 Z |
ymm |
Pipes (CEOI15_pipes) |
C++17 |
|
2394 ms |
65536 KB |
#include <bits/stdc++.h>
#define Loop(x,l,r) for (ll x = (l); x < (ll)(r); ++x)
#define LoopR(x,l,r) for (ll x = (r)-1; x >= (ll)(l); --x)
typedef long long ll;
typedef std::pair<int, int> pii;
typedef std::pair<ll , ll > pll;
using namespace std;
const int N = 100010;
const int lg = 18;
int sz[N];
int anc[N][lg];
int height[N];
struct edge_node {
int v, e;
int nxt;
} pool[2*N];
int A[N];
int new_edge_node(int v, int e, int a)
{
static int nxt = 1;
pool[nxt].v = v;
pool[nxt].e = e;
pool[nxt].nxt = a;
return nxt++;
}
bool ans[N];
int buf[N];
vector<pii> edges;
int n, m;
void dfs(int v, int p)
{
height[v] = p >= 0? height[p]+1: 0;
anc[v][0] = p;
Loop (i,0,lg-1)
anc[v][i+1] = anc[anc[v][i]][i];
int nd = A[v];
while (nd) {
int u = pool[nd].v;
nd = pool[nd].nxt;
if (u != p)
dfs(u, v);
}
}
int lca(int v, int u)
{
if (height[v] < height[u])
swap(v, u);
int dif = height[v] - height[u];
Loop (i,0,lg) {
if (dif & (1<<i))
v = anc[v][i];
}
if (v == u)
return v;
LoopR (i,0,lg) {
if (anc[v][i] != anc[u][i]) {
v = anc[v][i];
u = anc[u][i];
}
}
return anc[v][0];
}
int flush(int v, int pe)
{
int ans = buf[v];
buf[v] = 0;
int nd = A[v];
while (nd) {
int u = pool[nd].v;
int e = pool[nd].e;
nd = pool[nd].nxt;
if (e != pe)
ans += flush(u, e);
}
if (pe >= 0)
::ans[pe] |= ans;
return ans;
}
int main()
{
cin.tie(0) -> sync_with_stdio(false);
cin >> n >> m;
Loop (i,0,n) {
Loop (j,0,lg)
anc[i][j] = i;
sz[i] = 1;
}
Loop (i,0,m) {
int v, u;
cin >> v >> u;
--v; --u;
if (anc[v][lg-1] == anc[u][lg-1]) {
buf[v] += 1;
buf[u] += 1;
buf[lca(v, u)] -= 2;
} else {
if (sz[anc[v][lg-1]] < sz[anc[u][lg-1]])
swap(v, u);
flush(anc[u][lg-1], -1);
A[v] = new_edge_node(u, edges.size(), A[v]);
A[u] = new_edge_node(v, edges.size(), A[u]);
edges.push_back({v, u});
sz[anc[v][lg-1]] += sz[anc[u][lg-1]];
dfs(u, v);
}
}
Loop (i,0,n)
if (anc[i][lg-1] == i)
flush(i, -1);
Loop (i,0,edges.size()) {
if (!ans[i]) {
cout << edges[i].first+1 << ' ';
cout << edges[i].second+1 << '\n';
}
}
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
340 KB |
Output is correct |
2 |
Correct |
1 ms |
340 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
6 ms |
1020 KB |
Output is correct |
2 |
Correct |
6 ms |
1000 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
146 ms |
932 KB |
Output is correct |
2 |
Correct |
140 ms |
1020 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
282 ms |
1792 KB |
Output is correct |
2 |
Correct |
304 ms |
1824 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
458 ms |
3536 KB |
Output is correct |
2 |
Correct |
367 ms |
4636 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
708 ms |
9072 KB |
Output is correct |
2 |
Correct |
664 ms |
9052 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1136 ms |
10104 KB |
Output is correct |
2 |
Correct |
938 ms |
9968 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1698 ms |
12276 KB |
Output is correct |
2 |
Correct |
1652 ms |
12416 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2086 ms |
12288 KB |
Output is correct |
2 |
Runtime error |
2048 ms |
65152 KB |
Memory limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2394 ms |
11648 KB |
Output is correct |
2 |
Runtime error |
2035 ms |
65536 KB |
Memory limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |