题解【洛谷P5658】[CSP-S 2019]括号树
一道简单的栈与\(\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]括号树的更多相关文章
- 上午小测3 T1 括号序列 && luogu P5658 [CSP/S 2019 D1T2] 括号树 题解
前 言: 一直很想写这道括号树..毕竟是在去年折磨了我4个小时的题.... 上午小测3 T1 括号序列 前言: 原来这题是个dp啊...这几天出了好几道dp,我都没看出来,我竟然折磨菜. 考试的时候先 ...
- 洛谷 P3373 【模板】线段树 2
洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...
- [CSP-S 2019]括号树
[CSP-S 2019]括号树 源代码: #include<cstdio> #include<cctype> #include<vector> inline int ...
- 括号树 noip(csp??) 2019 洛谷 P5658
洛谷AC通道 本题,题目长,但是实际想起来十分简单. 首先,对于树上的每一个后括号,我们很容易知道,他的贡献值等于上一个后括号的贡献值 + 1.(当然,前提是要有人跟他匹配,毕竟题目中要求了,是不同的 ...
- 题解 洛谷P5018【对称二叉树】(noip2018T4)
\(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...
- 题解 洛谷 P3396 【哈希冲突】(根号分治)
根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...
- 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...
- 题解-洛谷P4229 某位歌姬的故事
题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...
- 题解-洛谷P4724 【模板】三维凸包
洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...
随机推荐
- 消息总线:Spring Cloud Stream
最近在学习Spring Cloud的知识,现将消息总线:Spring Cloud Stream 的相关知识笔记整理如下.[采用 oneNote格式排版]
- 码云配合git入门命令总结学习
目录 码云配合git入门命令总结学习 基本设置 基本命令总结学习 准备工作以及基本思路 基本命令 码云搭建仓库步骤 准备前工作 具体操作方法 远程仓库基本命令 标签相关命令 所有命令总结 基本命令总结 ...
- nginx 反向代理及 https 证书配置
nginx 反向代理及 https 证书配置 author: yunqimg(ccxtcxx0) 1. 编译安装nginx 从官网下载 nginx源码, 并编译安装. ./configure --pr ...
- GitHook 工具 —— husky介绍及使用
名称 githooks-Git使用的挂钩.(githook在官网的介绍) 描述 如同其他许多的版本控制系统一样,Git 也具有在特定事件发生之前或之后执行特定脚本代码功能(从概念上类比,就与监听事件. ...
- MariaDB(MySQL)创建、删除、选择及数据类型使用详解
一.MariaDB简介(MySQL简介略过) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行 ...
- ISE post-place&route仿真准备
ISE post-place&route仿真准备 使用目的:post-place&route仿真是综合后考虑门延时而进行的仿真.因为考虑到各个门的延时,所以可以发现行为仿真(behav ...
- django 搭建一个投票类网站(四)
昨天我把投票页面终于写完,怎么说呢,觉得这本书对我的帮助也不是很大,然后去看了下django的文档,发现竟然是同一个项目...... 但还是要善始善终吧,贴一下中文版的文档https://docs.d ...
- CodeForces - 1105D 多源搜索
#include<bits/stdc++.h> using namespace std; typedef long long ll; struct node{ int x,y; ll se ...
- Jmeter实践
Jmeter时间戳函数 详见:https://blog.csdn.net/dreamtl/article/details/68957447 ${__timeShift(yyyy-MM-dd HH:mm ...
- 【H5适配 笔记1】rem适配
设备像素比(dpr)= 物理像素(手机渲染像素.分辨率)/设备独立像素(手机所显示元素的大小) 视口(viewport) 布局视口(获取浏览器布局视口高度,包括内边距,但不包括垂直滚动条.边框和外边距 ...