原题:

因为是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. 使用FRP配置Windows远程控制

    一款很好用的内网穿透工具--FRP 前言 使用内网穿透工具--FRP,以及一台云服务器当做服务端,进行简单配置后即可远程访问 配置 FRP 服务端的前提条件是需要一台具有公网 IP 的设备,得益于 F ...

  2. 78 leetCode 位运算解法

    按照自己的理解题目,数组内所有的组合:假如[1,2,3,4]看成1111到0000里面的排列组合,取位运算. vector<vector > subsets(vector&nums ...

  3. 《精通并发与Netty》学习笔记(14 - 解决TCP粘包拆包(二)Netty自定义协议解决粘包拆包)

    一.Netty粘包和拆包解决方案 Netty提供了多个解码器,可以进行分包的操作,分别是: * LineBasedFrameDecoder (换行)   LineBasedFrameDecoder是回 ...

  4. OpenCV.问题&解决

    ZC:PDF:D:\_eBook\OpenCV\学习OpenCV(中文版Linuxidc.com).pdf 1.函数cvCaptureFromAVI(...) & cvCreateFileCa ...

  5. Unsupported major.minor version 52.0——解决

    Unsupported major.minor version 52.0 就是编辑用的是jdk8 而运行用的是jdk7, 改成jdk8就好了 参考文章:https://blog.csdn.net/qq ...

  6. poj3107(树的重心,树形dp)

    题目链接:https://vjudge.net/problem/POJ-3107 题意:求树的可能的重心,升序输出. 思路:因为学树形dp之前学过点分治了,而点分治的前提是求树的重心,所以这题就简单水 ...

  7. codeforces 1249C1 + 1249C2 (贪心)

    (点击此处查看原题) 题意分析 给出一个数n,求一个数m,使得m >= n ,并且m 满足: m = ∑ 3 ^ i * x (x = 0 或者 x = 1 ),求出满足条件的最小的m 解题思路 ...

  8. k8s组件通信或者创建pod生命周期

    Kubernetes 多组件之间的通信原理: apiserver 负责 etcd 存储的所有操作,且只有 apiserver 才直接操作 etcd 集群 apiserver 对内(集群中的其他组件)和 ...

  9. springMVC接受json类型数据

    springMVC接受json格式的数据很简单 使用@RequestBody 注解,标识从请求的body中取值 服务端示例代码 @RequestMapping(value = "/t4&qu ...

  10. JSP读取properties文件变量

    1.jsp代码 <%ResourceBundle res = ResourceBundle.getBundle("properties文件名"); %> 2.js代码 ...