a53

arbori_nr

a53
Nov 2nd, 2019
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.50 KB | None | 0 0
  1. #include <fstream>
  2. #include <vector>
  3. using namespace std;
  4. using VI=vector<int>;
  5. using VVI=vector<VI>;
  6. int n,r;
  7. VVI G;
  8. VI aib,aiblant;
  9. VI rez,lant;
  10.  
  11. void update(int pos,int val)
  12. {
  13. for(int i=pos;i<=n;i+=i&-i)
  14. aib[i]+=val;
  15. }
  16.  
  17. int query(int pos)
  18. {
  19. int sum=0;
  20. for(int i=pos;i>0;i-=i&-i)
  21. sum+=aib[i];
  22. return sum;
  23. }
  24.  
  25. void updatelant(int pos,int val)
  26. {
  27. for(int i=pos;i<=n;i+=i&-i)
  28. aiblant[i]+=val;
  29. }
  30.  
  31. int querylant(int pos)
  32. {
  33. int sum=0;
  34. for(int i=pos;i>0;i-=i&-i)
  35. sum+=aiblant[i];
  36. return sum;
  37. }
  38.  
  39. void dfs1(int node,int dad)
  40. {
  41. update(node,1);
  42. updatelant(node,1);
  43. rez[node]+=query(node-1);
  44. for(int i=0;i<(int) G[node].size();++i)
  45. if(G[node][i]!=dad)
  46. dfs1(G[node][i],node);
  47. updatelant(node,-1);
  48. lant[node]=querylant(node);
  49. }
  50.  
  51. void dfs2(int node,int dad)
  52. {
  53. update(node,1);
  54. rez[node]+=query(node-1);
  55. for(int i=G[node].size()-1;i>=0;--i)
  56. if(G[node][i]!=dad)
  57. dfs2(G[node][i],node);
  58. }
  59.  
  60. int main()
  61. {
  62. ifstream f("arbori_nr.in");
  63. f>>n>>r;
  64. G=VVI(n+1);
  65. rez=VI(n+1);
  66. lant=VI(n+1);
  67. aib=VI(4*n+1);
  68. aiblant=VI(4*n+1);
  69. for(int i=1,x,y;i<n;++i)
  70. f>>x>>y,G[x].push_back(y),G[y].push_back(x);
  71. f.close();
  72. dfs1(r,0);
  73. for(int i=0;i<4*n;++i)
  74. aib[i]=0;
  75. dfs2(r,0);
  76. ofstream g("arbori_nr.out");
  77. for(int i=1;i<=n;++i)
  78. g<<i-rez[i]+lant[i]-1<<' ';
  79. g.close();
  80. return 0;
  81. }
Add Comment
Please, Sign In to add comment