Advertisement
Guest User

Untitled

a guest
Jun 10th, 2016
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.84 KB | None | 0 0
  1. #pragma comment(linker, "/STACK:512000000")
  2. #define _CRT_SECURE_NO_WARNINGS
  3. //#include "testlib.h"
  4. #include <cstdio>
  5. #include <cassert>
  6. #include <algorithm>
  7. #include <iostream>
  8. #include <memory.h>
  9. #include <string>
  10. #include <vector>
  11. #include <set>
  12. #include <map>
  13. #include <cmath>
  14. #include <bitset>
  15. #include <deque>
  16. #include <ctime>
  17. #include <stack>
  18. #include <queue>
  19. #include <fstream>
  20. #include <sstream>
  21. //#include <unordered_map>
  22. using namespace std;
  23. //#define FILENAME ""
  24. #define mp make_pair
  25. #define all(a) a.begin(), a.end()
  26. typedef long long li;
  27. typedef long double ld;
  28. void solve();
  29. void precalc();
  30. clock_t start;
  31. //int timer = 1;
  32.  
  33. int testNumber = 1;
  34.  
  35. bool todo = true;
  36.  
  37. int main() {
  38. #ifdef room111
  39.     freopen("in.txt", "r", stdin);
  40.     //freopen("out.txt", "w", stdout);
  41. #else
  42.     //freopen("input.txt", "r", stdin);
  43.     //freopen("output.txt", "w", stdout);
  44.     //freopen(FILENAME".in", "r", stdin);
  45.     //freopen(FILENAME ".out", "w", stdout);
  46. #endif
  47.     start = clock();
  48.     int t = 1;
  49.     cout.sync_with_stdio(0);
  50.     cin.tie(0);
  51.     precalc();
  52.     cout.precision(10);
  53.     cout << fixed;
  54.     //cin >> t;
  55.     int testNum = 1;
  56.     while (t--) {
  57.         //cerr << testNum << endl;
  58.         //cout << "Case #" << testNum++ << ": ";
  59.         solve();
  60.         ++testNumber;
  61.         //++timer;
  62.     }
  63.  
  64. #ifdef room111
  65.     cerr << "\n\n" << (clock() - start) / 1.0 / CLOCKS_PER_SEC << "\n\n";
  66. #endif
  67.  
  68.     return 0;
  69. }
  70.  
  71. //BE CAREFUL: IS INT REALLY INT?
  72.  
  73. //#define int li
  74.  
  75. /*int pr[] = { 97, 2011 };
  76. int mods[] = { 1000000007, 1000000009 };
  77.  
  78. const int C = 300500;
  79. int powers[2][C];*/
  80.  
  81. //int MOD = 1000000007;
  82.  
  83. //int c[5010][5010];
  84.  
  85. template<typename T>
  86. T binpow(T q, T w, T mod) {
  87.     if (!w)
  88.         return 1 % mod;
  89.     if (w & 1)
  90.         return q * 1LL * binpow(q, w - 1, mod) % mod;
  91.     return binpow(q * 1LL * q % mod, w / 2, mod);
  92. }
  93.  
  94. /*int curMod = 1000000009;
  95.  
  96. int fact[100500], revfact[100500];
  97.  
  98. int getC(int n, int k) {
  99. int res = fact[n] * revfact[n - k] % curMod * revfact[k] % curMod;
  100. return res;
  101. }*/
  102.  
  103. /*const int C = 7000500;
  104.  
  105. int least_prime[C];*/
  106.  
  107. void precalc() {
  108.    
  109.     /*for (int i = 2; i < C; ++i) {
  110.     if (!least_prime[i]) {
  111.     least_prime[i] = i;
  112.     for (li j = i * 1LL * i; j < C; j += i) {
  113.     least_prime[j] = i;
  114.     }
  115.     }
  116.     }*/
  117.  
  118.     /*fact[0] = revfact[0] = 1;
  119.     for (int i = 1; i < 100500; ++i) {
  120.     fact[i] = fact[i - 1] * i % curMod;
  121.     revfact[i] = binpow(fact[i], curMod - 2, curMod);
  122.     }*/
  123.  
  124.     /*for (int w = 0; w < 2; ++w) {
  125.     powers[w][0] = 1;
  126.     for (int j = 1; j < C; ++j) {
  127.     powers[w][j] = (powers[w][j - 1] * 1LL * pr[w]) % mods[w];
  128.     }
  129.     }*/
  130.     /*for (int i = 0; i < 5010; ++i) {
  131.     c[i][i] = c[i][0] = 1;
  132.     for (int j = 1; j < i; ++j) {
  133.     c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % MOD;
  134.     }
  135.     }*/
  136. }
  137.  
  138. template<typename T>
  139. T gcd(T q, T w) {
  140.     while (w) {
  141.         q %= w;
  142.         swap(q, w);
  143.     }
  144.     return q;
  145. }
  146. template<typename T>
  147. T lcm(T q, T w) {
  148.     return q / gcd(q, w) * w;
  149. }
  150.  
  151. //#define int li
  152.  
  153. //const int mod = 1000000007;
  154. class Treap {
  155. public:
  156.     typedef struct _node {
  157.         int key;
  158.         int cnt;
  159.         int prior;
  160.         _node* l;
  161.         _node* r;
  162.         _node(int key) :key(key), l(nullptr), r(nullptr), cnt(1) { prior = (rand() << 16) | rand(); }
  163.  
  164.         void push() {
  165.  
  166.         }
  167.  
  168.         void recalc() {
  169.             cnt = 1 + Cnt(l) + Cnt(r);
  170.         }
  171.  
  172.         static int Cnt(_node* v) {
  173.             if (!v)
  174.                 return 0;
  175.             return v->cnt;
  176.         }
  177.     }*node;
  178.  
  179.     static int Cnt(node v) {
  180.         if (!v)
  181.             return 0;
  182.         return v->cnt;
  183.     }
  184.  
  185.     node root;
  186.  
  187.     node merge(node l, node r) {
  188.         if (!l)
  189.             return r;
  190.         if (!r)
  191.             return l;
  192.         if (l->prior < r->prior) {
  193.             l->push();
  194.             l->r = merge(l->r, r);
  195.             l->recalc();
  196.             return l;
  197.         }
  198.         else {
  199.             r->push();
  200.             r->l = merge(l, r->l);
  201.             r->recalc();
  202.             return r;
  203.         }
  204.     }
  205.  
  206.     void split(node v, int key, node& l, node& r) {
  207.         l = r = nullptr;
  208.         if (!v)
  209.             return;
  210.         v->push();
  211.         if (v->key < key) {
  212.             l = v;
  213.             split(l->r, key, l->r, r);
  214.             l->recalc();
  215.         }
  216.         else {
  217.             r = v;
  218.             split(r->l, key, l, r->l);
  219.             r->recalc();
  220.         }
  221.     }
  222.  
  223.     void splitCnt(node v, int idx, node& l, node& r) {
  224.         l = r = nullptr;
  225.         if (!v)
  226.             return;
  227.         v->push();
  228.         if (Cnt(v->l) < idx) {
  229.             l = v;
  230.             splitCnt(l->r, idx - Cnt(v->l) - 1, l->r, r);
  231.             l->recalc();
  232.         }
  233.         else {
  234.             r = v;
  235.             splitCnt(r->l, idx, l, r->l);
  236.             r->recalc();
  237.         }
  238.     }
  239.  
  240. public:
  241.     Treap() {
  242.         root = nullptr;
  243.     }
  244.  
  245.     size_t size() const {
  246.         return Cnt(root);
  247.     }
  248.  
  249.     int get_before(int L) {
  250.         node l, r;
  251.         split(root, L, l, r);
  252.         int res = Cnt(l);
  253.         root = merge(l, r);
  254.         return res;
  255.     }
  256.  
  257.     node erase_min() {
  258.         node l, r;
  259.         splitCnt(root, 1, l, r);
  260.         root = r;
  261.         return l;
  262.     }
  263.  
  264.     void insert(int key) {
  265.         node l = nullptr, r = nullptr;
  266.         split(root, key, l, r);
  267.         node cur_node = new _node(key);
  268.         root = merge(merge(l, cur_node), r);
  269.     }
  270.  
  271.     void insert(node v) {
  272.         node l = nullptr, r = nullptr;
  273.         split(root, v->key, l, r);
  274.         root = merge(merge(l, v), r);
  275.     }
  276.  
  277.     void merge(Treap cur) {
  278.         while (cur.size() > 0) {
  279.             node now = cur.erase_min();
  280.             now->cnt = 1;
  281.             now->l = now->r = nullptr;
  282.             insert(now);
  283.         }
  284.     }
  285.  
  286. };
  287.  
  288. typedef Treap::node Node;
  289.  
  290. vector<vector<int>> g;
  291. vector<int> a;
  292.  
  293. vector<int> down_more, up_more;
  294. vector<vector<int>> nei_more;
  295. vector<li> sum_down;
  296.  
  297. Treap dfs(int v, int p) {
  298.     sum_down[v] = 0;
  299.     int pref = 0;
  300.     Treap res;
  301.     for (int i = 0; i < g[v].size(); ++i) {
  302.         int to = g[v][i];
  303.         if (to == p) {
  304.             continue;
  305.         }
  306.         Treap nex = dfs(to, v);
  307.         if (nex.size() > res.size()) {
  308.             swap(nex, res);
  309.         }
  310.         res.merge(nex);
  311.         sum_down[v] += sum_down[to];
  312.         int cur = res.get_before(a[v]);
  313.         nei_more[v][i] = cur - pref;
  314.         pref = cur;
  315.     }
  316.     down_more[v] = res.get_before(a[v]);
  317.     sum_down[v] += down_more[v];
  318.     res.insert(a[v]);
  319.     return res;
  320. }
  321.  
  322. li best_sum = 1e18;
  323. int best_v = -1;
  324.  
  325. void dfs_res(int v, int p, li sum_up) {
  326.     li cur_res = sum_down[v] + sum_up + up_more[v];
  327.     if (cur_res < best_sum || cur_res == best_sum && best_v > v) {
  328.         best_sum = cur_res;
  329.         best_v = v;
  330.     }
  331.     for (int i = 0; i < g[v].size(); ++i) {
  332.         int to = g[v][i];
  333.         if (to == p) {
  334.             continue;
  335.         }
  336.         li new_up = sum_up + up_more[v] + sum_down[v] - sum_down[to] - nei_more[v][i];
  337.         dfs_res(to, v, new_up);
  338.     }
  339. }
  340.  
  341. void solve() {
  342.     int n;
  343.     n = 200000;
  344.     cin >> n;
  345.     g.resize(n);
  346.     a.resize(n);
  347.     for (int i = 0; i < n; ++i) {
  348.         cin >> a[i];
  349.         //a[i] = i + 1;
  350.         a[i] = n - a[i];
  351.     }
  352.     for (int i = 1; i < n; ++i) {
  353.         int u, v;
  354.         //u = (i + 1) / 2; v = i + 1;
  355.         cin >> u >> v;
  356.         --u; --v;
  357.         g[u].push_back(v);
  358.         g[v].push_back(u);
  359.     }
  360.     down_more.resize(n);
  361.     up_more.resize(n);
  362.     sum_down.resize(n);
  363.     nei_more.resize(n);
  364.     for (int i = 0; i < n; ++i) {
  365.         nei_more[i].assign(g[i].size(), -1);
  366.     }
  367.  
  368.     Treap tree = dfs(0, 0);
  369.     for (int i = 0; i < n; ++i) {
  370.         up_more[i] = tree.get_before(a[i]) - down_more[i];
  371.         for (int j = 0; j < g[i].size(); ++j) {
  372.             if (nei_more[i][j] == -1) {
  373.                 nei_more[i][j] = up_more[i];
  374.             }
  375.         }
  376.     }
  377.  
  378.     dfs_res(0, 0, 0);
  379.  
  380.     cout << best_v + 1 << ' ' << best_sum << "\n";
  381. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement