超级钢琴放到了树上。

这次不用主席树了..本来以为会好写一点没想到细节更多(其实是树上细节多)

为了方便,对每个点把他的那个L,R区间转化成两个深度a,b,表示从[a,b)选一个最小的前缀和(到根的和)减掉

为了更加方便,编号变为2~N+1,然后把2连到1上,1作为一个假根,权值为0

然后倍增去找那个a和b,记一记最小值的位置,然后劈开再加回到优先队列里就行了

 #include<bits/stdc++.h>
#define pa pair<int,int>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=5e5+;
const ll inf=1e12; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} struct Node{
int x,l,r,m;ll v;
};
bool operator < (Node a,Node b){return a.v<b.v;}
bool operator > (Node a,Node b){return a.v>b.v;}
int N,M,L,R;
int fa[maxn][],mi[maxn][],dep[maxn];
ll mn[maxn][],v[maxn];
priority_queue<Node> q; inline ll getrmq(int x,int l,int r,int &m){
if(l<=) return -inf;
ll vx=v[x];
for(int i=;i>=;i--){
if(fa[x][i]&&dep[fa[x][i]]>=l)
x=fa[x][i];
}
ll f=inf;
for(int i=;i>=;i--){
if(fa[x][i]&&dep[fa[x][i]]>=r){
if(mn[x][i]<f) f=mn[x][i],m=dep[mi[x][i]];
x=fa[x][i];
}
}
if(dep[x]>r&&mn[x][]<f) f=mn[x][],m=dep[mi[x][]];
// printf("%d %d\n",vx,f);
return vx-f;
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd();
for(i=;i<=N+;i++){
fa[i][]=rd()+;
}dep[]=;
for(i=;i<=N+;i++) v[i]=v[fa[i][]]+rd(),dep[i]=dep[fa[i][]]+;
M=rd(),L=rd(),R=rd(); for(i=;i<=N+;i++){
mn[i][]=v[i],mi[i][]=i;
for(j=;fa[i][j]&&fa[fa[i][j]][j];j++){
fa[i][j+]=fa[fa[i][j]][j];
if(mn[i][j]<mn[fa[i][j]][j]) mn[i][j+]=mn[i][j],mi[i][j+]=mi[i][j];
else mn[i][j+]=mn[fa[i][j]][j],mi[i][j+]=mi[fa[i][j]][j];
}
}
for(i=;i<=N+;i++){
Node p;
p.x=i,p.l=dep[i]-L,p.r=dep[i]-R-;
// printf("%d %d %d\n",p.x,p.l,p.r);
if(p.l<=) continue;
p.v=getrmq(p.x,p.l,p.r,p.m);
q.push(p);
}
ll ans=;
for(i=;i<=M;i++){
Node p=q.top();q.pop();
ans+=p.v;
if(p.m<p.l){
Node p1;
p1.x=p.x,p1.l=p.l,p1.r=p.m;
p1.v=getrmq(p1.x,p1.l,p1.r,p1.m);
q.push(p1);
}if(p.r<p.m-){
Node p2;
p2.x=p.x,p2.l=p.m-,p2.r=p.r;
p2.v=getrmq(p2.x,p2.l,p2.r,p2.m);
q.push(p2);
}
}
printf("%lld\n",ans);
return ;
}

bzoj4458 GTY的OJ (优先队列+倍增)的更多相关文章

  1. 【贪心 计数 倍增】bzoj4458: GTY的OJ

    倍增写挂调了半个晚上 Description 身为IOI金牌的gtyzs有自己的一个OJ,名曰GOJ.GOJ上的题目可谓是高质量而又经典,他在他的OJ里面定义了一个树形的分类目录,且两个相同级别的目录 ...

  2. bzoj4458: GTY的OJ

    题目大意:给定一棵带点权的有根树,同时给定L,R,要求找M条链,每条链满足以下条件的情况下,要求所有链权和最大: 1.两两不相同(可以包含/相交等) 2.节点数在[L,R]间 3.其中一个端点的深度必 ...

  3. 【BZOJ4458】GTY的OJ

    题面 Description 身为IOI金牌的gtyzs有自己的一个OJ,名曰GOJ.GOJ上的题目可谓是高质量而又经典,他在他的OJ里面定义了一个树形的分类目录,且两个相同级别的目录是不会重叠的.比 ...

  4. 【BZOJ4458】GTY的OJ(树上超级钢琴)

    点此看题面 大致题意: 给你一棵树,让你求出每一个节点向上的长度在\([l,r]\)范围内的路径权值和最大的\(m\)条路径的权值总和. 关于此题的数列版本 此题的数列版本,就是比较著名的[BZOJ2 ...

  5. FJUT - OJ优先队列专题题解

    题目链接http://120.78.128.11/Contest.jsp?cid=18 题面不贴了 都是英文题,看的我心力憔悴 =7= 一.Ugly Numbers 题目说一个数的质因数只包含2.3或 ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. 2018.10.29 NOIP2018模拟赛 解题报告

    得分: \(70+60+0=130\)(\(T3\)来不及打了,结果爆\(0\)) \(T1\):简单的求和(点此看题面) 原题: [HDU4473]Exam 这道题其实就是上面那题的弱化版,只不过把 ...

  8. NOIP2018赛前停课集训记(10.24~11.08)

    前言 为了不久之后的\(NOIP2018\),我们的停课从今天(\(Oct\ 24th\))起正式开始了. 本来说要下周开始的,没想到竟提早了几天,真是一个惊喜.毕竟明天有语文考试.后天有科学考试,逃 ...

  9. All Of ACM

    数据结构和算法专栏,我会什么写什么  = = 不定时更新 一.数据结构 树状数组详解 线段树详解 二.算法 KMP算法 三.板子 我的代码模板 大整数模板 四.题解报告 几道STL题目(FJUT - ...

随机推荐

  1. 2017-2018-2 20155203《网络对抗技术》 Exp8:Web基础

    基础问题回答 (1)什么是表单 我认为,form概念主要区分于table,table是用网页布局设计,是静态的,form是用于显示和收集信息传递到服务器和后台数据库中,是动态的: 以下是表单的百度百科 ...

  2. 【调试】Core Dump是什么?Linux下如何正确永久开启?

    [调试]Core Dump是什么?Linux下如何正确永久开启?

  3. MSBUILD : error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”

    问题 MSBUILD : error MSB3428: 未能加载 Visual C++ 组件"VCBuild.exe".要解决此问题,1) 安装 .NET Framework 2. ...

  4. 【Direct2D1.1初探】Direct2D特效概览

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 Direct2D是一个基于Direct3D的2D图形API,可以利用硬件加速特性来提供高性能高质量的2D渲染.但 ...

  5. 用信鸽来讲解HTTPS的知识

    加密是一个很难理解的东西,这里头满是数学证明.不过,除非你是在开发一个加密系统,否则无需了解那些高阶的复杂知识. 如果你看这篇文章是为了创造下一个 HTTPS 协议,很抱歉,请出门左走,鸽子是远远不够 ...

  6. 微软职位内部推荐-Sr. SE - Office incubation

    微软近期Open的职位: Senior Software Engineer-Office Incubation Office China team is looking for experienced ...

  7. 1093. Count PAT’s (25)-统计字符串中PAT出现的个数

    如题,统计PAT出现的个数,注意PAT不一定要相邻,看题目给的例子就知道了. num1代表目前为止P出现的个数,num12代表目前为止PA出现的个数,num123代表目前为止PAT出现的个数. 遇到P ...

  8. 《Linux内核设计与实现》读书笔记——第一、 二章

    <Linux内核设计与实现>读书笔记--第一. 二章 标签(空格分隔): 20135321余佳源 第一章 Linux内核简介 1.Unix内核特点 十分简洁:仅提供几百个系统调用并且有明确 ...

  9. 《linux内核分析》第六周:分析fork函数对应的系统调用处理过程

    一. 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235: 进程是 ...

  10. HashMap相关总结

    1.HashMap:根据键值hashCode值存储数据,大多数情况下可以直接定位到它的值,但是遍历顺序不确定.所有哈希值相同的值存储到同一个链表中                         Ha ...