P6847-[CEOI2019]Magic Tree【dp,线段树合并】
正题
题目链接:https://www.luogu.com.cn/problem/P6847
题目大意
\(n\)个点的一棵树上,每个时刻可以割掉一些边,一些节点上有果实表示如果在\(d_i\)时刻这个点恰好不与\(1\)联通,那么就可以获得\(w_i\)的价值。
\(1\leq n,k\leq 10^5\)
解题思路
设\(f_{x,i}\)表示节点\(x\)在时刻\(i\)之前割掉时的最大权值那么相当与在儿子里面选一个最大的\(f_{y,j}(j\leq i)\)合并上来。
这是一个很经典的转移方式,和命运那题一样,直接用线段树合并维护就好了。
时间复杂度\(O(n\log k)\)
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,线段树合并】的更多相关文章
- BZOJ_2212_[Poi2011]Tree Rotations_线段树合并
BZOJ_2212_[Poi2011]Tree Rotations_线段树合并 Description Byteasar the gardener is growing a rare tree cal ...
- 【pkuwc2018】 【loj2537】 Minmax DP+线段树合并
今年年初的时候参加了PKUWC,结果当时这一题想了快$2h$都没有想出来.... 哇我太菜啦.... 昨天突然去搜了下哪里有题,发现$loj$上有于是就去做了下. 结果第一题我5分钟就把所有细节都想好 ...
- 【BZOJ2212】[Poi2011]Tree Rotations 线段树合并
[BZOJ2212][Poi2011]Tree Rotations Description Byteasar the gardener is growing a rare tree called Ro ...
- [BZOJ5461][LOJ#2537[PKUWC2018]Minimax(概率DP+线段树合并)
还是没有弄清楚线段树合并的时间复杂度是怎么保证的,就当是$O(m\log n)$吧. 这题有一个显然的DP,dp[i][j]表示节点i的值为j的概率,转移时维护前缀后缀和,将4项加起来就好了. 这个感 ...
- bzoj2212[Poi2011]Tree Rotations [线段树合并]
题面 bzoj ans = 两子树ans + min(左子在前逆序对数, 右子在前逆序对数) 线段树合并 #include <cstdio> #include <cstdlib> ...
- BZOJ2212 [Poi2011]Tree Rotations 线段树合并 逆序对
原文链接http://www.cnblogs.com/zhouzhendong/p/8079786.html 题目传送门 - BZOJ2212 题意概括 给一棵n(1≤n≤200000个叶子的二叉树, ...
- BZOJ.5461.[PKUWC2018]Minimax(DP 线段树合并)
BZOJ LOJ 令\(f[i][j]\)表示以\(i\)为根的子树,权值\(j\)作为根节点的概率. 设\(i\)的两棵子树分别为\(x,y\),记\(p_a\)表示\(f[x][a]\),\(p_ ...
- BZOJ.2212.[POI2011]Tree Rotations(线段树合并)
题目链接 \(Description\) 给定一棵n个叶子的二叉树,每个叶节点有权值(1<=ai<=n).可以任意的交换两棵子树.问最后顺序遍历树得到的叶子权值序列中,最少的逆序对数是多少 ...
- LOJ2537. 「PKUWC2018」Minimax【概率DP+线段树合并】
LINK 思路 首先暴力\(n^2\)是很好想的,就是把当前节点概率按照权值大小做前缀和和后缀和然后对于每一个值直接在另一个子树里面算出贡献和就可以了,注意乘上选最大的概率是小于当前权值的部分,选最小 ...
随机推荐
- python 日期、时间处理,各种日期时间格式/字符串之间的相互转换究竟是怎样的?
模块函数说明 ''' date 日期对象,常用的属性有year,month,day time 时间对象,常用的属性有hour,minute,second,毫秒 datetime 日期时间对象,常用的属 ...
- spring-cloud-sleuth+zipkin追踪服务
1, 父Maven pom 文件 <parent> <groupId>org.springframework.boot</groupId> <artifact ...
- ubuntu下配置JDK的一些坑点
ubuntu下配置JDK的一些坑点 在centos下的JDK配置: 在ubuntu下的话,要修改两个地方: 在/etc/enviornment中配置! 在/etc/profile中配置! 写在最后: ...
- WIN7下安装Python3.7和labelImg-1.7.0
安装python3.7 官方https://www.python.org/downloads/windows/,下载windows 64bit python3.7版本 用Administrator权限 ...
- SpringBoot笔记(5)
一.Web原生组件注入 1.使用Servlet API @ServletComponentScan(basePackages = "com.atguigu.admin") :指定原 ...
- Sublime Text 快速分别独立选中多行
效果图 直接上代码 import sublime, sublime_plugin # 独立选择每一行(在当前选中范围内) class SelectEverySingleLine(sublime_plu ...
- 简单C++线程池
简单C++线程池 Java 中有一个很方便的 ThreadPoolExecutor,可以用做线程池.想找一下 C++ 的类似设施,尤其是能方便理解底层原理可上手的.网上找到的 demo,基本都是介绍的 ...
- 手把手教你在 SuperEdge 上用 EdgeX Foundry 接入 IoT 设备
作者 连泓乔,华南理工计算机科学与技术大三在读,主要研究容器领域,Kubernetes.容器等云原生技术爱好者,SuperEdge 优秀贡献者. 王冬,腾讯云研发工程师,专注于 Kubernetes. ...
- Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo
Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo CountDownLatch countDownLatch这个类使一个线程等待其他线程 ...
- MybatisPlus(一)——
MybatisPlus https://www.cnblogs.com/JohanChan/p/14982870.html