前言

传送门

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

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

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

如果这个题要修改权值的话就真的只能用动态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. k8s与监控--k8s部署grafana6.0

    原文参考:https://segmentfault.com/a/1190000018335241

  2. 基于xilinx Zynq UltraScale MPSoC平台的核心板及开发板介绍-米尔科技

    近日,米尔科技推出国内首款基于xilinx Zynq UltraScale+MPSoC 平台的核心板及开发板.其优势主要有:采用16纳米制程,相比Znyq7000系列每瓦性能提升5倍,且单芯片融合4核 ...

  3. 用 node.js 模仿 Apache 的部分功能

    首先,这个例子用到了服务端渲染的技术.服务端渲染,说白了就是在服务端使用模板引擎,这里我先简单的介绍一下服务端渲染与客户端渲染之间的区别. 服务端渲染与客户端渲染之间的区别: 客户端渲染不利于搜索引擎 ...

  4. 一张图带你看懂原始dao与SQL动态代理开发的区别-Mybatis

    //转载请注明出处:https://www.cnblogs.com/nreg/p/11156167.html 1.项目结构区别: 2.开发区别: 注:其中原始dao开发的实现类UserDaoImpl ...

  5. JAVA基础之事务

    世界万事无简单一说, 每个事情基本上由多个小的事情来完成.有的事情会存在若小的事情不能同时完成的情况就取消所有的小的事情,直至都完成达到预期的效果才算完成!这样就用到了事务操作.在所有的sql语句完成 ...

  6. Node.js实现用户评论社区(体验前后端开发的乐趣)

    前面 接着上一节的内容来,今天我们要完成一个用Node开发后台服务器,实现一个简单的用户评论社区.可以先看下效果图: 开始 建立项目文件夹comment-list,在里面新建一个public文件夹,p ...

  7. 如何自行给指定的SAP OData服务添加自定义日志记录功能

    有的时候,SAP标准的OData实现或者相关的工具没有提供我们想记录的日志功能,此时可以利用SAP系统强大的扩展特性,进行自定义日志功能的二次开发. 以SAP CRM Fiori应用"My ...

  8. 前端动态效果小结(jQuery)

    1.easyUI(jQuery) http://www.jeasyui.net/demo/954.html

  9. xadmin集成DjangoUeditor,以及编辑器的视频路径配置

    稍微讲一下DjangoUeditor的配置,因为之前去找配置的时候东拼西凑的,所以自己写一下自己一步步配置的过程.首先我是再github上去下载下来,因为是当作第三方插件集成到xadmin中,所以不用 ...

  10. 改变默认的多选框 checkbox 样式~

    效果图: HTML代码: <label for="Checkbox1" style="display:none;"></label> & ...