题目传送门

分析:

喜 闻 乐 见 的虚树

但是建好虚树后的DP也非常的恶心

我们先考虑每个关键点的归哪个点管

先DFS一次计算儿子节点归属父亲

再DFS一次计算父亲节点归属儿子

然后然后我们对于虚树上的每条边计算一下

首先先找到分割点mid

那么向上归属的是红色部分

向下的是绿色部分

对于每条边都算一下就好了

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<algorithm>
  5. #include<vector>
  6. #define maxn 600005
  7. #define INF 1ll<<50
  8. using namespace std;
  9. inline int getint()
  10. {
  11. int num=0,flag=1;char c;
  12. while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;
  13. while(c>='0'&&c<='9')num=num*10+c-48,c=getchar();
  14. return num*flag;
  15. }
  16. int n;
  17. int fir[maxn],nxt[maxn],to[maxn],cnt;
  18. int f[maxn][21],dpt[maxn],sz[maxn];
  19. int h[maxn],a[maxn];
  20. int bl[maxn],F[maxn],ans[maxn];
  21. int In[maxn],Out[maxn],cur;
  22. int stk[maxn],top;
  23. int pos[maxn],tot;
  24. inline bool cmp(int x,int y){return In[x]<In[y];}
  25. inline void newnode(int u,int v)
  26. {to[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt;}
  27. inline void dfs(int u,int fa)
  28. {
  29. sz[u]=1;In[u]=++cur;
  30. for(int i=fir[u];i;i=nxt[i])if(to[i]!=fa)
  31. {
  32. f[to[i]][0]=u,dpt[to[i]]=dpt[u]+1;
  33. dfs(to[i],u);
  34. sz[u]+=sz[to[i]];
  35. }
  36. Out[u]=cur;
  37. }
  38. inline int LCA(int u,int v)
  39. {
  40. if(dpt[u]<dpt[v])swap(u,v);
  41. int d=dpt[u]-dpt[v];
  42. for(int i=20;~i;i--)if(d&(1<<i))u=f[u][i];
  43. if(u==v)return u;
  44. for(int i=20;~i;i--)if(f[u][i]!=f[v][i])u=f[u][i],v=f[v][i];
  45. return f[u][0];
  46. }
  47. inline int getdis(int u,int v)
  48. {return dpt[u]+dpt[v]-2*dpt[LCA(u,v)];}
  49. inline void dfs1(int u,int fa)
  50. {
  51. pos[++tot]=u;F[u]=sz[u];
  52. for(int i=fir[u];i;i=nxt[i])if(to[i]!=fa)
  53. {
  54. dfs1(to[i],u);
  55. if(!bl[to[i]])continue;
  56. if(!bl[u]){bl[u]=bl[to[i]];continue;}
  57. int tmp1=getdis(bl[to[i]],u),tmp2=getdis(bl[u],u);
  58. if(tmp1<tmp2||(tmp1==tmp2&&bl[to[i]]<bl[u]))bl[u]=bl[to[i]];
  59. }
  60. }
  61. inline void dfs2(int u,int fa)
  62. {
  63. for(int i=fir[u];i;i=nxt[i])if(to[i]!=fa)
  64. {
  65. int tmp1=getdis(bl[u],to[i]),tmp2=getdis(bl[to[i]],to[i]);
  66. if(tmp1<tmp2||(tmp1==tmp2&&bl[u]<bl[to[i]]))bl[to[i]]=bl[u];
  67. dfs2(to[i],u);
  68. }
  69. }
  70. inline void solve(int fa,int u)
  71. {
  72. int son=u,mid=u;
  73. for(int i=20;~i;i--)if(dpt[fa]+(1<<i)<dpt[son])son=f[son][i];
  74. F[fa]-=sz[son];
  75. if(bl[fa]==bl[u]){ans[bl[fa]]+=sz[son]-sz[u];return;}
  76. for(int i=20;~i;i--)
  77. {
  78. int tmp=f[mid][i];
  79. if(dpt[tmp]<=dpt[fa])continue;
  80. int tmp1=getdis(tmp,bl[fa]);
  81. int tmp2=getdis(tmp,bl[u]);
  82. if(tmp2<tmp1||(tmp1==tmp2&&bl[u]<bl[fa]))mid=tmp;
  83. }
  84. ans[bl[fa]]+=sz[son]-sz[mid];
  85. ans[bl[u]]+=sz[mid]-sz[u];
  86. }
  87. inline void solve()
  88. {
  89. int K=getint();top=0;
  90. int tt=K;
  91. for(int i=1;i<=K;i++)a[i]=h[i]=getint(),bl[h[i]]=h[i];h[++K]=1;
  92. sort(h+1,h+K+1,cmp);
  93. for(int i=K-1;i;i--)h[++K]=LCA(h[i],h[i+1]);
  94. sort(h+1,h+K+1,cmp);K=unique(h+1,h+K+1)-h-1;
  95. stk[++top]=h[1];
  96. for(int i=2;i<=K;i++)
  97. {
  98. while(top&&Out[stk[top]]<In[h[i]])top--;
  99. newnode(stk[top],h[i]);
  100. stk[++top]=h[i];
  101. }
  102. dfs1(h[1],h[1]),dfs2(h[1],h[1]);
  103. for(int i=1;i<=K;i++)
  104. for(int j=fir[pos[i]];j;j=nxt[j])
  105. solve(pos[i],to[j]);
  106. for(int i=1;i<=K;i++)ans[bl[pos[i]]]+=F[pos[i]];
  107. for(int i=1;i<=tt;i++)printf("%d%c",ans[a[i]],(i==tt)?'\n':' ');
  108. for(int i=1;i<=K;i++)F[h[i]]=ans[h[i]]=fir[h[i]]=bl[h[i]]=0;
  109. cnt=tot=0;
  110. }
  111. int main()
  112. {
  113. n=getint();
  114. for(int i=1;i<n;i++)
  115. {
  116. int u=getint(),v=getint();
  117. newnode(u,v),newnode(v,u);
  118. }
  119. dfs(1,1);
  120. for(int j=1;j<=20;j++)for(int i=1;i<=n;i++)f[i][j]=f[f[i][j-1]][j-1];
  121. memset(fir,0,sizeof fir);cnt=0;
  122. int m=getint();
  123. while(m--)solve();
  124. }

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

  1. BZOJ 3572 世界树

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

  2. BZOJ 2648: SJY摆棋子

    2648: SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2968  Solved: 1011[Submit][Status][Disc ...

  3. BZOJ 2648: SJY摆棋子 kdtree

    2648: SJY摆棋子 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2648 Description 这天,SJY显得无聊.在家自己玩 ...

  4. BZOJ 2648/2716(SJY把件-KD_Tree)[Template:KD_Tree]

    2648: SJY把件 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 1180  Solved: 391 [id=2648" style= ...

  5. kd-tree注解 &amp; bzoj 2648 &amp; 2716 &amp; 3053 解决问题的方法

    [KD-TREE简介]于SYC1999大神"迷住"下一个.我开始接触这样的算法. 首先.这个概念大概能去百度百科.详细的实施.我在看RZZ的代码长大的. 我们能够想象在平面上有N个 ...

  6. BZOJ 2648 SJY摆棋子(KD Tree)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2648 题意: 思路: KDtree模板题. 参考自http://www.cnblogs.com/ra ...

  7. bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree

    2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec  Memory Limit: 128 MB Description 这天,S ...

  8. BZOJ 2648 kd-tree模板

    学习了一下kd-tree的基本写法 http://blog.csdn.net/jiangshibiao/article/details/34144829 配合 http://www.bilibili. ...

  9. bzoj 2648 SJY摆棋子——KDtree

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2648 第一道KDtree! 学习资料:https://blog.csdn.net/zhl30 ...

随机推荐

  1. vue-learning:10-template-ref

    使用ref直接访问DOM元素 传统DOM操作或jQuery操作DOM,都必须是选择器先选择对应的DOM元素.比如: <button id="btn">按钮</bu ...

  2. 009.MFC_Spin

    数值调节按钮CSpinButtonCtrl属性 Alignment Auto Buddy Set Buddy integer成员函数 SetRange32() SetBase()

  3. docker 挂载目录挂载不上**

    最近做项目做一个shared Dynamodb, 使用docker挂载一个image,发现怎么都挂载不上, 使用 $ pwd E:\Work\Aws\git\schema\dynamodb\local ...

  4. Google 开源的 Python 命令行库:深入 fire(一)

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  5. 如何基于TencentOS tiny,快速打造属于自己的IoT小应用?

    导语 | 近日,云+社区技术沙龙“腾讯开源技术”圆满落幕.本次沙龙邀请了多位腾讯技术专家,围绕腾讯开源与众多开发者进行探讨,深度揭秘了腾讯开源项目TencentOS tiny.TubeMQ.Kona  ...

  6. Ambari+HDP+HDF离线安装包下载清单

    Ambari 2.7.3 Repositories OS Format URL RedHat 7 CentOS 7 Oracle Linux 7 Base URL http://public-repo ...

  7. 3.24 7.13 Python基础汇总

    对象类型 类型名称 示例 简要说明 备注 数字 int,float,complex 1234,3.14,1.3e5,3+4j 数字大小没有限制 十六进制用0x前缀和0-9,a-f表示 字符串 str ...

  8. 开启 Django 博客的 RSS 功能

    作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 博客提供 RSS 订阅应该是标配,这样读者就可以通过一些聚合阅读工具订阅你的博客,时 ...

  9. vps远程桌面服务器管理

    vps服务器是没有远程桌面系统的,本地电脑要有远程桌面的组件或者专业的远程桌面管理工具,如果出于安全考虑关闭了3389端口(这是系统自带远程桌面的端口),你可以试试iis7远程桌面管理工具,这个还是很 ...

  10. 高校表白app用后感

    此款app前提是我们自行设计研发的app,其次满足了在校大学生对谈恋爱的需求,可以说是一款简单实用,好操作的软件.下面我根据自己的使用体验简单的介绍一下此软件: (1)首先对于未使用过的用户,你需要在 ...