bzoj4458 GTY的OJ (优先队列+倍增)
把超级钢琴放到了树上。
这次不用主席树了..本来以为会好写一点没想到细节更多(其实是树上细节多)
为了方便,对每个点把他的那个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 (优先队列+倍增)的更多相关文章
- 【贪心  计数  倍增】bzoj4458: GTY的OJ
		
倍增写挂调了半个晚上 Description 身为IOI金牌的gtyzs有自己的一个OJ,名曰GOJ.GOJ上的题目可谓是高质量而又经典,他在他的OJ里面定义了一个树形的分类目录,且两个相同级别的目录 ...
 - bzoj4458: GTY的OJ
		
题目大意:给定一棵带点权的有根树,同时给定L,R,要求找M条链,每条链满足以下条件的情况下,要求所有链权和最大: 1.两两不相同(可以包含/相交等) 2.节点数在[L,R]间 3.其中一个端点的深度必 ...
 - 【BZOJ4458】GTY的OJ
		
题面 Description 身为IOI金牌的gtyzs有自己的一个OJ,名曰GOJ.GOJ上的题目可谓是高质量而又经典,他在他的OJ里面定义了一个树形的分类目录,且两个相同级别的目录是不会重叠的.比 ...
 - 【BZOJ4458】GTY的OJ(树上超级钢琴)
		
点此看题面 大致题意: 给你一棵树,让你求出每一个节点向上的长度在\([l,r]\)范围内的路径权值和最大的\(m\)条路径的权值总和. 关于此题的数列版本 此题的数列版本,就是比较著名的[BZOJ2 ...
 - FJUT - OJ优先队列专题题解
		
题目链接http://120.78.128.11/Contest.jsp?cid=18 题面不贴了 都是英文题,看的我心力憔悴 =7= 一.Ugly Numbers 题目说一个数的质因数只包含2.3或 ...
 - bzoj AC倒序
		
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
 - 2018.10.29 NOIP2018模拟赛 解题报告
		
得分: \(70+60+0=130\)(\(T3\)来不及打了,结果爆\(0\)) \(T1\):简单的求和(点此看题面) 原题: [HDU4473]Exam 这道题其实就是上面那题的弱化版,只不过把 ...
 - NOIP2018赛前停课集训记(10.24~11.08)
		
前言 为了不久之后的\(NOIP2018\),我们的停课从今天(\(Oct\ 24th\))起正式开始了. 本来说要下周开始的,没想到竟提早了几天,真是一个惊喜.毕竟明天有语文考试.后天有科学考试,逃 ...
 - All Of ACM
		
数据结构和算法专栏,我会什么写什么 = = 不定时更新 一.数据结构 树状数组详解 线段树详解 二.算法 KMP算法 三.板子 我的代码模板 大整数模板 四.题解报告 几道STL题目(FJUT - ...
 
随机推荐
- Luogu  P1983 车站分级
			
(一周没写过随笔了) 这道题有坑! 看到题目,发现这么明显(??)的要求顺序,还有什么想法,拓扑! 将每条路范围内等级大于等于它的点(不能重复(坑点1))和它连一条边,注意起点终点都要有(坑点2),然 ...
 - flask, SQLAlchemy, sqlite3 实现 RESTful API 的 todo list, 同时支持form操作
			
flask, SQLAlchemy, sqlite3 实现 RESTful API, 同时支持form操作. 前端与后台的交互都采用json数据格式,原生javascript实现的ajax.其技术要点 ...
 - 【第十二课】FTP服务
			
目录 FTP服务 1.Linux下部署pure-ftpd 2.FTP的主动和被动模式 2.1.什么是主动FTP 2.2.什么是被动FTP 2.3.主动模式ftp与被动模式FTP优点和缺点: FTP服务 ...
 - CS190.1x-ML_lab1_review_student
			
这是CS190.1x第一次作业,主要教你如何使用numpy.numpy可以说是python科学计算的基础包了,用途非常广泛.相关ipynb文件见我github. 这次作业主要分成5个部分,分别是:数学 ...
 - CSS布局的一些技巧
			
max-width 通常使元素水平居中用的较多的方法为: #main { width: 600px; margin: 0 auto; } 但是,当浏览器窗口比元素的宽度还要窄时,浏览器会显示一个水平滚 ...
 - 软件测试_APP测试_兼容性测试
			
APP的兼容测试主要就是测试APP的安装.启动.运行.卸载测试,以及安装时间 .启动时间.CPU占用.内存占用.流量耗用.电量耗用等性能上的测试. 兼容性测试点: 一.内部兼容性: 1.与本地和其他主 ...
 - 用opencv实现工控机的开机录像
			
需要训练一个神经网络模型,可能需要用到很多视频数据,所以我想把手头的工控机设置为上电自启动,再借助opencv编译一个可执行文件,放在windows开机启动文件夹里,这样只要连接好摄像头和工控机以及电 ...
 - Python_Xlrd&Xlwt
			
import xlrd # \U 开始的字符被编译器认为是八进制 解决方法 r objWB = xlrd.open_workbook(r'C:\Users\IBM\Desktop\S1\7月下旬入库表 ...
 - 查看Python的版本、内建方法和模块等内容的方法
			
若想更好地应用Python帮助我们解决日常生活的问题,就必须了解清楚它的内建方法和模块等特性.相信不少同学在安装某个版本的Python后,对于内建方法之类都是一知半解,希望本文能帮助了解Python的 ...
 - Java内存区域的划分和异常
			
Java内存区域的划分和异常 运行时数据区域 JVM在运行Java程序时候会将内存划分为若干个不同的数据区域. 打开百度App,看更多美图 程序计数器 线程私有.可看作是当前线程所执行的字节码的行 ...