[关闭]
@994495jj 2017-08-17T11:47:46.000000Z 字数 2159 阅读 830

hdu6133

201708 (ACM)数据结构----树链剖分 (ACM)数据结构----线段树


  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define fi first
  4. #define se second
  5. #define sz(a) (int)a.size()
  6. #define rep(i, a, b) for(int i=(a); i<(b); i++)
  7. #define mp make_pair
  8. #define dd(a) cout<<#a<<" = "<<a<<" "
  9. #define de(a) cout<<#a<<" = "<<a<<endl
  10. #define pb push_back
  11. #define lson l,mid,rt<<1
  12. #define rson mid+1,r,rt<<1|1
  13. typedef long long ll;
  14. typedef pair<int, int> pii;
  15. //----
  16. const int N=100005;
  17. vector<int> G[N];
  18. int n;
  19. int v[N];
  20. pii a[N];
  21. int tim;
  22. int siz[N],top[N],son[N],dep[N],fa[N],tid[N];
  23. void init() {
  24. memset(son,-1,sizeof(son));
  25. tim=0;
  26. }
  27. void dfs1(int u,int pre,int d) {
  28. dep[u]=d;
  29. fa[u]=pre;
  30. siz[u]=1;
  31. rep(i,0,sz(G[u])) {
  32. int v=G[u][i];
  33. if(v!=pre) {
  34. dfs1(v,u,d+1);
  35. siz[u]+=siz[v];
  36. if(son[u]==-1||siz[v]>siz[son[u]]) son[u]=v;
  37. }
  38. }
  39. }
  40. void dfs2(int u,int tp) {
  41. top[u]=tp;
  42. tid[u]=++tim;
  43. if(son[u]==-1) return ;
  44. dfs2(son[u],tp);
  45. rep(i,0,sz(G[u])) {
  46. int v=G[u][i];
  47. if(v!=son[u]&&v!=fa[u]) dfs2(v,v);
  48. }
  49. }
  50. int cc[N<<2];
  51. ll s[N<<2],ss[N<<2];
  52. void build(int l,int r,int rt) {
  53. cc[rt]=s[rt]=ss[rt]=0;
  54. if(l==r) return ;
  55. int mid=(l+r)>>1;
  56. build(lson);build(rson);
  57. }
  58. void DOWN(int rt) {
  59. if(cc[rt]==0) return ;
  60. int L=(rt<<1),R=(rt<<1|1);
  61. s[L]+=s[rt];
  62. s[R]+=s[rt];
  63. ss[L]+=ss[rt]+s[rt]*cc[L];
  64. ss[R]+=ss[rt]+s[rt]*cc[R];
  65. cc[L]+=cc[rt];
  66. cc[R]+=cc[rt];
  67. cc[rt]=s[rt]=ss[rt]=0;
  68. }
  69. void upd(int L,int R,ll c,int l,int r,int rt) {
  70. if(R<l||r<L) return ;
  71. if(L<=l&&r<=R) {
  72. ++cc[rt];
  73. s[rt]+=c;
  74. ss[rt]+=c*cc[rt];
  75. return ;
  76. }
  77. DOWN(rt);
  78. int mid=(l+r)>>1;
  79. upd(L,R,c,lson);upd(L,R,c,rson);
  80. }
  81. ll qry(int p,int l,int r,int rt) {
  82. if(p<l||p>r) return 0;
  83. if(l==r) return ss[rt];
  84. int mid=(l+r)>>1;
  85. DOWN(rt);
  86. return qry(p,lson)+qry(p,rson);
  87. }
  88. int main(){
  89. int T;scanf("%d",&T);
  90. while(T--) {
  91. ///
  92. scanf("%d",&n);
  93. ///init
  94. rep(i,0,n+1) G[i].clear();
  95. init();
  96. build(1,n,1);
  97. ///read
  98. rep(i,1,n+1) {
  99. scanf("%d",v+i);
  100. a[i].fi=-v[i];
  101. a[i].se=i;
  102. }
  103. rep(i,1,n) {
  104. int u,v;scanf("%d%d",&u,&v);
  105. G[u].pb(v);
  106. G[v].pb(u);
  107. }
  108. ///solve
  109. dfs1(1,1,1);
  110. dfs2(1,1);
  111. sort(a+1,a+1+n);
  112. rep(i,1,n+1) {
  113. int val=-a[i].fi;
  114. int ind=a[i].se;
  115. for(;;) {
  116. upd(tid[top[ind]],tid[ind],val,1,n,1);
  117. if(top[ind]==1) break;
  118. ind=fa[top[ind]];
  119. }
  120. }
  121. ///print
  122. rep(i,1,n+1) printf("%lld ",qry(tid[i],1,n,1));
  123. puts("");
  124. }
  125. return 0;
  126. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注