题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3572

题意:给出一棵树。若干询问。每个询问给出m个点,输出每个点管辖的点的个数。x被y管辖(y在给出的m个点中)是说不存在其他的m个点中的点yy,使得pair<dis(x,yy),yy>   <  pair<dis(x,y),y>。

思路:建立虚树。

  1. const int INF=100000005;
  2. const int N=333333;
  3.  
  4. vector<int> gg[N];
  5. int f[N][20];
  6. int dep[N];
  7. int n,m;
  8.  
  9. int id;
  10. int dfn[N];
  11. int size[N];
  12.  
  13. void DFS(int u,int pre,int d)
  14. {
  15. dep[u]=d;
  16. f[u][0]=pre;
  17. dfn[u]=++id;
  18. size[u]=1;
  19. int i;
  20. for(i=0;i<SZ(gg[u]);i++)
  21. {
  22. int v=gg[u][i];
  23. if(v!=pre) DFS(v,u,d+1),size[u]+=size[v];
  24. }
  25. }
  26.  
  27. int getLca(int u,int v)
  28. {
  29. if(dep[u]<dep[v]) swap(u,v);
  30. int x=dep[u]-dep[v];
  31. int i;
  32. for(i=0;i<20;i++) if(x&(1<<i)) u=f[u][i];
  33. if(u==v) return u;
  34. for(i=19;i>=0;i--) if(f[u][i]&&f[v][i]&&f[u][i]!=f[v][i])
  35. {
  36. u=f[u][i];
  37. v=f[v][i];
  38. }
  39. return f[u][0];
  40. }
  41.  
  42. int get(int u,int d)
  43. {
  44. int i;
  45. for(i=19;i>=0;i--) if(dep[f[u][i]]>=d) u=f[u][i];
  46. return u;
  47. }
  48.  
  49. pair<int,int> g[N];
  50. int tot,a[N],b[N];
  51.  
  52. int ans[N];
  53.  
  54. int st[N];
  55.  
  56. int cmp(int x,int y)
  57. {
  58. return dfn[x]<dfn[y];
  59. }
  60.  
  61. int fa[N];
  62.  
  63. void init()
  64. {
  65. sort(a+1,a+m+1,cmp);
  66. int top=0;
  67. int i;
  68. for(i=1;i<=m;i++)
  69. {
  70. int u=a[i];
  71. if(!top) fa[st[++top]=u]=0;
  72. else
  73. {
  74. int lca=getLca(st[top],u);
  75. while(dep[st[top]]>dep[lca])
  76. {
  77. if(dep[st[top-1]]<=dep[lca]) fa[st[top]]=lca;
  78. top--;
  79. }
  80. if(st[top]!=lca)
  81. {
  82. a[++tot]=lca;
  83. g[lca]=MP(INF,0);
  84. fa[lca]=st[top];
  85. st[++top]=lca;
  86. }
  87. fa[u]=lca;
  88. st[++top]=u;
  89. }
  90. }
  91. }
  92.  
  93. int dis[N];
  94. int tmp[N];
  95.  
  96. void cal()
  97. {
  98. sort(a+1,a+tot+1,cmp);
  99. int i;
  100. for(i=1;i<=tot;i++)
  101. {
  102. int u=a[i];
  103. tmp[u]=size[u];
  104. if(i>1) dis[u]=dep[u]-dep[fa[u]];
  105. }
  106. for(i=tot;i>1;i--)
  107. {
  108. int u=a[i],pre=fa[u];
  109. g[pre]=min(g[pre],MP(g[u].first+dis[u],g[u].second));
  110. }
  111.  
  112. for(i=2;i<=tot;i++)
  113. {
  114. int u=a[i],pre=fa[u];
  115. g[u]=min(g[u],MP(g[pre].first+dis[u],g[pre].second));
  116. }
  117.  
  118. for(i=1;i<=tot;i++)
  119. {
  120. int u=a[i],pre=fa[u];
  121. if(i==1) ans[g[u].second]+=n-size[u];
  122. else
  123. {
  124. int x=get(u,dep[pre]+1);
  125. int sum=size[x]-size[u];
  126. tmp[pre]-=size[x];
  127. if(g[pre].second==g[u].second) ans[g[u].second]+=sum;
  128. else
  129. {
  130. int xx=g[pre].first+g[u].first+dis[u];
  131. int M=dep[u]-(xx/2-g[u].first);
  132. if(xx%2==0&&g[u].second>g[pre].second) M++;
  133. int y=size[get(u,M)]-size[u];
  134. ans[g[u].second]+=y;
  135. ans[g[pre].second]+=sum-y;
  136. }
  137. }
  138. }
  139. for(i=1;i<=tot;i++) ans[g[a[i]].second]+=tmp[a[i]];
  140. }
  141.  
  142. int main()
  143. {
  144.  
  145. scanf("%d",&n);
  146. int i;
  147. for(i=1;i<n;i++)
  148. {
  149. int x,y;
  150. scanf("%d%d",&x,&y);
  151. gg[x].pb(y);
  152. gg[y].pb(x);
  153. }
  154. DFS(1,0,1);
  155. int j;
  156. for(i=1;(1<<i)<=n;i++) for(j=1;j<=n;j++) f[j][i]=f[f[j][i-1]][i-1];
  157. int Q;
  158. scanf("%d",&Q);
  159. while(Q--)
  160. {
  161. scanf("%d",&m);
  162. for(i=1;i<=m;i++)
  163. {
  164. a[i]=b[i]=getInt();
  165. g[a[i]]=MP(0,a[i]);
  166. ans[a[i]]=0;
  167. }
  168. tot=m;
  169. init();
  170. cal();
  171. for(i=1;i<=m;i++)
  172. {
  173. printf("%d ",ans[b[i]]);
  174. }
  175. puts("");
  176. }
  177. }

BZOJ 3752 世界树的更多相关文章

  1. BZOJ 3572 世界树

    Description 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条里,公平是使世界树能够生生不息.持 ...

  2. bzoj 3752: Hack 预处理+暴力dfs

    题目大意: 定义字符串的hash值\(h = \sum_{i=0}^{n-1}p^{n-i-1}s_i\) 现在给定K个长度不超过L的字符串S,对于每个字符串S,求字典序最小长度不超过L的字符串T使得 ...

  3. BZOJ 3572 世界树(虚树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3572 思路:建立虚树,然后可以发现,每条边不是同归属于一端,那就是切开,一半给上面,一半给下面. # ...

  4. bzoj 3572世界树 虚树+dp

    题目大意: 给一棵树,每次给出一些关键点,对于树上每个点,被离它最近的关键点(距离相同被标号最小的)控制 求每个关键点控制多少个点 分析: 虚树+dp dp过程如下: 第一次dp,递归求出每个点子树中 ...

  5. BZOJ 2648 世界树

    题目传送门 分析: 喜 闻 乐 见 的虚树 但是建好虚树后的DP也非常的恶心 我们先考虑每个关键点的归哪个点管 先DFS一次计算儿子节点归属父亲 再DFS一次计算父亲节点归属儿子 然后然后我们对于虚树 ...

  6. BZOJ 3572: [Hnoi2014]世界树

    BZOJ 3572: [Hnoi2014]世界树 标签(空格分隔): OI-BZOJ OI-虚数 OI-树形dp OI-倍增 Time Limit: 20 Sec Memory Limit: 512 ...

  7. bzoj 3572: [Hnoi2014]世界树 虚树 && AC500

    3572: [Hnoi2014]世界树 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 520  Solved: 300[Submit][Status] ...

  8. bzoj 3572 [Hnoi2014]世界树(虚树+DP)

    3572: [Hnoi2014]世界树 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 645  Solved: 362[Submit][Status] ...

  9. BZOJ 3572 【HNOI2014】 世界树

    题目链接:世界树 首先看到\(\sum m_i\le 3\times 10^5\)这个条件,显然这道题就需要用虚树了. 在我们构建出虚树之后,就可以用两遍\(dfs\)来求出离每个点最近的议事处了.然 ...

随机推荐

  1. 夺命雷公狗—angularjs—17—angularjs的静态库

    在实际的开发中我们往往已经离不开我们的静态库了,因为那里面有太多强悍的功能了,比如路由都是通过一个angular-route的库来实现的,, 那个库,我们可以在百度静态资源公共库来查找,查找方法如下所 ...

  2. beta-1阶段各组员的贡献分分配

    小组名称:nice! 小组成员:李权 于淼 刘芳芳 韩媛媛 宫丽君 项目内容:约跑app 分数分配规则 个人贡献分=基本贡献分*0.2+特殊贡献分*0.3+个人代码贡献量*0.5 其中 基本贡献分,特 ...

  3. 使用php模拟post的几种方法

    <?phpfunction file_get_contents_post($url,$post){$options=array('http'=>array('method'=>'PO ...

  4. [tp3.2.1]让默认页面: 加载Home模块的Index控制器;而让admin.php默认去加载Admin模块的Adminc控制器.

    QQ:让index.php默认加载Home模块的Index控制器;而让admin.php默认去加载Admin模块的Adminc控制器.AA:复制index.php命名为admin.php复制(新建)A ...

  5. NOIP200205均分纸牌

                                                                  均分纸牌 描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张 ...

  6. Android多线程通信之Handler

    主线程 public class MainActivity extends ActionBarActivity { private Handler handler; // private Thread ...

  7. [转]bit与byte

    本文为转载,感谢博主的分享.原文地址:http://www.cnblogs.com/flyme/archive/2011/08/25/2153596.html bit意为“位”或“比特”,是计算机运算 ...

  8. JavaWeb开发实例---Servlet

    1.页面转发:form表单的action属性值为Servlet类再web.xml中配置的URL. 2.重定向:sendRedirect()  只是 简单的页面跳转 转发:request.getRequ ...

  9. 电影TS、TC、SCR、R5、BD、HD等版本是什么意思

    在很多电影下载网站的影片标题中我们都能看到,比如<刺杀希特勒BD版>.<游龙戏凤TS版>等,这些英文缩写都是什么意思呢?都代表什么画质?以下就是各个版本的具体含义: 1.CAM ...

  10. linux,Mac下lu 一把

    习惯Terminal没有不知道ls命令的(等同于DOS的dir),经常只是需要查看目录的内容大小,但ls -h显示的只是目录的本身大小,而且很多项内容 ls 在这方面的两个诟病出现了: 小诟1. 显示 ...