题面

一道简单的栈与\(\text{DP}\)的结合。

首先介绍一下序列上的括号匹配问题,也就是此题在序列上的做法:

  • 设 \(dp_i\) 表示以 \(i\) 结尾的合法的括号序列个数, \(ss_i\) 表示 \(1\) 到 \(i\) 合法的括号序列字串个数。
  • 维护一个栈,左括号 \(\text{push}\) 它的位置到栈中,右括号取出栈顶 \(dp_i = dp_{sta_{top} - 1} + 1\) , 然后 \(ss_i=ss_{i-1}+dp_{i}\)。
  • 答案即为 \((1\times ss_1) \oplus (2 \times ss_2) \oplus \dots \oplus (n \times ss_n)\) ,其中 \(\oplus\) 为异或。

考虑将这个问题转移到树上,只需要一个可回退的栈即可。

这题真的不难,我考场上为什么没想出来啊

我太菜了

代码:

#include <bits/stdc++.h>
#define itn int
#define gI gi
#define int long long using namespace std; inline int gi()
{
int f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return f * x;
} const int maxn = 500003; int n, ans, topp, ss[maxn], dp[maxn], sta[maxn], sum[maxn];
int fa[maxn], tot, head[maxn], ver[maxn * 2], nxt[maxn * 2];
char s[maxn]; inline void add(int u, int v) {ver[++tot] = v, nxt[tot] = head[u], head[u] = tot;} void dfs(int u, int f)
{
int fl = -1;
if (s[u] == '(') sta[++topp] = u; //左括号加入栈
else if (topp > 0) //右括号且栈中有对应的左括号
{
fl = sta[topp--]; //栈顶元素
dp[u] = dp[fa[fl]] + 1; //dp 数组记得 +1
}
sum[u] = sum[fa[u]] + dp[u]; //sum[u] 表示 1 到 u 的路径上合法括号序列的个数
for (int i = head[u]; i; i = nxt[i])
{
int v = ver[i];
if (v == f) continue;
dfs(v, u);
}
//将栈还原到访问节点 u 之前的状态
if (s[u] == '(') --topp;
else if (fl != -1)
{
sta[++topp] = fl;
}
} signed main()
{
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
n = gi();
scanf("%s", s + 1);
bool fl = true;
for (int i = 2; i <= n; i+=1)
{
fa[i] = gi();
if (fa[i] != i - 1) fl = false;
add(fa[i], i), add(i, fa[i]);
}
if (fl) //序列上的做法
{
for (int i = 1; i <= n; i+=1)
{
if (s[i] == '(') sta[++topp] = i;
else if (topp) dp[i] = dp[sta[topp--] - 1] + 1;
ss[i] = ss[i - 1] + dp[i];
ans ^= (i * ss[i]);
}
printf("%lld\n", ans);
return 0;
}
dfs(1, 0);
for (int i = 1; i <= n; i+=1) ans ^= (i * sum[i]);
printf("%lld\n", ans);
return 0;
}

题解【洛谷P5658】[CSP-S 2019]括号树的更多相关文章

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

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

  2. 洛谷 P3373 【模板】线段树 2

    洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...

  3. [CSP-S 2019]括号树

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

  4. 括号树 noip(csp??) 2019 洛谷 P5658

    洛谷AC通道 本题,题目长,但是实际想起来十分简单. 首先,对于树上的每一个后括号,我们很容易知道,他的贡献值等于上一个后括号的贡献值 + 1.(当然,前提是要有人跟他匹配,毕竟题目中要求了,是不同的 ...

  5. 题解 洛谷P5018【对称二叉树】(noip2018T4)

    \(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...

  6. 题解 洛谷 P3396 【哈希冲突】(根号分治)

    根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...

  7. 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)

    题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...

  8. 题解-洛谷P4229 某位歌姬的故事

    题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...

  9. 题解-洛谷P4724 【模板】三维凸包

    洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...

随机推荐

  1. ext4文件系统启动自检的必要性

    最近我们发现多个用户设备掉电后重启,系统不工作. 研究这些返修设备,发现这些设备的表象是网络连接失败,DNS resolve不了.进一步发现/etc/resolv.conf为空,所以应用程序没法进行D ...

  2. openssl CVE-2016-2107 漏洞检测

    最近在安装python3 时升级openssl 版本,在摸索openssl 升级过程中才发现centos6 默认安装的openssl 1.0.1e 版本是有一个严重的漏洞的(Padding oracl ...

  3. kubernetes安装-二进制

    主要参考https://github.com/opsnull/follow-me-install-kubernetes-cluster,采用Flanel和docker 系统信息 角色 系统 CPU C ...

  4. 剑指offer-面试题36-二叉搜索树与双向链表-中序遍历

    /* 题目: 将二叉搜索树转化为排序的双向链表,不能创建新的节点, 只能调整节点的指向,返回双向链表的头节点. */ /* 思路: 递归. 二叉搜索树的中序遍历得到的序列是递增序列. 左子树left& ...

  5. Apache Solr Velocity模板注入rce+获取交互式shell

    前言: 官方的poc.exp payload只能获取很低的命令执行权限,甚至有些符号.命令还被过滤了,例如管道符被过滤.并且不能写入.下载文件,不能使用管道符重定向文件.那么我们只能通过获取到交互式s ...

  6. BLOB-数据库中用来存储二进制文件的字段类型

    BLOB (binary large object)----二进制大对象,是一个可以存储二进制文件的容器. 在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型. BLOB是一个大文件,典型 ...

  7. js中div显示和隐藏钮为什么页面总是跳一下到最上面

    <div class="menu_left"> <ul > <li id="t1" style="background- ...

  8. P6070 [RC-02] GCD [杜教筛,莫比乌斯反演]

    没啥好说的,杜教筛板子题. \[\sum_{i=1}^{N} \sum_{j=1}^{N}\sum_{p=1}^{\lfloor \frac{N}{j} \rfloor}\sum_{q=1}^{\lf ...

  9. VAR向量自回归模型学习笔记2

    向量自回归模型 今天的你 和昨天的你 和前天的你,是否具有相关性. 1. 定义 向量自回归(VAR,Vector Auto regression)分析联合内生变量间的动态关系 联合:n个变量间的相互影 ...

  10. collection和map集合类知识点总结

    collection和map集合类知识点总结 最近在准备java基础知识的总结,发现对于集合类的知识点很多很杂,借鉴网上的帖子,整理如下. 一.定义 集合框架是为表示和操作集合而规定的一种统一的标准的 ...