[是男人就过8题——Pony.ai]Perfect N-P Arrays
[是男人就过8题——Pony.ai]Perfect N-P Arrays
题目大意:
一棵\(n(\sum n\le5\times10^6)\)个结点的树,每个结点都有一个括号。求树上一个合法的括号序列使得若将'('当成\(1\),')'当成\(-1\)。该序列最大前缀和最大,输出最大前缀和。
思路:
由于括号序列前缀和是连续的,所以我们可以把括号序列任意时刻前缀和\(\ge 0\)的限制给去掉。两遍树形DP求出从一个点出发最大/最小前缀和。绝对值取\(\min\)后即为经过这个点的最大答案。注意到最大/最小前缀和可能来自于同一棵子树,因此我们还需记录次大/次小值。
源代码:
#include<cstdio>
#include<cctype>
#include<vector>
#include<climits>
#include<algorithm>
inline int getint() {
register char ch;
register bool neg=false;
while(!isdigit(ch=getchar())) neg|=ch=='-';
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return neg?-x:x;
}
const int N=1e6+1;
std::vector<int> e[N];
int w[N],ans,max[N][2],min[N][2];
inline void add_edge(const int &u,const int &v) {
e[u].push_back(v);
e[v].push_back(u);
}
inline void upd1(const int &x,const int &y) {
int tmp1=min[y][0]+w[x];
int tmp2=max[y][0]+w[x];
for(register int i=0;i<2;i++) {
if(tmp1<min[x][i]) {
std::swap(tmp1,min[x][i]);
}
if(tmp2>max[x][i]) {
std::swap(tmp2,max[x][i]);
}
}
}
inline void upd2(const int &x,const int &y) {
int tmp1=min[y][min[y][0]==min[x][0]+w[y]];
int tmp2=max[y][max[y][0]==max[x][0]+w[y]];
if(tmp1!=INT_MAX) tmp1+=w[x];
if(tmp2!=INT_MIN) tmp2+=w[x];
for(register int i=0;i<2;i++) {
if(tmp1!=INT_MAX&&tmp1<min[x][i]) {
std::swap(tmp1,min[x][i]);
}
if(tmp2!=INT_MIN&&tmp2>max[x][i]) {
std::swap(tmp2,max[x][i]);
}
}
}
void dfs1(const int &x,const int &par) {
max[x][0]=min[x][0]=w[x];
max[x][1]=INT_MIN;
min[x][1]=INT_MAX;
for(auto &y:e[x]) {
if(y==par) continue;
dfs1(y,x);
upd1(x,y);
}
}
void dfs2(const int &x,const int &par) {
for(auto &y:e[x]) {
if(y==par) continue;
ans=std::max(ans,std::min(std::abs(max[y][0]),std::abs(min[x][min[x][0]==min[y][0]+w[x]])));
ans=std::max(ans,std::min(std::abs(min[y][0]),std::abs(max[x][max[x][0]==max[y][0]+w[x]])));
upd2(y,x);
dfs2(y,x);
}
}
int main() {
int n;
while(~scanf("%d",&n)) {
for(register int i=1;i<=n;i++) {
const int p=getint();
if(p) add_edge(p,i);
w[i]=getint();
}
dfs1(1,0);
dfs2(1,0);
printf("%d\n",ans);
for(register int i=1;i<=n;i++) {
e[i].clear();
}
ans=0;
}
return 0;
}
[是男人就过8题——Pony.ai]Perfect N-P Arrays的更多相关文章
- 【计蒜客】是男人就过 8 题--Pony.AI 题 A. A String Game 后缀自动机+SG函数
[题目]A. A String Game [题意]给定目标串S和n个子串Ti,Alice和Bob轮流选择一个子串操作,必须且只能在子串末尾添加一个字符使得新串也是S的子串,不能操作即输,求胜利者.|S ...
- 是男人就过 8 题--Pony.AI A AStringGame
链接:https://www.nowcoder.com/acm/contest/92/A来源:牛客网 AStringGame 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 26214 ...
- 是男人就过八题A_A String Game题解
题意 给一个字符串\(s\),和\(n\)个子串\(t[i]\),两个人博弈,每次取出一个串\(t[i]\),在后面加入一个字符,保证新字符串仍然是\(s\)的子串,无法操作的人输. 分析 n个子串, ...
- leetcode第四题:Median of Two Sorted Arrays (java)
Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respectively. Find t ...
- Kotlin实现LeetCode算法题之Median of Two Sorted Arrays
题目Median of Two Sorted Arrays(难度Hard) 方案1,数组合并&排序调用Java方法 import java.util.* class Solution { fu ...
- FCC JS基础算法题(5):Return Largest Numbers in Arrays(找出多个数组中的最大数)
题目描述: 找出多个数组中的最大数右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组.提示:你可以用for循环来迭代数组,并通过arr[i]的方式来访问数组 ...
- 【LeetCode每天一题】Median of Two Sorted Arrays(两数组中的中位数)
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the tw ...
- 算法题之Median of Two Sorted Arrays
这道题是LeetCode上的题目,难度级别为5,刚开始做没有找到好的思路,以为是自己智商比较低,后来发现确实也比较低... 题目: There are two sorted arrays nums1 ...
- 刷题4. Median of Two Sorted Arrays
一.题目 Median of Two Sorted Arrays,具体请自行搜索. 这个题目,我看了一下,经过一番思考,我觉得实现起来不是很复杂. 但要做到bug free也不难,最大的问题是性能问题 ...
随机推荐
- python之shelve模块详解
一.定义 Shelve是对象持久化保存方法,将对象保存到文件里面,缺省(即默认)的数据存储文件是二进制的. 二.用途 可以作为一个简单的数据存储方案. 三.用法 使用时,只需要使用open函数获取一个 ...
- 前端面试题整理—JavaScript篇(二)
1.使用js实现一个可持续的动画 2.实现一个可以自由拖动的悬浮框 3.实现一个倒计时效果 4.使用js仿写一个原生下拉列表框 5.创建10个<a>标签,点击的时候弹出对应的序号 6.实现 ...
- API.day01
第1部分 JDK API 1.1 API(Application Programming Interface,应用接口程序):已经封装好可以直接调用的功能(Java中以类的形式封装) 经常使用的JDK ...
- 分享一个jsonp劫持造成的新浪某社区CSRF蠕虫
最近jsonp很火,实话说已经是被玩烂了的,只是一直没有受到大家的重视.正好在上个月,我挖过一个由于jsonp造成的新浪某社区CSRF,当时是为了准备一篇文章,之后这篇文章也会拿出来分享. 因为新浪已 ...
- 删除对象的某个属性 delete
有时候我们可能会遇到需要删除一个对象的某个属性的这种情况,保留剩下的,不想遍历,那我们就可以使用delete操作符, let obj = { a: 1, b: 2, c: 3 } delete obj ...
- Codeforces 544E K Balanced Teams (DP)
题目: You are a coach at your local university. There are nn students under your supervision, the prog ...
- linux redis 主从复制
在从服务的redis.conf 添加 slaveof 主服务器 端口 查看reids进程和端口,都是存在的.只是ip地址是127.0.0.1而不是0.0.0.0,只是本机能使用; 查找redis的配置 ...
- 根据SQL_ID查询并杀会话
Oracle 根据SQL_ID查询并杀会话,清空执行计划缓冲池2018年09月06日 10:31:40 小学生汤米 阅读数:4731. 查询最近五分钟内最高频次SQL,查看event select t ...
- spring boot 2.0 neo4j 使用
参考文档 官方文档 http://spring.io/projects/spring-data-neo4j#learn https://docs.spring.io/spring-data/neo4j ...
- 分布式版本控制系统-git
Git是目前世界上最先进的分布式版本控制系统 SVN是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢?这个可以找度娘...... 1.安装Git yum i ...