【洛谷】P5024 保卫王国 (倍增)
前言

传送门
很多人写了题解了,我就懒得写了,推荐一篇博客
那就分享一下我的理解吧(说得好像有人看一样
对于每个点都只有选与不选两种情况,所以直接用倍增预处理出来两种情况的子树之内,子树之外的最值,最终答案以拼凑的方式得出
如果这个题要修改权值的话就真的只能用动态dp了(好像还有那个什么全局平衡树
我真的觉得去年出题人只是想出一个倍增,结果被动态dp干了(Ark:出题人真的只是想出一个动态dp
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
const long long inf=1ll<<;
long long f[maxn][],g[maxn][],F[maxn][][][];char ch[];
int n,m,ecnt,v[maxn<<],nx[maxn<<],dep[maxn],info[maxn],fa[maxn][];
void add(int u1,int v1){nx[++ecnt]=info[u1];info[u1]=ecnt;v[ecnt]=v1;}
void dfs1(int x,int fath)
{
dep[x]=dep[fa[x][]=fath]+;
for(int i=info[x];i;i=nx[i])if(v[i]!=fath)
dfs1(v[i],x),f[x][]+=f[v[i]][],f[x][]+=min(f[v[i]][],f[v[i]][]);
}
void dfs2(int x)
{
for(int i=info[x];i;i=nx[i])if(v[i]!=fa[x][])
g[v[i]][]=g[x][]+f[x][]-min(f[v[i]][],f[v[i]][]),
g[v[i]][]=min(g[v[i]][],g[x][]+f[x][]-f[v[i]][]),dfs2(v[i]);
}
long long solve(int x,int a,int y,int b)
{
if(dep[x]<dep[y])swap(x,y),swap(a,b);
long long tx[]={inf,inf},ty[]={inf,inf},nwx[],nwy[];
tx[a]=f[x][a];ty[b]=f[y][b];
for(int i=;i>=;i--)if((dep[x]-dep[y])&(<<i))
{
nwx[]=nwx[]=inf;
for(int u=;u<=;u++)for(int v=;v<=;v++)
nwx[u]=min(nwx[u],tx[v]+F[x][i][v][u]);
tx[]=nwx[],tx[]=nwx[];x=fa[x][i];
}
if(x==y)return nwx[b]+g[y][b];
for(int i=;i>=;i--)if(fa[x][i]!=fa[y][i])
{
nwx[]=nwx[]=nwy[]=nwy[]=inf;
for(int u=;u<=;u++)for(int v=;v<=;v++)
nwx[u]=min(nwx[u],tx[v]+F[x][i][v][u]),nwy[u]=min(nwy[u],ty[v]+F[y][i][v][u]);
tx[]=nwx[],tx[]=nwx[];x=fa[x][i];ty[]=nwy[],ty[]=nwy[];y=fa[y][i];
}
int lca=fa[x][]=fa[y][];
long long ret1=g[lca][]+f[lca][]-f[x][]-f[y][]+tx[]+ty[],
ret2=g[lca][]+f[lca][]-min(f[x][],f[x][])-min(f[y][],f[y][])+min(tx[],tx[])+min(ty[],ty[]);
return min(ret1,ret2);
}
int main()
{
scanf("%d%d%s",&n,&m,ch+);for(int i=;i<=n;i++)scanf("%lld",&f[i][]);
for(int i=,u1,v1;i<n;i++)scanf("%d%d",&u1,&v1),add(u1,v1),add(v1,u1);
dfs1(,);dfs2();memset(F,0x3f,sizeof F);
for(int i=;i<=n;i++)
F[i][][][]=f[fa[i][]][]-min(f[i][],f[i][]),F[i][][][]=inf,
F[i][][][]=f[fa[i][]][]-min(f[i][],f[i][]),F[i][][][]=f[fa[i][]][]-f[i][];
for(int k=;k<=;k++)for(int i=;i<=n;fa[i][k]=fa[fa[i][k-]][k-],i++)
for(int u=;u<=;u++)for(int v=;v<=;v++)for(int w=;w<=;w++)
F[i][k][u][v]=min(F[i][k][u][v],F[i][k-][u][w]+F[fa[i][k-]][k-][w][v]);
for(int i=,a,b,x,y;i<=m;i++)
{
scanf("%d%d%d%d",&x,&a,&y,&b);
if(a==&&b==&&(fa[x][]==y||fa[y][]==x))puts("-1");
else printf("%lld\n",solve(x,a,y,b));
}
}
【洛谷】P5024 保卫王国 (倍增)的更多相关文章
- P5024 保卫王国[倍增+dp]
窝当然不会ddp啦,要写这题当然是考虑优化裸dp啦,但是这题非常麻烦,于是变成了黑题. 首先,这个是没有上司的舞会模型,求图的带权最大独立集. 不考虑国王的限制条件,有 \[ dp[x][0]+=dp ...
- 洛谷5024 保卫王国 (动态dp)
qwq非正解. 但是能跑过. 1e5 log方还是很稳的啊 首先,考虑最普通的\(dp\) 令\(dp1[x][0]表示不选这个点,dp1[x][1]表示选这个点的最大最小花费\) 那么 \(dp1[ ...
- 洛谷P4475 巧克力王国
洛谷P4475 巧克力王国 题目描述 巧克力王国里的巧克力都是由牛奶和可可做成的. 但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力. 对于每一块巧克力,我们设 x 和 y 为 ...
- 洛谷P3379lca,HDU2586,洛谷P1967货车运输,倍增lca,树上倍增
倍增lca板子洛谷P3379 #include<cstdio> struct E { int to,next; }e[]; ],anc[][],log2n,deep[],n,m,s,ne; ...
- [倍增][换根DP]luogu P5024 保卫王国
题面 https://www.luogu.com.cn/problem/P5024 分析 可以对有限制的点对之间的链进行在倍增上的DP数组合并. 需要通过一次正向树形DP和一次换根DP得到g[0][i ...
- P5024 保卫王国(动态dp/整体dp/倍增dp)
做法(倍增) 最好写的一种 以下0为不选,1为选 \(f_{i,0/1}\)为\(i\)子树的最小值,\(g_{i,0/1}\)为除i子树外的最小值 \(fh_{i,j,0/1,0/1}\)为确定\( ...
- 洛谷 P4475 巧克力王国 解题报告
P4475 巧克力王国 题目描述 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力. 对于每一块巧克力,我们设 \(x\) 和 \( ...
- 洛谷P3295 萌萌哒 [SCOI2016] 倍增+并查集
正解:倍增+并查集 解题报告: 传送门! 首先不难想到暴力?就考虑把区间相等转化成对应点对相等,然后直接对应点连边,最后求有几个连通块就好辣 然后看下复杂度,修改是O(n2)查询是O(n),就比较容易 ...
- 洛谷P1081 开车旅行(倍增)
题意 题目链接 Sol 咕了一年的题解.. 并不算是很难,只是代码有点毒瘤 \(f[i][j]\)表示从\(i\)号节点出发走了\(2^j\)轮后总的距离 \(da[i][j]\)同理表示\(a\)的 ...
随机推荐
- SQL Server安装教程(超详细)
具体教程:https://zijian1998.github.io/2018/03/14/Microsoft%20SQL%20Server%202017%E4%B8%8B%E8%BD%BD%E5%AE ...
- Java自学-控制流程 continue
Java的 continue语句 继续下一次循环 示例 1 : continue 如果是双数,后面的代码不执行,直接进行下一次循环 public class HelloWorld { public s ...
- Python基础知识(六)------小数据池,集合,深浅拷贝
Python基础知识(六)------小数据池,集合,深浅拷贝 一丶小数据池 什么是小数据池: 小数据池就是python中一种提高效率的方式,固定数据类型使用同一个内存地址 代码块 : 一个文 ...
- C#中的委托、事件及事件的订阅
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- JavaWeb 之 EL表达式
EL 表达式 一.概述 1.概念 EL 表达式:Expression Language 表达式语言. 2.作用 替换和简化 jsp 页面中 java 代码的编写. 3.语法格式 ${表达式} 4.注意 ...
- WinRAR捆绑木马
准备好木马文件 server.exe 准备一个小游戏 趣味数学计算 压缩 创建自解压格式压缩文件 自解压选项设置 解压路径设置 设置程序 模式设置 压缩完成 使用 开始玩游戏
- Celery:Monitor
参考文档:http://docs.celeryproject.org/en/latest/userguide/monitoring.html#guide-monitoring
- MYSQL慢查询优化方法及优化原则
1.日期大小的比较,传到xml中的日期格式要符合'yyyy-MM-dd',这样才能走索引,如:'yyyy'改为'yyyy-MM-dd','yyyy-MM'改为'yyyy-MM-dd'[这样MYSQL会 ...
- 功能更新 | medini analyze — 符合ISO 26262的功能安全平台工具
汽车电子电气系统的功能安全随着智能驾驶.新能源等新兴技术的发展而愈发受到重视.在国际功能安全标准ISO 26262的落地过程中遇到了很多的棘手问题:如何正确而有效地实施HARA以得到合 ...
- python list 字符串排序
#coding:utf-8 import re s = ['dat2','dat10','dat5'] #方法一 new = sorted(s,key = lambda i:int(re.search ...