原题:

因为是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. 【编程开发】 C与C++中的关于函数指针的强制类型转换与指针函数的关系

    [编程开发] C与C++中的关于函数指针的强制类型转换与指针函数的关系 标签: [编程开发] [VS开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 以 ...

  2. redis 获取方式和安装(windows)

    Windows redis :https://github.com/MSOpenTech/redis/releases Linux redis :https://github.com/phpredis ...

  3. ORK

    小试OKR一季度之后有感分享,你要不要试试ORK?   封面 OKR已经在国内热火朝天有一阵子了,为了适当的赶时髦,从年初开始团队内部小范围使用ORK模式以便测试团队会有什么化学反应.这篇文章打算写写 ...

  4. Reactor系列(十一)take获取

    #java#reactor#take#获取# 获取Flux订阅数量 视频讲解: https://www.bilibili.com/video/av80322616/ FluxMonoTestCase. ...

  5. Vue ---- Vuex 的第一次接触

    在 Vue.js 的项目中,如果项目结构简单, 父子组件之间的数据传递可以使用  props 或者 $emit 等方式 http://www.cnblogs.com/wisewrong/p/62660 ...

  6. tesseract 3.04在centos6上安装

    tesseract是一个开源的OCR文字识别工具 查找相关文章:tesseract   tesseract 4.0一直安装失败,后来参照网上的方法,成功安装3.04 1 2 3 4 5 6 7 8 9 ...

  7. idea npm vue java开发工具安装 环境配置

    感谢此链接内容作者,从前往后流程较完整详细,助我成功配置好(不知道在这之前做的一些尝试有没有影响) https://blog.csdn.net/qq_42564846/article/details/ ...

  8. .Net Core 3.0原生Json解析器

    微软官方博客中描述了为什么构造了全新的Json解析器而不是继续使用行业准则Json.Net 微软博客地址:https://devblogs.microsoft.com/dotnet/try-the-n ...

  9. python基础(十三)--os和sys模块

    os模块 os.getpwd():获取当前工作目录(windows下没有) os.listdir(path):列出目录下的文件 os.remove(path):删出文件 (不能是目录,即文件夹) os ...

  10. python入门pk小游戏

    import time import random flag = True while flag: player_win = 0 enemy_win = 0 for i in range(1, 4): ...