Advertisement
Guest User

Untitled

a guest
May 8th, 2014
365
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.32 KB | None | 0 0
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<algorithm>
  4. #include<set>
  5. #include<map>
  6. #include<queue>
  7. #include<stack>
  8. #include<deque>
  9. #include<vector>
  10. #include<string>
  11. #include<math.h>
  12. using namespace std;
  13.  
  14. #define INF 1000000000
  15. #define lint long long
  16. #define pb push_back
  17. #define mp make_pair
  18. #define MOD 1000000007
  19.  
  20. vector <int> g[100005];
  21. int m;
  22.  
  23. int dfs(int v,int k)
  24. {
  25. int i;
  26. int sum=1,cnt=0;
  27. multiset <int> s;
  28. for(i=0;i<g[v].size();++i)
  29. {
  30. int to=g[v][i];
  31. int cur=dfs(to,k);
  32. s.insert(cur);
  33. sum+=cur;
  34. ++cnt;
  35. while(cnt>k)
  36. {
  37. sum-=*s.begin();
  38. s.erase(s.begin());
  39. --cnt;
  40. }
  41. }
  42. return sum;
  43. }
  44.  
  45. int check(int f)
  46. {
  47. if(dfs(1,f)>=m)return 1;
  48. return 0;
  49. }
  50. int main()
  51. {
  52. int n,i,j,x;
  53. scanf("%d %d",&n,&m);
  54. for(i=2;i<=n;++i)
  55. {
  56. scanf("%d",&x);
  57. g[x].pb(i);
  58. }
  59. if(check(0))
  60. {
  61. cout<<0;
  62. return 0;
  63. }
  64. int l=0,r=n+1;
  65. while(r-l>3)
  66. {
  67. int mid=(r+l)/2;
  68. if(check(mid))
  69. {
  70. r=mid;
  71. }
  72. else l=mid;
  73. }
  74. for(i=l;i<=r;++i)
  75. {
  76. if(check(i))
  77. {
  78. cout<<i;
  79. return 0;
  80. }
  81. }
  82. return 0;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement