P6847-[CEOI2019]Magic Tree【dp,线段树合并】
正题
题目链接:https://www.luogu.com.cn/problem/P6847
题目大意
nnn个点的一棵树上,每个时刻可以割掉一些边,一些节点上有果实表示如果在did_idi时刻这个点恰好不与111联通,那么就可以获得wiw_iwi的价值。
1≤n,k≤1051\leq n,k\leq 10^51≤n,k≤105
解题思路
设fx,if_{x,i}fx,i表示节点xxx在时刻iii之前割掉时的最大权值那么相当与在儿子里面选一个最大的fy,j(j≤i)f_{y,j}(j\leq i)fy,j(j≤i)合并上来。
这是一个很经典的转移方式,和命运那题一样,直接用线段树合并维护就好了。
时间复杂度O(nlogk)O(n\log k)O(nlogk)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e5+10;
ll n,m,k,rt[N],fa[N],d[N],w[N];
ll cnt,t[N<<5],lazy[N<<5],ls[N<<5],rs[N<<5];
void Downdata(int x){if(!lazy[x])return;if(ls[x])lazy[ls[x]]+=lazy[x],t[ls[x]]+=lazy[x];if(rs[x])lazy[rs[x]]+=lazy[x],t[rs[x]]+=lazy[x];lazy[x]=0;return;
}
void Change(ll &x,ll L,ll R,ll pos,ll val,ll z){if(!x)x=++cnt;if(L==R){t[x]=val+max(z,t[x]);return;}ll mid=(L+R)>>1;Downdata(x);if(pos<=mid)Change(ls[x],L,mid,pos,val,z);else Change(rs[x],mid+1,R,pos,val,max(z,t[ls[x]]));t[x]=max(t[ls[x]],t[rs[x]]);return;
}
ll Merge(ll L,ll R,ll x,ll y,ll mx1,ll mx2){if(!x||!y){if(x)lazy[x]+=mx2,t[x]+=mx2;if(y)lazy[y]+=mx1,t[y]+=mx1;return x|y;}if(L==R){t[x]=max(t[x],mx1)+max(t[y],mx2);return x;}ll mid=(L+R)>>1;Downdata(x);Downdata(y);rs[x]=Merge(mid+1,R,rs[x],rs[y],max(mx1,t[ls[x]]),max(mx2,t[ls[y]]));ls[x]=Merge(L,mid,ls[x],ls[y],mx1,mx2);t[x]=max(t[ls[x]],t[rs[x]]);return x;
}
signed main()
{scanf("%lld%lld%lld",&n,&m,&k); for(ll i=2;i<=n;i++)scanf("%lld",&fa[i]);for(ll i=1;i<=m;i++){ll x;scanf("%lld",&x);scanf("%lld%lld",&d[x],&w[x]);}for(ll x=n;x>=1;x--){if(d[x])Change(rt[x],1,k,d[x],w[x],0);if(fa[x])rt[fa[x]]=Merge(1,k,rt[fa[x]],rt[x],0,0);}printf("%lld\n",t[rt[1]]);return 0;
}
P6847-[CEOI2019]Magic Tree【dp,线段树合并】相关推荐
- [Poi2011]Tree Rotations线段树合并
整理一下线段树合并的思路,大体是给每个树上节点分配一个根编号建一棵log长的权值线段树,一开始树上只有这个树节点的节点权 merge两个树节点的时候,对于当前合并的值域(例如两棵线段树的表示1到n/2 ...
- BZOJ.2212.[POI2011]Tree Rotations(线段树合并)
题目链接 \(Description\) 给定一棵n个叶子的二叉树,每个叶节点有权值(1<=ai<=n).可以任意的交换两棵子树.问最后顺序遍历树得到的叶子权值序列中,最少的逆序对数是多少 ...
- 线段树合并与分裂维护树上最长上升子序列 + 点分治删点 ---- 2021 牛客多校第一场 C - Cut the tree(详解)
题目大意: 给你一个树,树上每个点都有一个权值valnodeval_{node}valnode,路径(u,v)(u,v)(u,v) 上所有点按顺序有序序列,令f(u,v)f(u,v)f(u,v)是这 ...
- 【九省联考2018】秘密袭击【树形dp】【生成函数】【线段树合并】【多项式插值】
题意:nnn 个点的带点权的树,点权最大值为 www,求所有连通子图第 kkk 大权值之和模 641236412364123. n,w≤1666n,w\leq 1666n,w≤1666,时限 5s. ...
- 【NOI2020】命运【树形dp】【线段树合并】
题意:给一棵 nnn 个点的树,每条边需要染成黑白两种颜色中的一种.给出 mmm 个条件,每个条件给出 u,vu,vu,v,其中 uuu 是 vvv 的祖先,要求 uuu 到 vvv 的链上至少一条黑 ...
- 数据结构之线段树合并——永无乡,Lomsat gelral,Tree Rotations,Tree Rotations Escape Through Leaf
文章目录 [HNOI2012]永无乡 Lomsat gelral 「POI2011 R2 Day2」旋转树木 Tree Rotations Escape Through Leaf 线段树合并与 fhq ...
- BZOJ5419[Noi2018]情报中心——线段树合并+虚树+树形DP
题目链接: [NOI2018]情报中心 题目大意:给出一棵n个节点的树,边有非负边权,并给出m条链,对于每条链有一个代价,要求选出两条有公共边的链使两条链的并的边权和-两条链的代价和最大. 花了一天的 ...
- Codeforces.700E.Cool Slogans(后缀自动机 线段树合并 DP)
题目链接 \(Description\) 给定一个字符串\(s[1]\).一个字符串序列\(s[\ ]\)满足\(s[i]\)至少在\(s[i-1]\)中出现过两次(\(i\geq 2\)).求最大的 ...
- 洛谷P4482 [BJWC2018]Border 的四种求法 字符串,SAM,线段树合并,线段树,树链剖分,DSU on Tree...
原文链接https://www.cnblogs.com/zhouzhendong/p/LuoguP4482.html 题意 给定一个字符串 S,有 q 次询问,每次给定两个数 L,R ,求 S[L.. ...
最新文章
- c# oldb连接_C#使用 OleDbConnection 连接读取Excel
- 超过100本的linux免费书籍
- 关于子对话框的创建与销毁
- 在定义SharePoint列表的SPD数据视图的时候需要注意的问题
- Hacker(22)----解除系统中的密码
- 改进初学者的PID-测量的比例介绍
- 最后解密的两弹元勋,众帅之帅朱光亚
- java web的动静分离_如何做前后端动静分离
- 前端知识笔记汇总200304
- 都快2022年了GraphQL还值得学吗?
- 计算机网络:overlay(VLAN,VxLAN)、underlay网络、大二层的介绍
- Kendo UI grid 表格数据更新
- 为什么黑客都用python-为什么大多数黑客都使用Python!
- 6.Exchanger-交换机
- 1.4 测试各阶段(单元、集成、系统 、Alpha、Beta、验收)
- 算法设计与分析期末复习题
- 原生H5+JS文件上传
- JavaWeb学习(较全较简)
- 微信公众号消息模板——Java
- Web Polygraph 安装
热门文章
- mySQL微信小程序的div_做一个微信小程序的完整流程
- 名片管理系统python详解_名的解释|名的意思|汉典“名”字的基本解释
- ajax和spa的区别,在XX团上消费过一次不正规的Spa,现在过来两个月公安局打电话叫我过去...
- linux删除第二列为空_Linux之基本文本处理工具(二)
- 机器学习之数据预处理——归一化,标准化
- java spring 拦截器_Spring MVC拦截器(Interceptor)的配置及使用
- typeorm_Nestjs 热更新 + typeorm 配置
- Deque(双向队列 c++模版实现 算法导论第三版第十章10.1-5题)
- python加载模型包占用内存多大_加载pickle python对象会占用大量内存
- word List 15