前言:抽时间做了做这道题,把学长送退役的题。

-----------------

题目链接

题目大意:定义$()$是合法括号串。如果$A,B$是合法括号串,那么$(AB),AB$为合法括号串。现给定根节点为$1$的一棵树,每个节点有一个括号。定义$s_i$是从根节点到$i$结点的括号串,$k_i$是$s_i$的合法子串,求$1*k_1 \ xor \ 2*k_2 \ xor \cdots \ n*k_n$。

这道题其实实现起来并不难,重要的是思维。我也是想了快一个小时才推出来式子QAQ。

可以发现,合法的括号串模型,无非就三种:

1.$combo$式:$()()()\cdots ()$

2.套娃式:$(((((\cdots )))))$

3.混合式:$((()()\cdots ()()))$

很明显,对于$combo$式,如果末尾再添加一个合法括号串,那么对答案肯定又有很多贡献。我们先来简单推一推式子:

假设先前有$n-1$个连续的合法括号串,现在在末尾添加了一个。

先前的答案:$(n-1)+\frac{(n-1)*(n-2)}{2}=\frac{n*(n-1)}{2}$

现在的答案:$n+\frac{n*(n-1)}{2}=\frac{n*(n+1)}{2}$

答案增加了$n$。

这对我们来说是个好消息,因为我们只要记录一下先前连续的合法括号串有多少个,就可以$O(1)$求出现在的答案。

答案是不是开始浮出水面了?

对于套娃和混合式,我们把它当作一个合法括号串,它们里面的答案由先前的递推来解决。

设$sum[i]$表示考虑前$i$个括号其合法的子串数量,$c[i]$表示截止到$i$为止连续的合法括号串数量。如果遇到$($,我们就让它入栈,遇到$)$就统计答案,有递推式:

$sum[now]=sum[fa[now]]+c[fa[st[tot]]]+1,c[now]=c[fa[st[tot]]]+1,tot--$

这样写对于序列没有任何问题,但是遇到树形结构就萎了:树是递归遍历的,用栈来维护可能会改变先前的括号顺序。所以我们要用链表来维护左括号序列。

剩下的就没有什么难的了。注意一些小细节:开long long,注意链表已经是否到头,等等。

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=;
int fa[maxn],last[maxn*],c[maxn],sum[maxn],head[maxn],n,tot,cnt,ans;
char ch[maxn];
struct node
{
int next,to;
}edge[maxn];
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if (ch=='-') f=-;ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return x*f;
}
inline void add(int from,int to)
{
edge[++cnt].next=head[from];
edge[cnt].to=to;
head[from]=cnt;
}
inline void dfs(int now)
{
sum[now]=sum[fa[now]];
if (ch[now]==')'){
if (last[now]) c[now]=c[last[now]]+,sum[now]+=c[now];
last[now]=last[last[now]];
}
ans^=now*sum[now];
for (int i=head[now];i;i=edge[i].next)
{
int to=edge[i].to;
if (ch[now]=='(') last[to]=now;
else last[to]=last[now];
if (ch[now]==')'&&ch[to]=='(') c[to]=c[now];
dfs(to);
}
}
signed main()
{
n=read();
for (int i=;i<=n;i++) scanf("%c",&ch[i]);
for (int i=;i<=n;i++)
{
int x=read();
fa[i]=x;add(x,i);
}
dfs();
cout<<ans;
return ;
}

【CSP2019】括号树 题解(递推+链表)的更多相关文章

  1. 【BZOJ】1089: [SCOI2003]严格n元树(递推+高精度/fft)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1089 题意:求深度为d的n元树数目.(0<n<=32, 0<=d<=16) ...

  2. CSP2019 括号树

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

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

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

  4. 洛谷 P5658 括号树 题解

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

  5. [CSP-S2019]括号树 题解

    CSP-S2 2019 D1T2 刚开考的时候先大概浏览了一遍题目,闻到一股浓浓的stack气息 调了差不多1h才调完,加上T1用了1.5h+ 然而T3还是没写出来,滚粗 思路分析 很容易想到的常规操 ...

  6. P5658 括号树

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

  7. HDU 4747 Mex 递推/线段树

    题目链接: acm.hdu.edu.cn/showproblem.php?pid=4747 Mex Time Limit: 15000/5000 MS (Java/Others)Memory Limi ...

  8. BZOJ5017 [Snoi2017]炸弹[线段树优化建边+scc缩点+DAG上DP/线性递推]

    方法一: 朴素思路:果断建图,每次二分出一个区间然后要向这个区间每个点连有向边,然后一个环的话是可以互相引爆的,缩点之后就是一个DAG,求每个点出发有多少可达点. 然后注意两个问题: 上述建边显然$n ...

  9. 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】

    还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...

随机推荐

  1. 关于Pop!_OS 19.04有线网络始终正在连接

    一开始使用Pop!_OS时就遇到这个问题,开机进入系统后明明网络没问题,WiFi正常可用, 但是插入网线后有线网络始终显示正在连接,然后可能过一会儿还会弹出来网络激活失败. 但是有可能在使用很久之后再 ...

  2. Python List comprehension列表推导式

    http://blog.chinaunix.net/uid-28631822-id-3488324.html 具体内容需要进一步学习

  3. Scala 基础(十二):Scala 函数式编程(四)高级(二)参数(类型)推断、闭包(closure)、函数柯里化(curry)、控制抽象

    1  参数(类型)推断 参数推断省去类型信息(在某些情况下[需要有应用场景],参数类型是可以推断出来的,如list=(1,2,3) list.map() map中函数参数类型是可以推断的),同时也可以 ...

  4. flask 源码专题(二):请求上下文与全文上下文

    源码解析 0. 请求入口 if __name__ == '__main__': app.run() def run(self, host=None, port=None, debug=None, lo ...

  5. python数据处理(八)之展示数据

    1.前言 1.1.不要擅自假定要讲的故事和数据是一致的,要先研究数据,然后讲述数据研究所得 1.2.讲故事是成为领域专家的重要部分. 1.3.将故事方法: a. 确定想要讲的故事 b.无论选择什么方式 ...

  6. CRM【第一篇】: 权限组件之权限控制

    1. 问:为什么程序需要权限控制? 答:生活中的权限限制,① 看灾难片电影<2012>中富人和权贵有权登上诺亚方舟,穷苦老百姓只有等着灾难的来临:② 屌丝们,有没有想过为什么那些长得漂亮身 ...

  7. 手把手整合SSM框架

    前言 如果看过前几篇文章,对 Spring 和 MyBatis 有了一定了解,一定想上手试试.这篇文章从 0 到 1,手把手整合 SSM (Spring.Spring MVC.MyBatis). 本篇 ...

  8. nginx 信号管理

    本内容只针对nginx 关闭操作罗列方法技巧,不废话直接写,Nginx的信号控制如下: 1. TERM, INT 强制关闭进程 查看nginx进程ps -aux|grep nginx  root  8 ...

  9. 循序渐进VUE+Element 前端应用开发(18)--- 功能点管理及权限控制

    在一个业务管理系统中,如果我们需要实现权限控制功能,我们需要定义好对应的权限功能点,然后在界面中对界面元素的功能点进行绑定,这样就可以在后台动态分配权限进行动态控制了,一般来说,权限功能点是针对角色进 ...

  10. selenium自动化测试实战——12306铁路官网范例

    一.Selenium介绍 Selenium 是什么?一句话,自动化测试工具.它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Se ...