题解:上树的超级钢琴 我们考虑dfs的时候直接由父亲转移而来 那么我们对于每个节点则维护是这点到根路径上的分布情况 那么转化为序列上的问题 这也就和超级钢琴本质上是一样的了

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#include <cmath>
#include <set>
#include <map>
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define link(x) for(edge *j=h[x];j;j=j->next)
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
const int MAXN=5e5+10;
const double eps=1e-8;
#define ll long long
const ll inf=1e18;
using namespace std;
struct edge{int t;edge*next;}e[MAXN<<1],*h[MAXN],*o=e;
void add(int x,int y){o->t=y;o->next=h[x];h[x]=o++;}
ll read(){ll x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();return x*f;
}
typedef struct Node{int id,l,r,pos;ll ans;friend bool operator <(Node aa,Node bb){return aa.ans<bb.ans;}
}Node;
priority_queue<Node>que;
typedef struct node{int l,r,pos;ll sum,flag;
}node;
node d[MAXN*31];
int cnt,n,m,L,R,dep[MAXN],rt[MAXN],a[MAXN];
void up(int x,int l,int r){d[x].sum=d[d[x].l].sum+d[x].flag,d[x].pos=d[d[x].l].pos;if(!d[x].pos)d[x].pos=l;if(d[d[x].r].sum+d[x].flag>d[x].sum){d[x].sum=d[d[x].r].sum+d[x].flag,d[x].pos=d[d[x].r].pos;if(!d[x].pos)d[x].pos=r;}
}
void update(int &x,int y,int l,int r,int ql,int qr,int vul){x=++cnt;d[x]=d[y];if(!d[x].pos)d[x].pos=l;if(ql<=l&&r<=qr){d[x].sum+=vul;d[x].flag+=vul;return ;}int mid=(l+r)>>1;if(ql<=mid)update(d[x].l,d[y].l,l,mid,ql,qr,vul);if(qr>mid)update(d[x].r,d[y].r,mid+1,r,ql,qr,vul);up(x,l,r);
}
ll maxx;int id;
void querty(int x,int l,int r,int ql,int qr,ll tag){if(!x){if(tag>maxx)maxx=tag,id=l;return ;}if(ql<=l&&r<=qr){if(d[x].sum+tag>maxx)maxx=d[x].sum+tag,id=d[x].pos;return ;}int mid=(l+r)>>1;if(ql<=mid)querty(d[x].l,l,mid,ql,qr,tag+d[x].flag);if(qr>mid)querty(d[x].r,mid+1,r,ql,qr,tag+d[x].flag);
}void dfs(int x,int deep,int fa){dep[x]=deep+1;update(rt[x],rt[fa],1,n,1,dep[x],a[x]);link(x){if(j->t!=fa){dfs(j->t,deep+1,x);}}
}
void slove(){inc(i,1,n){if(dep[i]<L)continue;maxx=-inf;querty(rt[i],1,n,max(1,dep[i]-R+1),dep[i]-L+1,0);que.push((Node){i,max(1,dep[i]-R+1),dep[i]-L+1,id,maxx});}ll ans=0;inc(i,1,m){Node t=que.top();que.pop();ans+=t.ans;if(t.pos>t.l)maxx=-inf,querty(rt[t.id],1,n,t.l,t.pos-1,0),que.push((Node){t.id,t.l,t.pos-1,id,maxx});if(t.pos<t.r)maxx=-inf,querty(rt[t.id],1,n,t.pos+1,t.r,0),que.push((Node){t.id,t.pos+1,t.r,id,maxx});}printf("%lld\n",ans);
}
int main(){n=read();int t;inc(i,1,n)t=read(),add(i,t),add(t,i);inc(i,1,n)a[i]=read();m=read();L=read();R=read();dfs(1,0,0);slove();
}

 

4458: GTY的OJ

Time Limit: 40 Sec  Memory Limit: 512 MB
Submit: 167  Solved: 72
[Submit][Status][Discuss]

Description

身为IOI金牌的gtyzs有自己的一个OJ,名曰GOJ。GOJ上的题目可谓是高质量而又经典,他在他的OJ里面定义了一个树形的分类目录,且两个相同级别的目录是不会重叠的。比如图论的大目录下可能分为最短路,最小生成树,网络流等低一级的分类目录,这些目录下可能还有更低一级的目录,以此类推。现在gtyzs接到了一个任务,要他为SDTSC出题。他准备在自己的OJ题库中找出M道题作为SDTSC的试题,而他深知SDTSC的童鞋们个个都是神犇,所以gtyzs认为自己出的这M道题中,每道题都应该属于不少于L种分类目录;可他又怕自己的题没有人会做,所以每道题也应该属于不超过R种分类目录,并且这些分类目录应该是连续的,不能出现断层。对了,最重要的是,不存在一道题,它属于两个分类目录且这两个目录不是包含关系。(比如不存在一道题它既是一道DP题,又是一道网络流题)gtyzs怕被骂,所以他希望不存在任意的一对题目(u,v),使得u所属的分类目录与v完全相同。举例来说,gtyzs不能出两道同样的都是动态规划,背包的题,但是却可以出一道属于动态规划,背包和01背包的题和一道属于背包,01背包的题,当然也可以出一个属于图论的题和一个属于数论的题。(注意:一道题所属的分类目录不一定从根开始,如加粗部分所示)
为了让自己的题目变得更加靠谱,他给每一个分类目录都定了一个靠谱值ai,这个值可正可负。一道题的靠谱度为其从属的分类目录靠谱值的加和。我们假设动态规划的靠谱值为10,插头DP的靠谱值为-5,则一道动态规划插头DP的题的靠谱值就是5。gtyzs希望自己出的这M道题,在满足上述前提条件下,靠谱度总和最大。gtyzs当然会做啦,于是你就看到了这个题。

Input

输入的第一行是一个正整数N,代表分类目录的总数。
接下来的一行,共N个正整数,第i个正整数为fi,表示分类目录i被fi所包含。保证一个分类目录只会被一个分类目录所包含,且包含关系不存在环。特别的,fi=0表示它是根节点,我们保证这样的点只存在一个。
接下来的一行,共N个整数,第i个数表示ai。
最后一行,三个正整数M,L,R。
对于100%的数据,1≤N≤500,000,1≤M≤500,000,|ai|≤2,000。保证输入数据有解。
为了方便,所有的测试数据中都有f1=0,且对于任意的i∈[2,N],有fi<i。

Output

一行一个整数,表示最大的靠谱度。

Sample Input

7
0 1 1 2 2 3 3
2 3 4 1 2 3 4
3 3 3

Sample Output

26

转载于:https://www.cnblogs.com/wang9897/p/9635014.html

BZOJ4458: GTY的OJ相关推荐

  1. 【BZOJ4458】GTY的OJ

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

  2. 南大算法设计与分析课程OJ答案代码(5)--割点与桥和任务调度问题

    问题 A: 割点与桥 时间限制: 1 Sec  内存限制: 5 MB 提交: 475  解决: 34 提交 状态 算法问答 题目描述 给出一个无向连通图,找到所有的割点和桥 输入 第一行:点的个数,如 ...

  3. 【ACM】杭电OJ 2037

    题目链接:杭电OJ 2037 先把b[i]进行排序,然后,b[i]与a[i+1]进行比较. #include <iostream> #include <cstdio> #inc ...

  4. 【ACM】杭电OJ 2020(排序)

    题目链接:杭电OJ 2020 排序可以有冒泡排序,选择排序,或者直接调用函数. 下面是选择排序: #include <stdio.h> #include <math.h> in ...

  5. 【ACM】杭电OJ 2018

    题目链接:杭电OJ 2018 从n>4开始,每一年的牛的数量=前一年的牛的数量+三年前的牛的数量 问:为什么是三年前? 答:假设三年前有一头小牛出生,出生的那一年即为第一年,到了第四年,即三年后 ...

  6. 【ACM】杭电OJ 1005

     题目链接:杭电OJ 1005 超时代码如下(而且开辟的数组空间大小不够): #include <stdio.h> int m[100000]; int f(int n,int a,int ...

  7. 【ACM】杭电OJ 1004

     题目链接:杭电OJ 1004 运行环境:Dev-C++ 5.11 思路: 先把先把num数组全部赋值为1:第一个颜色单独输入,从第二个开始,需要与前面的进行比较,如果前面有相同的颜色,则在目前的nu ...

  8. 【ACM】杭电OJ 2012。

    题目链接:杭电OJ 2012 思路很简单,但是有一种高效算法显示编译错误,不知道为什么 运行环境:VS2017 AC代码: #include <stdio.h> #include < ...

  9. 【ACM】杭电OJ 1003。

    运行环境VS2017  题目链接:杭电OJ 1003 主要思想是: 用d[i]来存放前i项中最大的和,得到end,然后再倒推,得起始的位置begin 然而在程序42行的疑问,大家可以讨论一下吗???? ...

最新文章

  1. 模型类序列化器ModelSerializer
  2. 《JavaScript高效图形编程(修订版)》——6.2 位图、矢量图,或两者兼而有之?...
  3. util类中非静态方法中注入serivce,在controller层是使用util。
  4. 强制关闭虚拟机后问题+解决
  5. HarmonyOS之AI能力·实体识别
  6. 面试 jsp转发和重定向
  7. 绝地求生7月5日服务器维护,绝地求生7月5日更新到几点 吃鸡更新维护公告
  8. 水系图一般在哪里找得到_进展 | 水系钠离子电池研究取得重要进展
  9. Java工作笔记-WebService使用JDK搭建WebService及调用
  10. 自我训练——时间控制能力(四)
  11. docker部署sprinboot项目
  12. H3C 典型数据链路层标准
  13. Msql自定义函数和存储过程
  14. win10安装配置nginx
  15. 计算方法(三)分段线性插值和Hermite插值
  16. 将yolo格式数据集转换为coco格式数据集
  17. python基本写法_Python的表达式写法
  18. 流量为王时代,APP推广需要解决难题,如何解决分享绑定上下级关系。
  19. BigDecimal源码分析。
  20. 非梯度类启发式搜索算法:Nelder Mead

热门文章

  1. MongoDB实战(11)Sharding 分片(上)
  2. 防碰撞算法c语言,RFID防碰撞 二进制树形搜索算法 C语言实现
  3. 无人驾驶插秧机智能辅助系统_无人驾驶插秧机搭载北斗导航驾驶系统,误差仅在2.5厘米内...
  4. jmeter404_JMeter – 如何记录失败的响应的完整请求?
  5. decode 大于比较 小于_关于Decode的用法,是不是里面的条件项不能超过10?
  6. 疑似Bug:简书安卓10.7首页搜索关键字屏蔽敏感词不彻底
  7. ArcGIS制图表达Representation-规则和几何效果
  8. 计算机cmos芯片用途,什么是CMOS,它有什么用途?
  9. 字母大小写全排列C语言,14种模式解决面试算法编程题(PART II)
  10. linux系统信息 命令,Linux_Linux系统信息查看命令大全,系统    # uname -a # - phpStudy...