CSP-S 2019 D1T2 括号树
题目链接:[https://www.luogu.com.cn/problem/P5658]
思路:
这道题不难。(为什么我在考场上一点思路也没有??)
假设我们已经处理到树上的节点u(假设1为根节点),那么可以知道:
\([1,u]的合法括号串数=[1,fa[u]]的合法括号串数+u处新增的合法括号串数\)
对于前者,直接继承即可。
对于后者,我们令f[u]表示u节点新增的合法括号串数,栈s表示还未被匹配的‘(’所处在的节点,那么可以得到:
- u的字符为‘(’:\(s[++top]=u,f[u]=0\)
- u的字符为‘)’:
---- 1. \(top==0\)(即栈为空)\(f[u]=0\)
---- 2. \(top>0\) (即栈非空)\(f[u]=f[fa[s[top]]]+1,top--\)
(意思是u处新得到的合法括号串数要么由\([1,fa[s[top]]\)(即栈顶父亲)\(]\)的合法括号串数加这对括号得到,要么由\(s[top]\)与\(u\)这对括号本身匹配得到)
具体实现:
用数组模拟栈即可。需要注意的是当搜索完部分子树后,栈s中某些元素可能会被覆盖,在这种情况下就需要回溯时在加回去(具体见代码)
注意事项:
做本题时态拘泥于以前的想法与思路,没有跳出来对本题进行分析。只对当前进行求解,没有对所有已求出来的量进行递推求解。
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=5e5+5;
int n,tot;
ll ans,f[N];
int fi[N],ne[N],to[N],s[N],fa[N];
char ch[N];
inline int read()
{
int s=0,w=1; char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')w=-1;
for(;isdigit(ch);ch=getchar())s=(s<<1)+(s<<3)+(ch^48);
return s*w;
}
inline void add(int x,int y)
{
ne[++tot]=fi[x],fi[x]=tot,to[tot]=y;
}
void dfs(int u,ll pre,int tp)
{
int pd=0;//pd即用来处理特殊情况的
if(ch[u]=='(') s[++tp]=u;
else
{
if(!tp) f[u]=0;
else
{
pd=s[tp];//要出栈了,记下此时的栈顶
f[u]=f[fa[s[tp]]]+1;
pre+=f[u];
tp--;
}
}
ans^=(u*pre);
for(int i=fi[u],v=to[i];i;v=to[i=ne[i]])
dfs(v,pre,tp);
if(pd) s[tp+1]=pd;//回溯时再加回来
}
int main()
{
n=read();
scanf("%s",ch+1);
for(int i=2;i<=n;++i)add(fa[i]=read(),i);
dfs(1,0,0);
printf("%lld\n",ans);
return 0;
}
CSP-S 2019 D1T2 括号树的更多相关文章
- 上午小测3 T1 括号序列 && luogu P5658 [CSP/S 2019 D1T2] 括号树 题解
前 言: 一直很想写这道括号树..毕竟是在去年折磨了我4个小时的题.... 上午小测3 T1 括号序列 前言: 原来这题是个dp啊...这几天出了好几道dp,我都没看出来,我竟然折磨菜. 考试的时候先 ...
- 【NOIP/CSP2019】D1T2 括号树
原题: 因为是NOIP题,所以首先先看特殊数据,前35分是一条长度不超过2000的链,N^2枚举所有子区间暴力check就能拿到分 其次可以思考特殊情况,一条链的情况怎么做 OI系列赛事的特殊性质分很 ...
- 「CSP-S 2019」括号树
[题目描述] 传送门 [题解] 是时候讨论一下我在考场上是怎么将这道题写挂的了 初看这道题毫无思路,先看看部分分吧 一条链的情况?设k[i]表示前i个括号的方案数 显然\(k[i]=k[i-1]+\) ...
- [CSP-S 2019]括号树
[CSP-S 2019]括号树 源代码: #include<cstdio> #include<cctype> #include<vector> inline int ...
- P5658 括号树
P5658 括号树 题解 太菜了啥都不会写只能水5分数据 啥都不会写只能翻题解 题解大大我错了 我们手动找一下规律 我们设 w[ i ] 为从根节点到结点 i 对答案的贡献,也就是走到结点 i ,合 ...
- [CSP-S2019]括号树 题解
CSP-S2 2019 D1T2 刚开考的时候先大概浏览了一遍题目,闻到一股浓浓的stack气息 调了差不多1h才调完,加上T1用了1.5h+ 然而T3还是没写出来,滚粗 思路分析 很容易想到的常规操 ...
- 「WC 2019」数树
「WC 2019」数树 一道涨姿势的EGF好题,官方题解我并没有完全看懂,尝试用指数型生成函数和组合意义的角度推了一波.考场上只得了 44 分也暴露了我在数数的一些基本套路上的不足,后面的 \(\ex ...
- 【题解】#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT)
[题解]#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT) 之前做这道题不理解,有一点走火入魔了,甚至想要一本近世代数来看,然后通过人类智慧思考后发现, ...
- CSP2019 括号树
Description: 给定括号树,每个节点都是 ( 或 ) ,定义节点的权值为根到该节点的简单路径所构成的括号序列中不同合法子串的个数(子串需要连续,子串所在的位置不同即为不同.)与节点编号的乘积 ...
随机推荐
- 近期学习python的小问题及解决方案
①定义空的二维列表来读取放置文件的内容: 在python中定义二维数组 - woshare - 博客园https://www.cnblogs.com/woshare/p/5823303.html ②调 ...
- Java 处理异常 9 个最佳实践,你知道几个?
1. 在Finally中清理资源或者使用Try-With-Resource语句 使用Finally Java 7的Try-With-Resource语句 2. 给出准确的异常处理信息 3. 记录你所指 ...
- windows下安装phpredis扩展
根据phpyinfo获取自己的php信息 x86,php5.6,TS,VC11 在pecl网站上找到对应的版本 5.6 Thread Safe (TS) x86 https://pecl.php.ne ...
- centos7上使用git clone出现问题
centos 7 git clone时出现不支持协议版本的问题 unable to access 'https://github.com/baloonwj/TeamTalk.git/': Peer ...
- MySQL-8.0.16 的安装与配置
最近老是安装mysql, 但是由于各个环境下文件不互通,所以感觉笔记还是记录在这里比较方便.以下内容,是对网络上大家的笔记的搜集和整理,并经过自己的实践,记录下来.以便,让大家更好.更快的配置mysq ...
- orangepi设置vnc开机自启动
首先需要创建一个文件,执行以下命令,自动打开空白文件,在里面编辑内容即可 sudo gedit /etc/init.d/tightvncserver 把以下内容粘贴进去,然后点击保存即可. #!/bi ...
- 如何在SAP云平台ABAP编程环境里创建自己的Z表
选中ABAP包,右键创建一个新的Database Table: 维护表名为ZBOOKING: 表实现的源代码: @EndUserText.label : 'Jerry''s booking' @Aba ...
- GNU/Linux 介绍
在了解Linux之前要先了解什么是GNU / GNU官方解释? GNU是一个自由软件操作系统.就是说,它尊重其使用者的自由.GNU操作系统包括GNU软件包(专门由GNU工程发布的程序)和由第三方发布的 ...
- Docker基础理论整理(精简)
目录 一.什么是docker,docker的概念 二.docker中的镜像 三.docker中的容器 四.docker中的仓库 五.docker的网络通信 bridge模式 host模式 contai ...
- Flutter——TabBar组件(顶部Tab切换组件)
TabBar组件的常用属性: 属性 描述 tabs 显示的标签内容,一般使用 Tab 对象,也可以是其他的Widget controller TabController 对象 isScrollabl ...