Advertisement
artemgf

Война Уго II

Jan 20th, 2018
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.22 KB | None | 0 0
  1. #define _USE_MATH_DEFINES
  2. #include <iostream>
  3. #include <string>
  4. #include <map>
  5. #include <set>
  6. #include <algorithm>
  7. #include <vector>
  8. #include <stdio.h>
  9. #include <cmath>
  10. #include <math.h>
  11. #include <queue>
  12. #include <stack>
  13. #include <climits>
  14. #include <deque>
  15. #include <ctime>
  16.  
  17. using namespace std;
  18.  
  19. typedef long long ll;
  20. typedef unsigned long long ull;
  21. typedef unsigned int ui;
  22.  
  23. #define mh() make_heap()
  24. #define poph() pop_heap()
  25. #define pushh() push_heap()
  26. #define sor(n) n.begin(), n.end()
  27. #define rsor(n) n.rbegin(), n.rend()
  28. #define mp make_pair
  29. #define files freopen("input.txt", "rt", stdin); freopen("output.txt", "wt", stdout)
  30. #define p(T) pair<T,T>
  31. #define znac(l) abs(l)/l
  32. const ll ok = ll(1e9 + 7);
  33.  
  34. /*struct top
  35. {
  36.     vector<top *>next;
  37.     ll nm, t;
  38. };
  39.  
  40. top* nwtp(ll nm, ll t)
  41. {
  42.     top* ntp = new top();
  43.     ntp->nm = nm;
  44.     ntp->t = t;
  45.     return ntp;
  46. }
  47.  
  48. void addtree(top* cor, ll nm, ll t, ll vas)
  49. {
  50.     if (cor->nm != vas)
  51.     {
  52.         if (cor->next.size() != 0)
  53.             for (int i = 0; i < cor->next.size(); i++)
  54.             {
  55.                 addtree(cor->next[i], nm, t, vas);
  56.             }
  57.     }
  58.     else
  59.     {
  60.         cor->next.push_back(nwtp(nm, t));
  61.     }
  62. }*/
  63. vector<p(ll)>tree[10200];
  64. ll vas[10200];
  65. double chk(double x, ll v)
  66. {
  67.     if (tree[v].size() != 0)
  68.     {
  69.         vector<ll>p;
  70.         for (int i = 0; i < tree[v].size(); i++)
  71.         {
  72.             p.push_back(chk(x, tree[v][i].first));
  73.         }
  74.         sort(sor(p));
  75.         double mayb = double(tree[v].size()) / 100.0;
  76.         mayb = mayb*x;
  77.         ll sc = 0;
  78.         if (mayb - int(mayb) >= 1e-9)
  79.         {
  80.             sc = ll(mayb) + 1;
  81.         }
  82.         else
  83.         {
  84.             sc = ll(mayb);
  85.         }
  86.         ll t = -1;
  87.         for (int i = 0; i < sc; i++)
  88.         {
  89.             t = max(t,p[i]);
  90.         }
  91.         t += vas[v];
  92.         return t;
  93.     }
  94.     else
  95.         return vas[v];
  96. }
  97.  
  98. double binpos(ll v, ll t)
  99. {
  100.     double r = 1000000;
  101.     double l = 0;
  102.     while (r-l>=1)
  103.     {
  104.         double tm = (l + r) / 2;
  105.         double ty = chk(tm / 10000.0, v);
  106.         if (ty > t)
  107.         {
  108.             r = tm;
  109.         }
  110.         else
  111.         {
  112.             l = tm;
  113.         }
  114.     }
  115.     return ll(r);
  116. }
  117.  
  118. int main()
  119. {
  120. #ifndef ONLINE_JUDGE
  121.     files;
  122. #endif
  123.     ll n, t;
  124.     cin >> n >> t;
  125.     ll prvas, prt;
  126.     vas[1] = 0;
  127.     for (int i = 2; i <= n; i++)
  128.     {
  129.         cin >> prvas >> prt;
  130.         tree[prvas].push_back({ i,prt });
  131.         vas[i] = prt;
  132.     }
  133.     double x = binpos(1, t);
  134.     x /= 10000.0;
  135.     printf("%.10lf", x);
  136.     return 0;
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement