Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define all(x) x.begin(), x.end()
- #define ll long long
- #define ld long double
- #define pb push_back
- #define endl '\n'
- #define ff first
- #define mp make_pair
- #define ss second
- #define ull unsigned long long
- #define YES cout << "YES" << endl;
- #define NO cout << "NO" << endl;
- #define ulongmax 18446744073709551615
- #define pll pair<ll,ll>
- using namespace std;
- ll maxn = -1e18;
- ll minn = 1e18;
- ll mod = 1e9 + 7;
- const int maxx = 2e5 + 5;
- const int base = 311;
- vector<ll> node[maxx];
- pair<ll,ll> a[maxx];
- ll dp[maxx][20], dep[maxx];
- map<ll,map<ll,ll>> mem;
- stack<ll> s;
- ll pa[maxx];
- bool flag;
- void dfs(ll u, ll par){
- for (int i = 1; i < 20; i++){
- dp[u][i] = dp[dp[u][i - 1]][i - 1];
- }
- for (auto j :node[u]){
- if (j != par){
- dep[j] = dep[u] + 1;
- dp[j][0] = u;
- pa[j] = u;
- dfs(j, u);
- }
- }
- }
- ll lca(ll u, ll v){
- if (dep[u] > dep[v]) swap(u, v);
- ll d = dep[v] - dep[u];
- for (int i = 0; i < 20; i++){
- if (d >> i & 1){
- v = dp[v][i];
- }
- }
- if (u == v) return u;
- for (int i = 19; i >= 0; i--){
- if (dp[u][i] != dp[v][i]){
- u = dp[u][i];
- v = dp[v][i];
- }
- }
- return dp[u][0];
- }
- ll dt(ll x, ll y){
- return dep[x] + dep[y] - 2 * dep[lca(x, y)];
- }
- bool cmp(pair<ll,ll> x, pair<ll,ll> y){
- if (lca(x.ff, x.ss) == lca(y.ff, y.ss)) {
- if (lca(x.ff, x.ss) == x.ff || lca(x.ff, x.ss) == x.ss) return true;
- if (lca(y.ff, y.ss) == y.ff || lca(y.ff, y.ss) == y.ss) return false;
- return dt(x.ff, x.ss) < dt(y.ff, y.ss);
- }
- return dep[lca(x.ff, x.ss)] > dep[lca(y.ff, y.ss)];
- }
- int main(){
- ios_base::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- //freopen("HACK.TXT","r",stdin);
- //freopen(".INP","r",stdin);
- //freopen(".OUT","w",stdout);
- //freopen("HACK.TXT","w",stdout);
- ll n, m;
- cin >> n >> m;
- for (int i = 1; i < n; i++){
- ll x, y;
- cin >> x >> y;
- node[x].pb(y);
- node[y].pb(x);
- }
- dfs(1, 0);
- for (int i = 1; i <= m; i++){
- cin >> a[i].ff >> a[i].ss;
- }
- sort(a + 1, a + m + 1, cmp);
- ll ans = 0;
- for (int i = 1; i <= m; i++) {
- flag = true;
- if (dep[a[i].ff] > dep[a[i].ss])swap(a[i].ff, a[i].ss);
- ll x = a[i].ff, y = a[i].ss, z = lca(a[i].ff, a[i].ss);
- vector<ll> b, c;
- b.clear(), c.clear();
- while (true){
- b.pb(x);
- if (x == z) break;
- x = pa[x];
- }
- while (true){
- if (y == z) break;
- c.pb(y);
- y = pa[y];
- }
- reverse(all(c));
- for (auto j : c) b.pb(j);
- //for (auto j : b) cout << j << " ";
- //cout << endl;
- for (int j = 1; j < b.size(); j++){
- if (mem[b[j]][b[j - 1]] == 1) {
- flag = false;
- break;
- }
- }
- if (flag == true){
- ans++;
- for (int j = 1; j < b.size(); j++){
- mem[b[j]][b[j - 1]] = 1;
- mem[b[j - 1]][b[j]] = 1;
- }
- }
- }
- cout << ans;
- }
Add Comment
Please, Sign In to add comment