【洛谷】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\)的 ...
随机推荐
- JAVA9之后废弃newInstance()方法
JAVA9之后废弃newInstance()方法 根据JAVA11的API 我们可以看见反射中的newInstance()方法不推荐使用了,用 clazz.getDeclaredConstructor ...
- js模块基础练习题
题目描述 完成函数 createModule,调用之后满足如下要求: 1.返回一个对象 2.对象的 greeting 属性值等于 str1, name 属性值等于 str2 3.对象存在一个 sayI ...
- token jwt配置
1. token jwt配置 1.1. pom <!-- token验证 --> <dependency> <groupId>io.jsonwebtoken< ...
- mac杂记
brew 安装.更新 https://blog.csdn.net/fxp850899969/article/details/53284193 vmware work 15 pro https://ww ...
- Java实现在线预览--openOffice实现
简介 之前有写了poi实现在线预览的文章,里面也说到了使用openOffice也可以做到,这里就详细介绍一下. 我的实现逻辑有两种: 一.利用jodconverter(基于OpenOffice服务)将 ...
- ABAP和Java里的单例模式攻击
面向对象编程世界里的单例模式(Singleton)可能是设计模式里最简单的一种,大多数开发人员都觉得可以很容易掌握它的用法.单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点. 然而在某些场 ...
- 命令启用Windows7 .NetFramework 3.5
最近在测试某系统安装包在各个环境下的安装使用情况,在window7 下使用时,安装完成iis后,发现.Net Framework 3.5 没有自动勾选:命令没有执行成功. 通过以下命令可以在windo ...
- 持久化JS存储
<script src="../../lib/persist-min.js"></script> //测试一下本地化存储器 var store = new ...
- hadoop分布式集群环境搭建
参考 http://www.cnblogs.com/zhijianliutang/p/5736103.html 1 wget http://mirrors.shu.edu.cn/apache/hado ...
- springboot全局异常处理(1)
新建一个类 在类上加一个注解即可 @ControllerAdvice /** * 全局错误处理 * @author sys * */ @ControllerAdvice @ResponseBody p ...