CSP-S2 2019 D1T2

刚开考的时候先大概浏览了一遍题目,闻到一股浓浓的stack气息

调了差不多1h才调完,加上T1用了1.5h+ 然而T3还是没写出来,滚粗


思路分析

很容易想到的常规操作,把“(”用1、“)”用-1表示。

可以想到一种暴力的做法,不断从根节点向下暴力匹配,同时统计合法个数。至于如何匹配,看到括号匹配,很自然就想到开个栈来存储从根节点到当前节点的括号,当当前节点与栈顶匹配,就把栈顶弹出,答案自加。

这个题目比较好处理的一点就是如果一个合法括号内有不合法的也是不能计入答案的,这个大大降低了处理的难度。~~至少对于我这种蒟蒻是这样~~

很显然,每次从根节点重新统计过于浪费时间。可以想到,对于非根节点的所有节点,答案一定不小于其父亲节点的答案,也就是说,从根节点到其父亲节点可行的合法括号串,到该节点一样可行。这样就快多了。

还有一种情况,就是几个合法括号串相连构成的合法括号串。和之前一样的思想,从祖先节点往下推:记录以每个节点为结尾的合法括号串个数,每找到一个合法括号串,查询以该串起始节点的父节点为结尾的合法括号串个数,显然,这些括号串加上后面这一个合法括号串是可以构成一个新合法括号串的,再加上最新的这一个,加1即可。

但是还有一个问题,一个节点可能会有多个子节点,而执行dfs时,其中某些子节点会对栈的状态产生影响,导致各个子节点最开始的栈状态不同。因此,在回溯前要将栈恢复到原来的状态。这个很好实现,只要将原本删掉的节点加回去即可。

这样就结束了。不会很难,细节稍多,不过样例很良心,基本能够调出所有的bug。

最后吐槽一下把我电脑臭爆栈的大样例 现在洛谷上臭不到,但是T1...

可以看出大样例就是一条链,并且链上就是类似“()()()...()()()”这样的,实际上意义不大,爆栈了测不了也不要紧,实现的时候完全可以用一个类似的小样例来测。大样例唯一的作用就是提醒我要开long long 。

#include<iostream>
#include<cstdio>
#include<stack>
#define ll long long
using namespace std;
const int N=5e5+1000;
int n,tot;
ll ans;
int head[N],ver[N],Next[N];
int w[N],f[N];
ll tail[N],sum[N];
bool v[N];
char c;
stack<int> q;
void add(int x,int y)
{
ver[++tot]=y,Next[tot]=head[x],head[x]=tot;
}
void dfs(int x)
{
int y=0;
if(q.size() && w[q.top()]+w[x]==0 && w[x]==-1)
{
y=q.top();q.pop();v[y]=0;
tail[x]=tail[f[y]]+1;
}
else
q.push(x),v[x]=1;
sum[x]=sum[f[x]]+tail[x];
for(int i=head[x];i;i=Next[i])
dfs(ver[i]);
if(v[x])
q.pop(),v[x]=0;
if(y)
q.push(y),v[y]=1;
}
int main()
{
scanf("%d",&n);q.push(0);
for(int i=0;i<n;i++)
{
cin>>c;
if(c=='(')
w[i+1]=1;
else
w[i+1]=-1;
}
for(int i=2;i<=n;i++)
{
scanf("%d",&f[i]);
add(f[i],i);
}
dfs(1);
for(int i=1;i<=n;i++)
ans^=(ll)i*sum[i];
printf("%lld",ans);
return 0;
}

[CSP-S2019]括号树 题解的更多相关文章

  1. 上午小测3 T1 括号序列 && luogu P5658 [CSP/S 2019 D1T2] 括号树 题解

    前 言: 一直很想写这道括号树..毕竟是在去年折磨了我4个小时的题.... 上午小测3 T1 括号序列 前言: 原来这题是个dp啊...这几天出了好几道dp,我都没看出来,我竟然折磨菜. 考试的时候先 ...

  2. 【CSP2019】括号树 题解(递推+链表)

    前言:抽时间做了做这道题,把学长送退役的题. ----------------- 题目链接 题目大意:定义$()$是合法括号串.如果$A,B$是合法括号串,那么$(AB),AB$为合法括号串.现给定根 ...

  3. 洛谷 P5658 括号树 题解

    原题链接 简要题意: 求出以从每个节点到根形成的括号序列的合法对数. 算法一 观察到 \(n \leq 8\) ,所以我们可以用 纯粹的暴力 . 用 \(O(n)\) 时间得出当前节点到根的字符串. ...

  4. P5658 括号树

    P5658 括号树 题解 太菜了啥都不会写只能水5分数据 啥都不会写只能翻题解  题解大大我错了 我们手动找一下规律 我们设 w[ i ] 为从根节点到结点 i 对答案的贡献,也就是走到结点 i ,合 ...

  5. Vijos1448校门外的树 题解

    Vijos1448校门外的树 题解 描述: 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现 ...

  6. [CSP-S 2019]括号树

    [CSP-S 2019]括号树 源代码: #include<cstdio> #include<cctype> #include<vector> inline int ...

  7. CSP2019 括号树

    Description: 给定括号树,每个节点都是 ( 或 ) ,定义节点的权值为根到该节点的简单路径所构成的括号序列中不同合法子串的个数(子串需要连续,子串所在的位置不同即为不同.)与节点编号的乘积 ...

  8. 2021.08.09 P5658 括号树(树形结构)

    2021.08.09 P5658 括号树(树形结构) [P5658 CSP-S2019] 括号树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 太长,在链接中. 分析及代码 ...

  9. 题解【洛谷P5658】[CSP-S 2019]括号树

    题面 一道简单的栈与\(\text{DP}\)的结合. 首先介绍一下序列上的括号匹配问题,也就是此题在序列上的做法: 设 \(dp_i\) 表示以 \(i\) 结尾的合法的括号序列个数, \(ss_i ...

随机推荐

  1. PHP array_walk_recursive() 函数

    实例 对数组中的每个元素应用用户自定义函数: <?phpfunction myfunction($value,$key){echo "The key $key has the valu ...

  2. PHP rsort() 函数

    实例 对数组 $cars 中的元素按字母进行降序排序: <?php$cars=array("Volvo","BMW","Toyota" ...

  3. 7.29 NOI模拟赛 题答 npc问题 三染色 随机 贪心

    LINK:03colors 这道题虽然绝大多数的人都获得了满分 可是我却没有. 老师讲题的时候讲到了做题答的几个技巧 这里总结一下. 数据强度大概为n=5000,m=60000的随机数据. 老师说:一 ...

  4. luogu P4726 【模板】多项式指数函数 多项式 exp 牛顿迭代 泰勒展开

    LINK:多项式 exp 做多项式的题 简直在嗑药. 前置只是 泰勒展开 这个东西用于 对于一个函数f(x) 我们不好得到 其在x处的取值. 所以另外设一个函数g(x) 来在x点处无限逼近f(x). ...

  5. windows:进程查杀

    windows平台中,某些进程做了各种保护,比如hook了terminateProcess,又或者注册了进程终止函数的回调.当调用这些API或任务管理器终止该进程时,会被绕过,典型如某些杀毒软件,怎么 ...

  6. HashMap:从源码分析到面试题

    1 HashMap简介 HashMap是实现map接口的一个重要实现类,在我们无论是日常还是面试,以及工作中都是一个经常用到角色.它的结构如下: 它的底层是用我们的哈希表和红黑树组成的.所以我们在学习 ...

  7. 使用selenium再次爬取疫情数据(链接数据库)

    爬取网页地址: 丁香医生 数据库连接代码: def db_connect(): try: db=pymysql.connect('localhost','root','zzm666','payiqin ...

  8. 37 Reasons why your Neural Network is not working

    37 Reasons why your Neural Network is not working Neural Network Check List 如何使用这个指南 数据问题 检查输入数据 试一下 ...

  9. C#算法设计之知识储备

    前言 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/669 访问. 算法的讨论具有一定的规则,其中也包含一些不成文的约定 ...

  10. 提前批笔试一道算法题的Java实现

    题目描述 这是2021广联达校招提前批笔试算法题之一. 我们希望一个序列中的元素是各不相同的,但是理想和显示往往是有差距的.现在给出一个序列A,其中难免有相同的元素,现在提供了一种变化方式,使得经过若 ...