# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
113033 |
2019-05-23T08:18:36 Z |
MAMBA |
Pipes (CEOI15_pipes) |
C++17 |
|
0 ms |
0 KB |
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <bits/stdc++.h>
using namespace std;
#define rep(i , j , k) for (int i = j; i < (int)k; i++)
#define pb push_back
#define mt make_tuple
#define all(x) x.begin(),x.end()
typedef long long ll;
typedef pair<int , int> pii;
typedef pair<ll, ll> pll;
typedef long double ld;
typedef complex<ld> point;
typedef pair<ld , ld> pld;
typedef vector<int> vi;
inline void fileIO(string s) {
// freopen((s + ".in").c_str(), "r", stdin);
freopen((s + ".out").c_str(), "w", stdout);
}
template<class T , class S>
inline bool smin(T &a, S b) { return (T)b < a ? a = b , 1 : 0; }
template<class T , class S>
inline bool smax(T &a, S b) { return a < (T)b ? a = b , 1 : 0; }
constexpr int N = 1e5 + 10;
constexpr int MOD = 1e6 + 7;
template<typename T>
inline T mod(T &v) { return v = (v % MOD + MOD) % MOD; }
template<typename S, typename T>
inline S add(S &l, T r) { return mod(l += r); }
int n, m;
vi adj[N];
int p[N];
int get_par(int v) {
if (p[v])
return p[v] = get_par(p[v]);
return v;
}
inline bool merge(int v, int u) {
v = get_par(v);
u = get_par(u);
if (v == u) return false;
p[v] = u;
return true;
}
bitset<N> mark;
int RMQ[18][N << 1], Tm , st[N], en[N], rev[N], junk[N << 1], ptr;
void dfs(int v, int pa = 0) {
rev[Tm] = v;
junk[ptr++] = Tm;
st[v] = Tm++;
mark[v] = true;
for (auto e : adj[v])
if (e ^ pa) {
dfs(e , v);
junk[ptr++] = st[v];
}
en[v] = Tm;
}
int shit[N << 1];
int rmq(int l , int r) {
int len = r - l;
return min(RMQ[shit[len]][l] , RMQ[shit[len]][j - (1 << shit[len])]);
}
inline int LCA(int v, int u) {
if (st[v] > st[u]) swap(v , u);
if (en[v] >= en[u]) return v;
return rev[rmq(en[v] , st[u])];
}
int val[N];
void dfs2(int v , int pa = 0) {
mark[v] = true;
for (auto e : adj[v])
if (e ^ pa) {
dfs2(e , v);
val[v] += val[e];
}
if (val[v] == 1)
cout << v << ' ' << pa << '\n';
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int local = 0;
rep(i , 1 , N << 1) {
shit[i] = local;
if (i == (1 << (local + 1)))
local++;
}
#ifndef LOCAL
//fileIO("superposition");
#endif
cin >> n >> m;
rep(i , 0 , m)
{
int u , v;
cin >> u >> v;
if (merge(u , v)) {
adj[u].pb(v);
adj[v].pb(u);
}
}
st[0] = -1;
rep(i , 1 , n + 1)
if (!mark[i])
dfs(i);
en[0] = Tm;
rep(i , 0 , ptr)
RMQ[0][i] = junk[i];
rep(i , 1 , 18)
rep(j , 0 , ptr) {
RMQ[i][j] = RMQ[i - 1][j];
if (j + (1 << (i - 1)) < ptr)
smin(RMQ[i][j] , RMQ[i - 1][j + (1 << (i - 1))]);
}
cin.seekg(0);
cin >> n >> m;
rep(i , 0 , m) {
int u , v;
cin >> u >> v;
int lca = LCA(u , v);
if (lca == u || lca == v) {
val[u ^ v ^ lca]++;
val[lca]--;
}
else {
val[u]++;
val[v]++;
val[lca] -= 2;
}
}
mark.reset();
rep(i , 1 , n + 1)
if (!mark[i])
dfs2(i);
return 0;
}
Compilation message
pipes.cpp: In function 'int rmq(int, int)':
pipes.cpp:78:53: error: 'j' was not declared in this scope
return min(RMQ[shit[len]][l] , RMQ[shit[len]][j - (1 << shit[len])]);
^