【洛谷】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\)的 ...
随机推荐
- Net实现阿里云开放云存储服务(OSS)
1 第一步框架搭建新建一个全新的MVC项目 (项目参考文档https://docs.aliyun.com/?spm=5176.383663.9.6.5OJI07#/pub/oss/sdk/sdk-do ...
- 拓展 - Webrtc 的回声抵消(aec、aecm)算法简介
webrtc 的回声抵消(aec.aecm)算法简介 原文链接:丢失.不好意思 webrtc 的回声抵消(aec.aecm)算法主要包括以下几个重要模块:1.回声时延估计 2.NLMS( ...
- vue插件(还真是第一次接触)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- vue侦听器 基础4
侦听器 使用方式:设置需要侦听的data里的属性名就可以了 new Vue({ el:"#app", data:{ count:0 }, watchers:{ count(){ / ...
- python错误日志记录工具,解决项目排错问题
我们写项目的时候难免会遇到代码报错的问题,遇到这样的问题了如何快速的定位问题并解决问题呢? 我今天来整理了利用python只带的工具来解决这个问题,我能需要使用的库有: logging os 这些都是 ...
- Installation of SAP on RAC with Oracle ASM(转)
https://blogs.sap.com/2016/03/17/installation-of-sap-on-rac-with-oracle-asm-part-3distributed-enviro ...
- (摘录笔记)JAVA学习笔记SSH整合搭建项目
1:当然是导jar包啦: struts2: spring: hibernate: 至于这些jar包是什么作用,我想就不必我解释了,大家都懂得,ssh2基本的jar包: 还有一些其他jar包:strut ...
- 【书评:Oracle查询优化改写】第三章
[书评:Oracle查询优化改写]第三章 BLOG文档结构图 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 隐含参数 ...
- Windows系统Apache下载和安装
一.Apache的下载 1.访问Apache官网:https://httpd.apache.org 2.选择Windows版本下载 3.下载完成后解压缩,把文件放到自己想放的盘 二.Apache的安装 ...
- Linux 运维入门到跑路书单推荐
一.基础入门 <鸟哥的Linux私房菜基础学习篇>:最具知名度的Linux入门书<鸟哥的Linux私房菜基础学习篇>,全面而详细地介绍了Linux操作系统. https://b ...