CF856D Masha and Cactus(树上 DP+抵消贡献技巧)

CF856D Masha and Cactus

我们先捞出一个根节点,那么一次旋变就是对路径上点的覆盖。

\(dp_{i,0}\) 表示 \(i\) 没有选择时子树内最大收益,\(dp_{i,1}\) 表示 \(i\) 选择时子树内最大收益,那么将每条边存在 \(lca\) 上。

之后贡献怎么算??我们需要快速计算不在根到子树内一点路径上,但与路径上的点直接相连的子树内点的权值之和。这里有个计算技巧:

\(\color{yellow}{\bigstar\texttt{Trick}}\):设 \(g_i=-val_i+\sum_{j\in son_{i}}val_{j}\),那么上面的答案就是路径所有 \(g_i\) 之和加上根节点权值。

查询路径可以转化为子树加、单点查询,树状数组解决即可。

#define Maxn 400005
#define Maxlogn 22
int n,m,tot,Time;
int hea[Maxn],nex[Maxn<<1],ver[Maxn<<1];
int dfnl[Maxn],dfnr[Maxn],dep[Maxn],fa[Maxlogn][Maxn];
ll f[Maxn],g[Maxn];
struct EDGE
{int u,v,val;EDGE(int U=0,int V=0,int Val=0):u(U),v(V),val(Val){}
};
vector<EDGE> e[Maxn];
inline void add(int x,int y){ ver[++tot]=y,nex[tot]=hea[x],hea[x]=tot; }
struct BIT
{ll tree[Maxn];inline void add(int x,ll k){ while(x<=n) tree[x]+=k,x+=x&(-x); }inline ll query(int x){ ll ret=0; while(x) ret+=tree[x],x-=x&(-x); return ret; }
}T;
inline int lca(int x,int y)
{if(dep[x]>dep[y]) swap(x,y);for(int i=20;i>=0;i--) if(dep[fa[i][y]]>=dep[x]) y=fa[i][y];if(x==y) return x;for(int i=20;i>=0;i--) if(fa[i][x]!=fa[i][y]) x=fa[i][x],y=fa[i][y];return fa[0][x];
}
inline void addpath(int x,ll val) { T.add(dfnl[x],val),T.add(dfnr[x]+1,-val); }
inline ll querypath(int x) { return T.query(dfnl[x]); }
void dfs1(int x)
{dfnl[x]=++Time;for(int i=hea[x];i;i=nex[i]){fa[0][ver[i]]=x,dep[ver[i]]=dep[x]+1;for(int j=1;j<=20;j++) fa[j][ver[i]]=fa[j-1][fa[j-1][ver[i]]];dfs1(ver[i]);}dfnr[x]=Time;
}
void dfs2(int x)
{ll sum=0;for(int i=hea[x];i;i=nex[i]) dfs2(ver[i]),sum+=f[ver[i]];for(EDGE v:e[x]){ll tmp=querypath(v.u)+querypath(v.v)+sum+v.val;f[x]=max(f[x],tmp);}f[x]=max(f[x],sum),g[x]=sum-f[x],addpath(x,g[x]);
}
int main()
{n=rd(),m=rd();for(int i=2,x;i<=n;i++) x=rd(),add(x,i);dep[1]=1,dfs1(1);for(int i=1,u,v,val,LCA;i<=m;i++)u=rd(),v=rd(),val=rd(),LCA=lca(u,v),e[LCA].eb(u,v,val);dfs2(1);printf("%lld\n",f[1]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hdu 5094 Maze

题意&#xff1a; n*m大的迷宫 &#xff0c;有p种钥匙。钥匙最多有10种。 然后一个k&#xff0c;然后k行表示 (x1,y1),(x2,y2)直接有门或者墙。 如果g0 &#xff0c;就是有墙&#xff0c; 如果g>0 表示有门&#xff0c;且门需要第g把钥匙才能开。 然后下来一个s&#xff…

数论分块练习([CF830 C]Bamboo Partition + [hdu 6395]Sequence )

文章目录T1&#xff1a;SequencetitlesolutionT2&#xff1a;Bamboo PartitiontitlesolutioncodeT1&#xff1a;Sequence title 传送 solution 一眼就是很裸的矩阵加速 ⌊pl⌋\lfloor\frac{p}{l}\rfloor⌊lp​⌋分块矩阵加速就可以了 [BA1][DC⌊pl⌋010001]\begin{bmatrix}…

YBTOJ:染颜色(KDtree)

文章目录题目描述数据范围解析代码题目描述 数据范围 n≤105,T≤5n\le10^5,T\le5n≤105,T≤5 解析 关键是对问题的转化 考虑一次修改&#xff0c;一个点需要满足哪些条件才可以满足 1.与x的距离不超过lll 2.在x的子树内 这两个条件可以转化为对深度的限制和对dfs序的限制 这样…

Kubernetes初探[1]:部署你的第一个ASP.NET Core应用到k8s集群

Kubernetes简介Kubernetes是Google基于Borg开源的容器编排调度引擎&#xff0c;作为CNCF&#xff08;Cloud Native Computing Foundation&#xff09;最重要的组件之一&#xff0c;它的目标不仅仅是一个编排系统&#xff0c;而是提供一个规范&#xff0c;可以让你来描述集群的架…

P5933 [清华集训2012]串珠子(连通性 状压 计数)

P5933 [清华集训2012]串珠子 \(\color{yellow}{\bigstar\texttt{Trick}}\)&#xff1a;遇到连通性题可以暂时忽略是否联通。 设 \(g_s\) 表示集合为 \(s\) 的点的子图有多少个&#xff0c;可以不连通&#xff1b;\(f_s\) 表示答案。 那么 \(g_s\) 可以直接计算 \(g_s\prod_{(i&…

AT2365-[AGC012E]Camel and Oases【状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/AT2365 题目大意 一个数轴上有nnn个点&#xff0c;开始你有个水壶容量为VVV&#xff0c;你每次有两个操作 走到一个距离与你不超过VVV的点让V⌊V2⌋V\lfloor\frac V2\rfloorV⌊2V​⌋&#xff0c;然后跳到任意一个点。 对于…

01分数规划

参考文章 01分数规划 什么是01分数规划&#xff1a; 给定n个a[i]和b[i]&#xff0c;a[i]和b[i]绑定在一起要选同时选&#xff0c;求sum(a[i]) 除以 sum(b[i]) 的最大值&#xff0c;sum为求和函数 对于这种问题我们可以多定义一个数组x[1…n]&#xff0c;x为bool型只取0或者1,…

CF1156D 0-1-Tree(换根DP)

牛犇犇titlesolutioncodetitle 戳一戳 solution 直接设dp[i][k]dp[i][k]dp[i][k]表示以iii为根时&#xff0c;子树内&#xff0c;边权为kkk时的答案 &#xff08;定义写得好复杂&#xff0c;可略过&#xff09; 考虑对于点uuu&#xff0c;vvv是他的一个儿子&#xff0c;两点…

模版:替罪羊树

文章目录前言注意事项代码所谓替罪羊树&#xff0c;就是有一头替罪羊的树 &#xff08;逃&#xff09; 前言 在看完了一大堆各种平衡树的教程之后&#xff0c;决定学一个这个 因为它有一个很关键的好处&#xff1a;无须旋转 可以在pushup复杂度太恶心的题中做到splay做不到的…

Entity Framework 6.3 和 EF Core 3.0 路线图

尽管脱离了 .NET Core 发布循环&#xff0c;但是 EF Core 正在开发其 3.0 路线图。除此之外&#xff0c;还对原来的 Entity Framework 进行了一些重要的变更。更多服务器端的查询将 LINQ 查询转换为对应的 SQL 查询通常是比较困难的&#xff0c;甚至是不可能的。许多 QRM 只能在…

P7154 [USACO20DEC] Sleeping Cows P(DP)

主要是状态设计比较难想&#xff0c;但其实可以理性地推出来。 P7154 [USACO20DEC] Sleeping Cows P 考虑最终一个合法状态是怎么样的&#xff1a;一定是一堆小牛棚&#xff0c;一堆大奶牛&#xff0c;最大的牛棚小于最小的奶牛。 这启发我们将所有牛和牛棚放在一起&#xff0c…

AT2370-[AGC013D]Piling Up【dp】

正题 题目链接:https://www.luogu.com.cn/problem/AT2370 题目大意 有nnn个黑白球&#xff0c;但是具体颜色个数不确定&#xff0c;进行mmm次操作&#xff1a;拿出一个球然后放入黑白球各一个&#xff0c;再拿出一个球。 求最后颜色序列的种类数。 1≤n,m≤30001\leq n,m\le…

EFCore+Mysql仓储层建设(分页、多字段排序、部分字段更新)

前沿园子里已有挺多博文介绍了EFCoreMysql/MSSql如何进行使用&#xff0c;但实际开发不会把EF层放在Web层混合起来&#xff0c;需要多个项目配合结构清晰的进行分层工作&#xff0c;本文根据个人实践经验总结将各个项目进行分层&#xff0c;仅供想自己搭建,包含数据仓储以及分页…

[FWT] 时隔一年再回首FWT(快速沃尔什变换),我终于不再是个门外汉

时隔一年再回首FWT&#xff0c;我似乎有了新理解&#xff1f;&#xff1f; 添加了原理的推导&#xff0c;以前就只有模板… 文章目录引入or&#xff08;或&#xff09;卷积原理FWT_or正变换FWT_or逆变换模板and&#xff08;与&#xff09;卷积原理FWT_and正变换FWT_and逆变换模…

模板:多项式乘法(FFTNTT)

文章目录前言系数表示法和点值表示法单位根离散傅立叶变换&#xff08;DFT&#xff09;位逆序置换&#xff08;蝴蝶变换&#xff09;离散傅立叶逆变换&#xff08;IDFT&#xff09;代码NTT代码所谓快速傅立叶变换&#xff0c;就是傅立叶发明的一种快速的变换 &#xff08;逃&am…

Loj #149. 01 分数规划(01分数规划模板题)

链接 题意&#xff1a; 题解&#xff1a; 详细解法看这里 这里说个点&#xff0c;eps一定要开足够小&#xff0c;我一开始开的1e-5&#xff0c;结果就过了90%的数据&#xff0c;开到1e-7就足够了 代码&#xff1a; #include<bits/stdc.h> typedef long long ll; usin…

CF986C AND Graph(图论+二进制连边)

CF986C AND Graph \(\color{yellow}{\bigstar\texttt{Hint}}\)&#xff1a;和每个点连接的点是这个数取反后的子集&#xff0c;考虑将这个点和它的反连边&#xff0c;那么所有对应的数的子集都是同一个连通块内的。 之后的一种简单的寻找连通块就是直接对所有没有访问过的点暴力…

AT2376-[AGC014D]Black and White Tree【结论,博弈论】

正题 题目链接:https://www.luogu.com.cn/problem/AT2376 题目大意 给出nnn个点的一棵树&#xff0c;先后手轮流选择一个未染色的点染上白色(先手)/黑色(后手)&#xff0c;如果最后有一个白色的点连接的都是白色的点则先手获胜&#xff0c;否则后手获胜。求是否先手必胜。 1≤…

如何测试 ASP.NET Core Web API

在本文中&#xff0c;我们将研究如何测试你的 ASP .NET Core 2.0 Web API 解决方案。我们将了解使用单元测试进行内部测试&#xff0c;使用全新的 ASP .NET Core 的集成测试框架来进行外部测试。本文要点正确理解并使用单元测试和你的 ASP .NET Core Web API 解决方案一样重要。…

[帝皇杯day 1] [NOIP2018模拟赛]小P的loI(暴力+素筛),【NOIP模拟赛】创世纪(贪心),无聊的数对(线段树)

文章目录T1&#xff1a;小P的loltitlesolutioncodeT2&#xff1a;创世纪titlesolutioncodeT3&#xff1a;无聊的数对titlesolutioncodeT1&#xff1a;小P的lol title solution 此题非常水… 先用素数筛&#xff0c;筛出[1,n][1,n][1,n]中的质数 质数越小&#xff0c;倍数的分…