Guest User

Untitled

a guest
Feb 19th, 2020
251
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.89 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define all(x) x.begin(), x.end()
  3. #define ll long long
  4. #define ld long double
  5. #define pb push_back
  6. #define endl '\n'
  7. #define ff first
  8. #define mp make_pair
  9. #define ss second
  10. #define ull unsigned long long
  11. #define YES cout << "YES" << endl;
  12. #define NO cout << "NO" << endl;
  13. #define ulongmax 18446744073709551615
  14. #define pll pair<ll,ll>
  15. using namespace std;
  16.  
  17. ll maxn = -1e18;
  18. ll minn = 1e18;
  19. ll mod = 1e9 + 7;
  20. const int maxx = 2e5 + 5;
  21. const int base = 311;
  22. vector<ll> node[maxx];
  23. pair<ll,ll> a[maxx];
  24. ll dp[maxx][20], dep[maxx];
  25. map<ll,map<ll,ll>> mem;
  26. stack<ll> s;
  27. ll pa[maxx];
  28. bool flag;
  29. void dfs(ll u, ll par){
  30.         for (int i = 1; i < 20; i++){
  31.                 dp[u][i] = dp[dp[u][i - 1]][i - 1];
  32.         }
  33.         for (auto j :node[u]){
  34.                 if (j != par){
  35.                         dep[j] = dep[u] + 1;
  36.                         dp[j][0] = u;
  37.                         pa[j] = u;
  38.                         dfs(j, u);
  39.                 }
  40.         }
  41. }
  42. ll lca(ll u, ll v){
  43.         if (dep[u] > dep[v]) swap(u, v);
  44.         ll d = dep[v] - dep[u];
  45.         for (int i = 0; i < 20; i++){
  46.                 if (d >> i & 1){
  47.                         v = dp[v][i];
  48.                 }
  49.         }
  50.         if (u == v) return u;
  51.         for (int i = 19; i >= 0; i--){
  52.                 if (dp[u][i] != dp[v][i]){
  53.                         u = dp[u][i];
  54.                         v = dp[v][i];
  55.                 }
  56.         }
  57.         return dp[u][0];
  58. }
  59. ll dt(ll x, ll y){
  60.         return dep[x] + dep[y] - 2 * dep[lca(x, y)];
  61. }
  62. bool cmp(pair<ll,ll> x, pair<ll,ll> y){
  63.         if (lca(x.ff, x.ss) == lca(y.ff, y.ss)) {
  64.                 if (lca(x.ff, x.ss) == x.ff || lca(x.ff, x.ss) == x.ss) return true;
  65.                 if (lca(y.ff, y.ss) == y.ff || lca(y.ff, y.ss) == y.ss) return false;
  66.                 return dt(x.ff, x.ss) < dt(y.ff, y.ss);
  67.         }
  68.         return dep[lca(x.ff, x.ss)] > dep[lca(y.ff, y.ss)];
  69. }
  70. int main(){
  71.         ios_base::sync_with_stdio(false);
  72.         cin.tie(0);
  73.         cout.tie(0);
  74.         //freopen("HACK.TXT","r",stdin);
  75.         //freopen(".INP","r",stdin);
  76.         //freopen(".OUT","w",stdout);
  77.         //freopen("HACK.TXT","w",stdout);
  78.         ll n, m;
  79.         cin >> n >> m;
  80.         for (int i = 1; i < n; i++){
  81.                 ll x, y;
  82.                 cin >> x >> y;
  83.                 node[x].pb(y);
  84.                 node[y].pb(x);
  85.         }
  86.         dfs(1, 0);
  87.         for (int i = 1; i <= m; i++){
  88.                 cin >> a[i].ff >> a[i].ss;
  89.         }
  90.         sort(a + 1, a + m + 1, cmp);
  91.         ll ans = 0;
  92.         for (int i = 1; i <= m; i++) {
  93.                 flag = true;
  94.                 if (dep[a[i].ff] > dep[a[i].ss])swap(a[i].ff, a[i].ss);
  95.                 ll x = a[i].ff, y = a[i].ss, z = lca(a[i].ff, a[i].ss);
  96.                 vector<ll> b, c;
  97.                 b.clear(), c.clear();
  98.                 while (true){
  99.                         b.pb(x);
  100.                         if (x == z) break;
  101.                         x = pa[x];
  102.                 }
  103.                 while (true){
  104.                         if (y == z) break;
  105.                         c.pb(y);
  106.                         y = pa[y];
  107.                 }
  108.                 reverse(all(c));
  109.                 for (auto j : c) b.pb(j);
  110.                 //for (auto j : b) cout << j << " ";
  111.                 //cout << endl;
  112.                 for (int j = 1; j < b.size(); j++){
  113.                         if (mem[b[j]][b[j - 1]] == 1) {
  114.                                 flag = false;
  115.                                 break;
  116.                         }
  117.                 }
  118.                 if (flag == true){
  119.                         ans++;
  120.                         for (int j = 1; j < b.size(); j++){
  121.                                 mem[b[j]][b[j - 1]] = 1;
  122.                                 mem[b[j - 1]][b[j]] = 1;
  123.                         }
  124.                 }
  125.         }
  126.         cout << ans;
  127. }
Add Comment
Please, Sign In to add comment