BZOJ2286: [Sdoi2011]消耗战
建出虚树dp。
把询问点按dfs序排序,用一个以dfs序为关键字的单调栈(以深度为关键字也是一样的),每次将一个询问点与栈顶的点的lca入栈,再将这个询问点入栈,在这个过程中建出一棵树就是虚树。具体看代码。
#include<bits/stdc++.h> #define N 250005 using namespace std; typedef long long LL; int n,m,q; struct edge{ edge* s; int v,w; }e[N<<1],*back=e,*h[N]; void add( int u,int v,int w){ h[u]=&(*back++ =(edge){h[u],v,w}); h[v]=&(*back++ =(edge){h[v],u,w}); } void add(int u,int v){ h[u]=&(*back++ =(edge){h[u],v}); } typedef int ds[N]; ds d,num,p,size,son,top,t,z,v,a; void dfs1(int u){ d[u]=d[p[u]]+1; size[u]=1; int s=0; for(edge* i=h[u];i;i=i->s) if(i->v!=p[u]){ p[i->v]=u; t[i->v]=min(t[u],i->w); dfs1(i->v); size[u]+=size[i->v]; if(s<size[i->v]) s=size[son[u]=i->v]; } } void dfs2(int u){ static int cnt; num[u]=++cnt; if(size[u]!=1){ top[son[u]]=top[u]; dfs2(son[u]); } for(edge*& i=h[u];i;i=i->s) if(i->v!=p[u] &&i->v!=son[u]) dfs2(top[i->v]=i->v); } int lca(int s,int t){ while(top[s]!=top[t]){ if(d[top[s]]<d[top[t]]) swap(s,t); s=p[top[s]]; } return d[s]<d[t]?s:t; } bool foo(int i,int j){ return num[i]<num[j]; } LL dp(int u){ LL s=0; for(edge*& i=h[u];i;i=i->s) s+=dp(i->v); return u==1||s<t[u] &&z[u]!=q+1?s:t[u]; } void writeln(int u){ printf("%d\n",u); } void writeln(LL u){ printf("%lld\n",u); } int main(){ scanf("%d",&n); for(int i=1;i!=n;++i){ int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w); } t[1]=1e9; dfs1(1); dfs2(top[1]=1); scanf("%d",&q); while(q--){ scanf("%d",&m); for(int j=0;j!=m;++j) scanf("%d",a+j); sort(a,a+m,foo); back=e; int i=v[1]=1,j=0; while(j!=m){ int u=lca(v[i],a[j]); while(d[u]<d[v[i]]){ --i; if(d[u]<d[v[i]]) add(v[i],v[i+1]); else{ add(u,v[i+1]); v[i+=v[i]!=u]=u; } } z[a[j]]=q+1; v[++i]=a[j++]; } while(--i) add(v[i],v[i+1]); writeln(dp(1)); } }
BZOJ2286: [Sdoi2011]消耗战的更多相关文章
- [BZOJ2286][SDOI2011]消耗战(虚树DP)
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4998 Solved: 1867[Submit][Statu ...
- [BZOJ2286][Sdoi2011]消耗战(虚树上DP)
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6457 Solved: 2533[Submit][Statu ...
- bzoj千题计划254:bzoj2286: [Sdoi2011]消耗战
http://www.lydsy.com/JudgeOnline/problem.php?id=2286 虚树上树形DP #include<cmath> #include<cstdi ...
- BZOJ2286 [Sdoi2011]消耗战 【虚树 + 树形Dp】
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 4261 Solved: 1552 [Submit][Sta ...
- BZOJ2286 [Sdoi2011]消耗战 和 BZOJ3611 [Heoi2014]大工程
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6371 Solved: 2496[Submit][Statu ...
- [Bzoj2286][Sdoi2011]消耗战(虚树模板题附讲解)
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4896 Solved: 1824[Submit][Statu ...
- 【学习笔记】虚树复习记(BZOJ2286 SDOI2011 消耗战)
想写战略游戏却想不起来虚树T^T 所以就有了这篇复习记QwQ ——简介!—— 我们在处理树上问题的时候,dfs是一个常用手段,但是我们发现,如果一棵树上只有一部分关键点,每次dfs需要访问好多不是关键 ...
- [bzoj2286][Sdoi2011]消耗战(虚树上的DP)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2286 分析:对于普通的树形dp:f[x]=min(∑f[son],m[x]),其中f[ ...
- [bzoj2286] [Sdoi2011消耗战
还是虚树恩..模板都能打挂QAQ 先在原树上预处理出mndis[i],表示根节点到节点i 路径上边权的最小值(就是断开i与根的联系的最小花费) 建完虚树在虚树上跑树形DP..f[i]表示断开 i 所 ...
随机推荐
- ASP.NET MVC 数据库依赖缓存的实现
当数据库中的信息发生变化的时候,应用程序能够获取变化的通知是缓存依赖得以实现的基础.应用程序可以通过轮询获取数据变化的信息,使用轮询的话也不可能重新查一次后再和以前的数据做比较,如果这样的话如果我一个 ...
- html 文本超过显示省略号
display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2;//显示行数 word-break: break-a ...
- 【jQuery EasyUI系列】创建CRUD数据网格
在上一篇中我们使用对话框组件创建了CRUD应用创建和编辑用户信息.本篇我们来创建一个CRUD数据网格DataGrid 步骤1,在HTML标签中定义数据网格(DataGrid) <table id ...
- C#开发命名规范
学习C#之初,始终不知道怎么命名比较好,很多时候无从命名,终于有一天我整理了一份命名规范文档,自此我就是按照这个命名规范书写代码,整洁度无可言表,拙劣之处请大家斧正,愚某虚心接受,如有雷同,不胜荣幸 ...
- PHPStorm2016如何安装主题
今天放出如何安装phpstorm 主题教程,教程如下: 下载主题 地址:phpstoorm-themes.com 安装主题 PhpStorm and WebStorm themes can be in ...
- jQuery基础--样式篇(1)
1.jQuery简介:JQuery是继prototype之后又一个优秀的Javascript库.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari ...
- Shell命令_正则表达式
正则表达式是包含匹配,通配符是完全匹配 基础正则表达式 test.txt示例文件 1 2 3 4 5 6 7 8 9 10 11 12 Mr. James said: he was the hones ...
- 一、项目基础架构(附GitHub地址)——以ABP为基础架构的一个中等规模的OA开发日志
前言: 最近园子里ABP炒的火热.看了几篇对于ABP的介绍后,深感其设计精巧,实现优雅.个人感觉,ABP或ABP衍生品的架构设计,未来会成为中型Net项目的首选架构模式.如果您还不了解ABP是什么,有 ...
- Mybatis + SpringMVC + Maven实现分页查询
使用Mybatis + Maven + SpringMVC 运行时,突然被需要分页查询的功能给难住了 这里推荐采用的插件是PageHelper这个插件,使用起来十分方便.该插件支持以下数据库: Ora ...
- 查看MySQL是否支持InnoDB引擎以及不支持的解决办法
通过命令行进入mysql SHOW variables like "have_%"; 显示结果中会有如下3种可能的结果: have_innodb YES have_innodb N ...