传送门

又一道虚树入门题。

这个dp更简单啊。

直接记录每个点到1的距离,简单转移就行了。

代码:

  1. #include<bits/stdc++.h>
  2. #define N 250005
  3. #define ll long long
  4. #define min(a,b) (a<b?a:b)
  5. using namespace std;
  6. inline ll read(){
  7. ll ans=0;
  8. char ch=getchar();
  9. while(!isdigit(ch))ch=getchar();
  10. while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
  11. return ans;
  12. }
  13. int n,q,m,First[N],first[N],cnt=0,dfn_cnt=0,tot=0,top=0,stk[N],dfn[N],dep[N],st[N][21],a[N];
  14. ll dis[N],f[N];
  15. bool col[N];
  16. struct edge{int v,next,w;}e[N<<1];
  17. inline void add(int u,int v,int w){e[++cnt].v=v,e[cnt].w=w,e[cnt].next=First[u],First[u]=cnt;}
  18. inline void Add(int u,int v){e[++cnt].v=v,e[cnt].next=first[u],first[u]=cnt;}
  19. inline void dfs(int p){
  20. dfn[p]=++dfn_cnt;
  21. for(int i=First[p];i;i=e[i].next){
  22. int v=e[i].v;
  23. if(v==st[p][0])continue;
  24. st[v][0]=p,dep[v]=dep[p]+1,dis[v]=min(dis[p],e[i].w),dfs(v);
  25. }
  26. }
  27. inline int lca(int x,int y){
  28. if(dep[x]<dep[y])x^=y,y^=x,x^=y;
  29. for(int i=20;~i;--i)if(dep[x]-(1<<i)>=dep[y])x=st[x][i];
  30. if(x==y)return x;
  31. for(int i=20;~i;--i)if(st[x][i]!=st[y][i])x=st[x][i],y=st[y][i];
  32. return st[x][0];
  33. }
  34. inline bool cmp(int x,int y){return dfn[x]<dfn[y];}
  35. inline void dfs1(int p){
  36. f[p]=dis[p];
  37. ll sum=0;
  38. for(int i=first[p];i;i=e[i].next){
  39. int v=e[i].v;
  40. dfs1(v),sum+=f[v];
  41. }
  42. if(sum&&!col[p])f[p]=min(f[p],sum);
  43. first[p]=0;
  44. }
  45. int main(){
  46. n=read(),dis[1]=1e18;
  47. for(int i=1;i<n;++i){
  48. int u=read(),v=read(),w=read();
  49. add(u,v,w),add(v,u,w);
  50. }
  51. dfs(1),cnt=0;
  52. for(int j=1;j<=20;++j)for(int i=1;i<=n;++i)st[i][j]=st[st[i][j-1]][j-1];
  53. q=read();
  54. while(q--){
  55. m=read(),tot=cnt=top=0;
  56. for(int i=1;i<=m;++i)a[i]=read(),col[a[i]]=true;
  57. sort(a+1,a+m+1,cmp);
  58. int t;
  59. for(int i=1;i<=m;++i){
  60. if(!top){stk[++top]=a[i];continue;}
  61. t=lca(a[i],stk[top]);
  62. while(dep[stk[top]]>dep[t]){
  63. if(dep[stk[top-1]]<=dep[t]){
  64. Add(t,stk[top]),--top;
  65. if(stk[top]!=t)stk[++top]=t;
  66. break;
  67. }
  68. Add(stk[top-1],stk[top]),--top;
  69. }
  70. stk[++top]=a[i];
  71. }
  72. while(top>1)Add(stk[top-1],stk[top]),--top;
  73. dfs1(stk[1]),printf("%lld\n",f[stk[1]]);
  74. for(int i=1;i<=m;++i)col[a[i]]=0;
  75. }
  76. return 0;
  77. }

2018.09.25 bzoj2286: [Sdoi2011]消耗战(虚树+树形dp)的更多相关文章

  1. BZOJ2286: [Sdoi2011]消耗战(虚树/树形DP)

    Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 5246  Solved: 1978[Submit][Status][Discuss] Descript ...

  2. 【BZOJ-2286】消耗战 虚树 + 树形DP

    2286: [Sdoi2011消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2120  Solved: 752[Submit][Status] ...

  3. BZOJ 2286: [Sdoi2011]消耗战 虚树 树形dp 动态规划 dfs序

    https://www.lydsy.com/JudgeOnline/problem.php?id=2286 wa了两次因为lca犯了zz错误 这道题如果不多次询问的话就是裸dp. 一棵树上多次询问,且 ...

  4. BZOJ.2286.[SDOI2011]消耗战(虚树 树形DP)

    题目链接 BZOJ 洛谷P2495 树形DP,对于每棵子树要么逐个删除其中要删除的边,要么直接断连向父节点的边. 如果当前点需要删除,那么直接断不需要再管子树. 复杂度O(m*n). 对于两个要删除的 ...

  5. [BZOJ2286][SDOI2011]消耗战(虚树DP)

    2286: [Sdoi2011]消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 4998  Solved: 1867[Submit][Statu ...

  6. 【BZOJ2286】【SDOI2011】消耗战 [虚树][树形DP]

    消耗战 Time Limit: 20 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 在一场战争中,战场由n个岛屿和n-1 ...

  7. bzoj2286: [Sdoi2011]消耗战 虚树

    在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足够多的能源维系战斗,我军胜利在望.已知在其他k个 ...

  8. [SDOI2011]消耗战(虚树+树形动规)

    虚树dp 虚树的主要思想: 不遍历没用的的节点以及没用的子树,从而使复杂度降低到\(\sum\limits k\)(k为询问的节点的总数). 所以怎么办: 只把询问节点和其LCA放入询问的数组中. 1 ...

  9. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

随机推荐

  1. WP runtime post 请求, json 解析

    https://monkeyweekend.wordpress.com/2014/10/23/how-to-send-text-json-or-files-using-httpclient-posta ...

  2. rabbitmq /usr/lib/rabbitmq/bin/rabbitmq-server: line 85: erl: command not found

    问题描述:在使用命令/sbin/service rabbitmq-server start启动Rabbitmq时,报: Job for rabbitmq-server.service failed b ...

  3. 使用Jena执行SPARQL的Select和Ask查询

    使用Jena执行SPARQL的Select和ask查询 提供基本的接口和实现类,可在其他代码中直接调用 Select查询 接口 /** * The interface Select dao. * 本体 ...

  4. Hive 和 HBase区别

    作者:yuan daisy 链接:https://www.zhihu.com/question/21677041/answer/78289309 来源:知乎 著作权归作者所有.商业转载请联系作者获得授 ...

  5. 3.3 JSP内置对象概述

    1.request 1.1 request获取页面传来的参数,参数通过浏览器网址和后面添加?的方式传达. 传参:”show.jsp?id=001” 获取参数:request.getParameter( ...

  6. django中怎么使用mysql数据库的事务

    Mysql数据库事务: 在进行后端业务开始操作修改数据库时,可能会涉及到多张表的数据修改,对这些数据的修改应该是一个整体事务,即要么一起成功,要么一起失败. Django中对于数据库的事务,默认每执行 ...

  7. kubectl 获取信息

    获取pod所在节点的ip kubectlget po tiller-deploy-8694f8fddc-c2rql -n kube-system -o jsonpath='{.status.hostI ...

  8. mysql安装笔记-rpm

    基本内容: 1.需要解决两个依赖 2.需要解决一个包冲突 3.安装mysql服务,以及客户端client 4.修改root的随机密码 5.授予root用户,从任何机器访问任何数据库的任何表的权限 1. ...

  9. Quartz入门

    Quartz体系结构: 明白Quartz怎么用,首先要了解Scheduler(调度器).Job(任务)和Trigger(触发器)这3个核心的概念.请注意加粗内容. 1. Job: 是一个接口,只定义一 ...

  10. Python合并列表,append()、extend()、+、+=

    在实际应用中涉及到了列表合并的问题. 在应用append()时,发现列表是以一个元素的形式追加到列表上的,最后查询后用的是extend()方法,下面是区别   1.append()  向列表尾部追加一 ...