原题:

因为是NOIP题,所以首先先看特殊数据,前35分是一条长度不超过2000的链,N^2枚举所有子区间暴力check就能拿到分

其次可以思考特殊情况,一条链的情况怎么做

OI系列赛事的特殊性质分很多时候不仅是帮助得分,还帮助选手找到思路

观察合法串的形状,可以发现主要由括号嵌套和并列组成

嵌套好说,一对匹配的括号对答案贡献为1(里边包的东西不合法的括号不算匹配的括号)

对于并列的括号,可以发现如果要把两对匹配的括号并列算作一个贡献,那么必须要求这两个括号挨着,即右边的左括号的左边是左边的右括号

思考涉及到子区间的问题时,一个常见的思路是确定一个端点,考虑另一个

因为括号匹配是从左到右添加进栈的,那么不妨确定右端点,对于加入的右括号我们只需考虑其能匹配多少个左端点

可以发现,某个右括号和跟他匹配的左括号算1个贡献

如果左括号的左边是匹配上的右括号,那么这个右括号作为右端点的合法区间都可以直接接上右边匹配的一对括号算作贡献1

那么思路就很清楚了,总结一下,只考虑对于匹配上的右括号,有多少个左端点使得区间合法

它自己的左括号算贡献1,然后再把右端点为左括号下标-1的合法区间数接上

用g[i]表示点i为右端点的方案数,f[i]表示g[i]的前缀和(用于统计答案)

那么如果某个点是左括号或匹配不上的右括号,g[i]为0

如果是匹配上左括号j的右括号,g[i]=g[j-1]+1

那么对于一棵树的情况,其实可以发现,只需要dfs树,然后回溯的时候把新加进来的括号退栈就跟序列的情况没什么区别

(当然别忘了刚才退栈的括号回溯时要补进)

代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define LL long long
int rd(){int z=,mk=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mk;
}
struct edg{int nxt,y;}e[]; int lk[],ltp=;
void ist(int x,int y){ e[++ltp]=(edg){lk[x],y}; lk[x]=ltp;}
int n,fth[]; char s[];
LL f[],g[];
int q[],hd=;
void dfs(int x){
//cout<<"x: "<<x<<" f: "<<f[x]<<" g: "<<g[x]<<endl;
//for(int i=1;i<=hd;++i) cout<<q[i]<<" ";
//cout<<endl;
for(int i=lk[x];i;i=e[i].nxt){
int tmp=q[hd];
if(s[e[i].y]==')' && hd){
g[e[i].y]=g[fth[tmp]]+;
f[e[i].y]=f[x]+g[e[i].y];
--hd;
}
else{
if(s[e[i].y]=='(') q[++hd]=e[i].y;
//因为栈里只会有左括号,所以存下标表示这里有个左括号就vans了
g[e[i].y]=;
f[e[i].y]=f[x];
}
dfs(e[i].y);
if(s[e[i].y]==')' && tmp) q[++hd]=tmp;
//注意不是hd!=0
else if(s[e[i].y]=='(') --hd;
}
}
int main(){
freopen("ddd.in","r",stdin);
cin>>n;
scanf("%s",s+);
for(int i=;i<=n;++i) fth[i]=rd(),ist(fth[i],i);
//q[++hd]=1; f[1]=0,g[1]=0; 注意s[1]不一定是'('
if(s[]=='(') q[++hd]=; f[]=,g[]=;
dfs();
LL ans=;
for(int i=;i<=n;++i) ans^=i*f[i];
cout<<ans<<endl;
return ;
}

【NOIP/CSP2019】D1T2 括号树的更多相关文章

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

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

  2. 【CSP2019】括号树 题解(递推+链表)

    前言:抽时间做了做这道题,把学长送退役的题. ----------------- 题目链接 题目大意:定义$()$是合法括号串.如果$A,B$是合法括号串,那么$(AB),AB$为合法括号串.现给定根 ...

  3. CSP-S 2019 D1T2 括号树

    题目链接:[https://www.luogu.com.cn/problem/P5658] 思路: 这道题不难.(为什么我在考场上一点思路也没有??) 假设我们已经处理到树上的节点u(假设1为根节点) ...

  4. CSP2019 括号树

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

  5. P5658 括号树

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

  6. [CSP-S 2019]括号树

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

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

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

  8. 【CSP2019 D1T2】【括号树】

    题面 不再多说,想必大家都看过这个题 思路 我们可以手推几个满足条件的字符串 我们发现在这些字符串里 每个)都与离它最近的(的匹配 所以我们维护树上每个节点到根节点中没用使用过的(的位置(nl[n]) ...

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

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

随机推荐

  1. 性能优化-屏幕常亮与CPU唤醒

    Android在不使用的时候,屏幕在一段时间以后会变暗,再过一段时间就会熄屏,此时CPU就会休眠,那么在这个时候,Timer.Handler.Thread.Service等都会暂停,有时候我们需要屏幕 ...

  2. ie兼容promise

    引入 <script src = "https://cdn.polyfill.io/v2/polyfill.min.js"></script> 或 < ...

  3. lua介绍及环境搭建(一)

    一.介绍 1.简介 Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. 其设计目的是为了嵌入应用程序中,从 ...

  4. [转帖]强大的strace命令用法详解

    强大的strace命令用法详解 文章转自: https://www.linuxidc.com/Linux/2018-01/150654.htm strace是什么? 按照strace官网的描述, st ...

  5. [DEBUG] Spring boot前端html无法下载示例文件

    更新:原方法打jar包的时候是可以的,后来我打war包之后下载的文件就是0字节.尴尬:) 所以现在更换一种方法,然后打war包.在服务器已测试成功. 前端不需要改变,只需要更改controller: ...

  6. 剑指offer40:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字

    1 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 2 思路和方法 (1)异或:除了有两个数字只出现了一次,其他数字都出现了两次.异或运算中,任 ...

  7. MySQL8.0哪些新特性你最期待

    1.数据字典全部采用InnoDB引擎存储,支持DDL原子性.crash safe,metadata管理更完善 2.快速在线加新列(腾讯互娱DBA团队贡献) 3.并行redo log,并提升redo l ...

  8. Jmeter博文索引~基础知识和实践操作汇总

    所有Jmeter笔记的目录/索引 一,基础操作和常用操作 Jmeter入门(一)理论基础 Jmeter安装及配置(含JDK安装) Jmeter之设置线程组运行次数/时间 Jmeter之参数化(4种设置 ...

  9. oracle用户解锁,rename管理

    ---查看命令:用户默认表空间 SYS@ACE >select username,default_tablespace,temporary_tablespace,created from dba ...

  10. MySQL 设置密码和允许远程登录

    mysqladmin -u root password "newpass" GRANT ALL PRIVILEGES ON *.* TO root' WITH GRANT OPTI ...