前言

传送门

很多人写了题解了,我就懒得写了,推荐一篇博客

那就分享一下我的理解吧(说得好像有人看一样

对于每个点都只有选与不选两种情况,所以直接用倍增预处理出来两种情况的子树之内,子树之外的最值,最终答案以拼凑的方式得出

如果这个题要修改权值的话就真的只能用动态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 保卫王国 (倍增)的更多相关文章

  1. P5024 保卫王国[倍增+dp]

    窝当然不会ddp啦,要写这题当然是考虑优化裸dp啦,但是这题非常麻烦,于是变成了黑题. 首先,这个是没有上司的舞会模型,求图的带权最大独立集. 不考虑国王的限制条件,有 \[ dp[x][0]+=dp ...

  2. 洛谷5024 保卫王国 (动态dp)

    qwq非正解. 但是能跑过. 1e5 log方还是很稳的啊 首先,考虑最普通的\(dp\) 令\(dp1[x][0]表示不选这个点,dp1[x][1]表示选这个点的最大最小花费\) 那么 \(dp1[ ...

  3. 洛谷P4475 巧克力王国

    洛谷P4475 巧克力王国 题目描述 巧克力王国里的巧克力都是由牛奶和可可做成的. 但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力. 对于每一块巧克力,我们设 x 和 y 为 ...

  4. 洛谷P3379lca,HDU2586,洛谷P1967货车运输,倍增lca,树上倍增

    倍增lca板子洛谷P3379 #include<cstdio> struct E { int to,next; }e[]; ],anc[][],log2n,deep[],n,m,s,ne; ...

  5. [倍增][换根DP]luogu P5024 保卫王国

    题面 https://www.luogu.com.cn/problem/P5024 分析 可以对有限制的点对之间的链进行在倍增上的DP数组合并. 需要通过一次正向树形DP和一次换根DP得到g[0][i ...

  6. P5024 保卫王国(动态dp/整体dp/倍增dp)

    做法(倍增) 最好写的一种 以下0为不选,1为选 \(f_{i,0/1}\)为\(i\)子树的最小值,\(g_{i,0/1}\)为除i子树外的最小值 \(fh_{i,j,0/1,0/1}\)为确定\( ...

  7. 洛谷 P4475 巧克力王国 解题报告

    P4475 巧克力王国 题目描述 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力. 对于每一块巧克力,我们设 \(x\) 和 \( ...

  8. 洛谷P3295 萌萌哒 [SCOI2016] 倍增+并查集

    正解:倍增+并查集 解题报告: 传送门! 首先不难想到暴力?就考虑把区间相等转化成对应点对相等,然后直接对应点连边,最后求有几个连通块就好辣 然后看下复杂度,修改是O(n2)查询是O(n),就比较容易 ...

  9. 洛谷P1081 开车旅行(倍增)

    题意 题目链接 Sol 咕了一年的题解.. 并不算是很难,只是代码有点毒瘤 \(f[i][j]\)表示从\(i\)号节点出发走了\(2^j\)轮后总的距离 \(da[i][j]\)同理表示\(a\)的 ...

随机推荐

  1. Oracle与SQL Server等数据库的区别

    Oracle与SQL Server等数据库的区别 在Oracle中提倡使用一个连接 Oracle处理多个并发语句使用一个连接,大大提升系统能支持的并发量 Oracle运行在32为单进程平台上SGA和P ...

  2. 在pycharm中右键运行,只有unnitest,HtmltTestRunner不生成报告

    https://blog.csdn.net/lufangbo/article/details/79308362 有时候在编完脚本开始运行时,发现某个py脚本右键运行的选项不是run,二是run in ...

  3. 小程序中的数据请求sessionid,保持登陆状态。

    版权声明:本文为CSDN博主「weixin_43964779」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net ...

  4. Java Excel报表导出Demo

    /** * 一级权限数据导出 * @return */ @RequestMapping(value = "/getExportData", method = RequestMeth ...

  5. 【Docker】docker安装redis

    一.下载镜像并运行容器 1.指定redis.conf配置文件方式运行 docker run -p 6379:6379 --name myredis -v $PWD/conf/redis.conf:/e ...

  6. Python入门篇-数据结构树(tree)篇

    Python入门篇-数据结构树(tree)篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.树概述 1>.树的概念 非线性结构,每个元素可以有多个前躯和后继 树是n(n& ...

  7. MSF MS11-050攻击实践及内存保护技术

    内存攻击指的是攻击者利用软件安全漏洞,构造恶意输入导致软件在处理输入数据时出现非预期错误,将输入数据写入内存中的某些特定敏感位置,从而劫持软件控制流,转而执行外部输入的指令代码,造成目标系统被获取远程 ...

  8. 使用批处理打包C#开发程序

    最近项目接近尾声,测试比较频繁,每天需要发布多个版本 @echo off set zip=C:\Program Files\7-Zip\7z.exe set timestamp=%date:~6,4% ...

  9. web自动化测试-获得验证信息

    一.概述 1.在编写功能测试用例时,会假定一个预期结果,在执行用例过程中把得到的实际结果与预期结果进行比较,从而判断用例的通过与失败 2.自动化测试用例是由机器去执行,通常机器并不像人一样有思维和判断 ...

  10. [NPM + React] Prepare a Custom React Hook to be Published as an npm Package

    Before we publish our package, we want to make sure everything is set up correctly. We’ll cover vers ...