P5658 括号树

题解

太菜了啥都不会写只能水5分数据

啥都不会写只能翻题解  题解大大我错了

我们手动找一下规律

我们设 w[ i ] 为从根节点到结点 i 对答案的贡献,也就是走到结点 i ,合法括号串又多了几个

sum[ i ] 为从根节点到结点 i 总共合法括号串数

()()()

w[i] 依次为 0  1  0  2  0  3

sum[i] 依次为 0  1  1  3  3  6

())()

w[i] 依次为 0  1  0  0  1

sum[i] 依次为 0  1  1  1  2

()(())

w[i] 依次为 0  1  0  0  1  2

sum[i] 依次为 0  1  1  1  2  4

然后我们惊奇的发现 sum[i] 是 w[i] 的前缀和

最后要求的其实就是所有的 sum[i]*i 的异或和,所以当务之急只找到求解 w[ i ] 的方法

(1)发现如果 s[i] 是个左括号,那么显然不会有新的贡献出现,也就是w[i]=0

(2)如果 s[i] 是个右括号,那么我们找到他对应上一个右括号,贡献值也就是上一个右括号的贡献值+1:其实也就相当于,对于当前右括号,(如果条件允许)他有左括号与之匹配,对答案贡献为1,然鹅当前右括号对应的前一个右括号,他本就会对答案有一定的贡献,加上当前新匹配的一对括号,就生成新的匹配括号串,那么我们就将它作为当前右括号的贡献存下

举个栗子:()()() )()

w[4]=2

s[5]是左括号,那么w[5]=0,因为考虑了s[5]也没有出现新的匹配括号

s[6]是一个可以匹配的右括号,那么,s[5]与s[6]构成一个新的匹配括号,s[3]~s[6]以及s[1]~s[6]都是新匹配的括号,他们都是原来w[4]的基础上又加了新的s[5]s[6]构成的新括号串

s[7]没有左括号与之匹配,所以w[7]=0

s[9]由于上一个右括号是s[7],它与时代脱节,所以s[9]只能将自成一家的括号串作为贡献,因为既然中间断开了就不会有在原来基础上+()生成新括号串的可能了

采用dfs递归沿着树更新结点对应的值

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<queue> using namespace std; typedef long long ll; inline int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} const int maxn=5e5+;
ll n,ans=;
char s[maxn];
ll fa[maxn];
ll pre[maxn],w[maxn]; ll cnt=,head[maxn],to[maxn<<],nxt[maxn<<];
void addedge(int u,int v)
{
to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;
} void dfs(int u)
{
pre[u]=pre[fa[u]];
if(s[u]=='(') pre[u]=u;
else if(pre[u]){
w[u]=w[fa[pre[u]]]+,pre[u]=pre[fa[pre[u]]];
}
for(int i=head[u];i;i=nxt[i]) dfs(to[i]);
} int main()
{
n=read();
scanf("%s",s+);
for(int i=;i<=n;i++){
fa[i]=read();
addedge(fa[i],i);
}
dfs();
ans=w[];
for(int i=;i<=n;i++){
w[i]+=w[fa[i]];
ans^=(i*w[i]);
}
printf("%lld\n",ans);
return ;
}

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

CSP 2019 D1T2

P5658 括号树的更多相关文章

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

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

  2. 洛谷 P5658 括号树 题解

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

  3. 洛谷 P5658 括号树

    \(50pts\) #include <cstdio> #include <cstring> #include <iostream> #include <al ...

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

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

  5. [CSP-S 2019]括号树

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

  6. CSP2019 括号树

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

  7. 【CSP-S 2019】【洛谷P5658】括号树【dfs】【二分】

    题目: 题目链接:https://www.luogu.org/problem/P5658?contestId=24103 本题中合法括号串的定义如下: () 是合法括号串. 如果 A 是合法括号串,则 ...

  8. 洛谷 P5658 [CSP-S2019] 括号树

    链接: P5658 分析: 显然我们应该在dfs树的同时维护每个点的答案. 注意到第 \(u\) 个点的答案可以分成两部分,不包含 \(u\) 点时的答案,和加入 \(u\) 点后新增的答案,前者可以 ...

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

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

随机推荐

  1. Android面试题 描述一下android的系统架构

    android系统架构从下往上为linux内核层.运行库.应用程序框架层和应用程序层. Linux Kernel:负责硬件的驱动程序.网络.电源.系统安全以及内存管理等功能. Libraries和an ...

  2. 运行 jcontrol 报 libXext.so.6: cannot open shared object file 错误

    需要安装额外库: yum install libXext.x86_64 yum install libXrender.x86_64 yum install libXtst.x86_64

  3. 异常-Phoenix HBASE Last region should end with an empty key. You need to create a new region and regioninfo in HDFS to plug the hole

    1 详细异常信息 RROR: There is a hole in the region chain between \x03\x00\x00\x00\x00\x00\x00\x00\x00 and ...

  4. STM32 HAL库学习系列第8篇---回调函数总结

    普通函数与回调函数的区别:就是ST将中断封装,给使用者的API,就是标准库的中断函数 对普通函数的调用: 调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返 ...

  5. nginx的应用【静态代理、动静分离】

    Nginx主要应用: 静态web服务器 负载均衡 静态代理虚拟主机 静态代理 :把所有静态资源的访问改为访问nginx,而不是访问tomcat,因为nginx更擅长于静态资源的处理,性能更好,效率更高 ...

  6. AD19新功能之交互式等长

    多信号线等长 选中需要等长的信号线: 选择“Interaction Length Tuning”命令,然后在网络线上点击一下,然后 tab 键暂停: 在Properties面板中,修改Source部分 ...

  7. Codeforces #366 (Div. 2) D. Ant Man (贪心)

    https://blog.csdn.net/liangzhaoyang1/article/details/52215276  原博客 原来好像是个dp题,不过我看了别人的博客使用贪心做的 复杂度(n^ ...

  8. webpack 配置react脚手架(三):eslint 及优化

    首先谨记 eslint的官网:  http://eslint.cn/ 1 安装eslint  npm i eslint -D 2.在根目录下新建文件 .eslintrc { "extends ...

  9. machine learning(9) -- classification:Decision boundary

    machine learning(9) -- classification:Decision boundary 上图的decision boundary是一条直线,是属于预测函数的一个属性(当参数已经 ...

  10. 彻底搞清楚DOM元素的height,offsetHeight,clientHeight,scrollHeight

    测试用例: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...