【Luogu】P2495消耗战(虚树DP)
我虚树没很理解啊qwq
就是我们有比较少的询问点,然后我们把不需要考虑的点搞一搞扔掉,然后每次询问给那些询问点单独建一颗树,然后乱搞。
……好吧看来是完全没理解……
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<algorithm>
- #include<cctype>
- #define maxn 500000
- using namespace std;
- inline long long read(){
- long long num=,f=;
- char ch=getchar();
- while(!isdigit(ch)){
- if(ch=='-') f=-;
- ch=getchar();
- }
- while(isdigit(ch)){
- num=num*+ch-'';
- ch=getchar();
- }
- return num*f;
- }
- struct Edge{
- int next,to,val;
- }edge[maxn*];
- int head[maxn],num;
- inline void add(int from,int to,int val){
- edge[++num]=(Edge){head[from],to,val};
- head[from]=num;
- }
- int stack[maxn],top;
- int deep[maxn];
- int s[maxn][];
- int dfn[maxn],ID;
- int q[maxn];
- long long f[maxn];
- long long ans[maxn];
- bool flag[maxn];
- void dfs(int x,int fa){
- deep[x]=deep[fa]+; dfn[x]=++ID;
- for(int i=head[x];i;i=edge[i].next){
- int to=edge[i].to;
- if(to==fa) continue;
- s[to][]=x;
- f[to]=min(f[x],(long long)edge[i].val);
- dfs(to,x);
- }
- return;
- }
- bool cmp(int a,int b){ return dfn[a]<dfn[b]; }
- int calclca(int a,int b){
- if(deep[a]<deep[b]) swap(a,b);
- int f=deep[a]-deep[b];
- for(int i=;<<i<=f;++i)
- if(f&(<<i)) a=s[a][i];
- if(a==b) return a;
- for(int i=;i>=;--i){
- if(s[a][i]==s[b][i]) continue;
- a=s[a][i];b=s[b][i];
- }
- return s[a][];
- }
- void calc(int x,int fa){
- long long sum=;
- ans[x]=f[x];
- for(int i=head[x];i;i=edge[i].next){
- int to=edge[i].to;
- if(to==fa) continue;
- calc(to,x);
- sum+=ans[to];
- }
- if(sum&&!flag[x]) ans[x]=min(ans[x],sum);
- head[x]=;
- return;
- }
- int main(){
- f[]=1e9; f[]=f[]*f[];
- int n=read();
- for(int i=;i<n;++i){
- int from=read(),to=read(),val=read();
- add(from,to,val);
- add(to,from,val);
- }
- dfs(,);
- for(int i=;i<=;++i)
- for(int j=;j<=n;++j)
- s[j][i]=s[s[j][i-]][i-];
- int m=read();
- memset(head,,sizeof(head));
- for(int i=;i<=m;++i){
- num=;top=;
- int x=read();
- for(int j=;j<=x;++j){ q[j]=read();flag[q[j]]=; }
- sort(q+,q+x+,cmp);
- for(int j=;j<=x;++j){
- if(top==){
- stack[++top]=q[j];
- continue;
- }
- int lca=calclca(q[j],stack[top]);
- while(dfn[lca]<dfn[stack[top]]){
- if(dfn[lca]>=dfn[stack[top-]]){
- add(lca,stack[top],);
- if(stack[--top]!=lca) stack[++top]=lca;
- break;
- }
- add(stack[top-],stack[top],);
- top--;
- }
- stack[++top]=q[j];
- }
- while(top>){
- add(stack[top-],stack[top],);
- top--;
- }
- calc(stack[],stack[]);
- printf("%lld\n",ans[stack[]]);
- for(int j=;j<=x;++j) flag[q[j]]=;
- }
- return ;
- }
【Luogu】P2495消耗战(虚树DP)的更多相关文章
- [BZOJ2286][SDOI2011]消耗战(虚树DP)
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4998 Solved: 1867[Submit][Statu ...
- bzoj 2286 [Sdoi2011]消耗战 虚树+dp
题目大意:多次给出关键点,求切断边使所有关键点与1断开的最小费用 分析:每次造出虚树,dp[i]表示将i和i子树与父亲断开费用 对于父亲x,儿子y ①y为关键点:\(dp[x]\)+=\(dismn( ...
- 【BZOJ】2286: [Sdoi2011]消耗战 虚树+DP
[题意]给定n个点的带边权树,每次询问给定ki个特殊点,求隔离点1和特殊点的最小代价.n<=250000,Σki<=500000. [算法]虚树+DP [题解]考虑普通树上的dp,设f[x ...
- [SDOI2011][bzoj2286] 消耗战 [虚树+dp]
题面: 传送门 思路: 看到所有询问中的点数总和是十万级别的,就想到用虚树~\(≧▽≦)/~啦 首先,树形dp应该是很明显可以看出来的: 设dp[u]表示以u为根的子树(不包括u)中的宝藏岛全部切断的 ...
- 洛谷P2495 [SDOI2011]消耗战(虚树dp)
P2495 [SDOI2011]消耗战 题目链接 题解: 虚树\(dp\)入门题吧.虚树的核心思想其实就是每次只保留关键点,因为关键点的dfs序的相对大小顺序和原来的树中结点dfs序的相对大小顺序都是 ...
- bzoj 3572世界树 虚树+dp
题目大意: 给一棵树,每次给出一些关键点,对于树上每个点,被离它最近的关键点(距离相同被标号最小的)控制 求每个关键点控制多少个点 分析: 虚树+dp dp过程如下: 第一次dp,递归求出每个点子树中 ...
- [SDOI2011]消耗战(虚树+树形动规)
虚树dp 虚树的主要思想: 不遍历没用的的节点以及没用的子树,从而使复杂度降低到\(\sum\limits k\)(k为询问的节点的总数). 所以怎么办: 只把询问节点和其LCA放入询问的数组中. 1 ...
- [BZOJ5287][HNOI2018]毒瘤(虚树DP)
暴力枚举非树边取值做DP可得75. 注意到每次枚举出一个容斥状态的时候,都要做大量重复操作. 建立虚树,预处理出虚树上两点间的转移系数.也可动态DP解决. 树上倍增.动态DP.虚树DP似乎是这种问题的 ...
- BZOJ 3572 [HNOI2014]世界树 (虚树+DP)
题面:BZOJ传送门 洛谷传送门 题目大意:略 细节贼多的虚树$DP$ 先考虑只有一次询问的情况 一个节点$x$可能被它子树内的一个到x距离最小的特殊点管辖,还可能被管辖fa[x]的特殊点管辖 跑两次 ...
随机推荐
- java入门第一章——java开发入门
习题解答 一.填空题 (p2)1.java的三个技术平台分别是(java SE.java EE.java ME)(标准.企业.小型) (p3)2.java程序的运行环境简称为(JRE)(开发环境-JD ...
- Nuget~管理自己的包包
很久很久以前,自己就想有个包包,最近又从网上淘了一个,价格不便宜呢,99块,还是个小腰包,不过作工还算精良,我喜欢的类型,帆布休闲包,可以将我的手机,耳机,水,小烟,小酒,小伞都放里,方便至极,哈哈!
- ES6学习笔记(二)
Set 和 Map 数据结构 1.set 基本用法 ES6提供了新的数据结构Set,它类似于数组,但是成员的值都是唯一的,没有重复的值 Set本身是一个构造函数,用来生成Set数据结构 const s ...
- python_84_os模块
'os模块:提供对操作系统进行调用的接口' import os print(os.getcwd())#获取当前脚本工作目录,即当前Python脚本工作的目录路径 os.chdir('C:\\Users ...
- tomcat - CPU高占用问题记录
先查询进程 top 再根据进程号,查出进程的线程 ps p 3036 -L -o pcpu,pid,tid,time,tname,cmd 得到最高使用率CPU的线程TID,转换成16进制 printf ...
- 酷炫的3D照片墙
今天给大家分享的案例是酷炫的3D照片墙 这个案例主要是通过 CSS3 和原生的 JS 来实现的,接下来我给大家分享一下这个效果实现的过程.博客上不知道怎么放本地视频,所以只能放两张效果截图了. 1.实 ...
- 洛谷P2347 砝码称重
题目 貌似是某年提高组签到题,六重循环零压力AC,差点怒踩std 但本蒟蒻决定写正解——多重背包,果断20分 原因是写错了状态转移方程...神才知道我咋过的样例和两个测试点 扯远了 多重背包 简单说一 ...
- redis学习笔记(1)
最近在学习redis,做了比较详细的学习笔记,分享给大家,欢迎一起讨论和学习 第一部分,简单介绍redis 和 redis的基本操作 NoSQL的特点 : 数据库种类繁多,但是一个共同的特点都是去掉关 ...
- 使用jmeter做简单的压测(检查点、负载设置、聚合报告)
1.添加断言(检查点) 在需要压测的接口下添加--断言--响应断言,取接口响应中包含有的数据即可 检查点HTTP请求-->断言-->响应断言1.名称.注释2.Apply to//作用于哪里 ...
- 【linux】文件默认权限:umask
在默认权限的属性上,目录与文件是不一样的.从第六章我们知道 x 权限对於目录是非常重要的! 但是一般文件的创建则不应该有运行的权限,因为一般文件通常是用在於数据的记录嘛!当然不需要运行的权限了. 因此 ...