【NOIP/CSP2019】D1T2 括号树
原题:


因为是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 括号树的更多相关文章
- 上午小测3 T1 括号序列 && luogu P5658 [CSP/S 2019 D1T2] 括号树 题解
前 言: 一直很想写这道括号树..毕竟是在去年折磨了我4个小时的题.... 上午小测3 T1 括号序列 前言: 原来这题是个dp啊...这几天出了好几道dp,我都没看出来,我竟然折磨菜. 考试的时候先 ...
- 【CSP2019】括号树 题解(递推+链表)
前言:抽时间做了做这道题,把学长送退役的题. ----------------- 题目链接 题目大意:定义$()$是合法括号串.如果$A,B$是合法括号串,那么$(AB),AB$为合法括号串.现给定根 ...
- CSP-S 2019 D1T2 括号树
题目链接:[https://www.luogu.com.cn/problem/P5658] 思路: 这道题不难.(为什么我在考场上一点思路也没有??) 假设我们已经处理到树上的节点u(假设1为根节点) ...
- CSP2019 括号树
Description: 给定括号树,每个节点都是 ( 或 ) ,定义节点的权值为根到该节点的简单路径所构成的括号序列中不同合法子串的个数(子串需要连续,子串所在的位置不同即为不同.)与节点编号的乘积 ...
- P5658 括号树
P5658 括号树 题解 太菜了啥都不会写只能水5分数据 啥都不会写只能翻题解 题解大大我错了 我们手动找一下规律 我们设 w[ i ] 为从根节点到结点 i 对答案的贡献,也就是走到结点 i ,合 ...
- [CSP-S 2019]括号树
[CSP-S 2019]括号树 源代码: #include<cstdio> #include<cctype> #include<vector> inline int ...
- 2021.08.09 P5658 括号树(树形结构)
2021.08.09 P5658 括号树(树形结构) [P5658 CSP-S2019] 括号树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 太长,在链接中. 分析及代码 ...
- 【CSP2019 D1T2】【括号树】
题面 不再多说,想必大家都看过这个题 思路 我们可以手推几个满足条件的字符串 我们发现在这些字符串里 每个)都与离它最近的(的匹配 所以我们维护树上每个节点到根节点中没用使用过的(的位置(nl[n]) ...
- 括号树 noip(csp??) 2019 洛谷 P5658
洛谷AC通道 本题,题目长,但是实际想起来十分简单. 首先,对于树上的每一个后括号,我们很容易知道,他的贡献值等于上一个后括号的贡献值 + 1.(当然,前提是要有人跟他匹配,毕竟题目中要求了,是不同的 ...
随机推荐
- 用Python搞出自己的云词图 | 【带你装起来】
作者:AI算法与图像处理 参考:http://www.sohu.com/a/149657007_236714 云词图简介 什么词云 由词汇组成类似云的彩色图形.“词云”就是对网络文本中出现频率较高的“ ...
- [转帖]Oracle 起诉 Google 事件
Oracle 起诉 Google 事件 https://www.cnblogs.com/panchanggui/p/9449842.html Oracle 是世界第二大软件公司 世界第一大DBMS公司 ...
- 浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣
先说下这俩到底是干啥的吧.其实这俩干的活儿都一样,就是创建了一个对象然后去通过对象调用executeQuery方法来执行sql语句.说是CreateStatement和PrepareStatement ...
- Java web server 基本实现原理
public class WebServer { //服务端Socket只要一个,所以定义成static, 同一时间只能一个线程访问(主线程) private static ServerSocket ...
- JavaScript之二分法
二分法: 二分查找,又称为折半查找. 注意:二分法查找的数组必须是有序的. /* 获取元素88在数组中第一次出现的索引位置 如果数组元素中存在88,则直接返回88在数组中的索引位置即可. 如果 ...
- 基于DNS(Consul)高可用
DNS 推荐从Bind-DLZ入手,资料多可控制度更好(查询DNS记录SQL可定制)据说性能差 Bind-DLZhttps://www.cnblogs.com/saneri/p/8178065.htm ...
- Typeof() 和 GetType()区别
1.typeof(x)中的x,必须是具体的类名.类型名称等,不可以是变量名称. 2.GetType()方法继承自Object,所以C#中任何对象都具有GetType()方法,它的作用和typeof() ...
- makemigrations和migrate到底干了什么以及如何查询原生的sql语句
在你改动了 model.py的内容之后执行下面的命令: python manger.py makemigrations 相当于 在该app下建立 migrations目录,并记录下你所有的关于mode ...
- Lua的栈及基本栈操作
Lua的栈及基本栈操作 https://blog.csdn.net/mydriverc2/article/details/51134737 https://blog.csdn.net/mydriver ...
- 用101000张图片实现图像识别(算法的实现和流程)-python-tensorflow框架
一个月前,我将kaggle里面的food-101(101000张食物图片),数据包下载下来,想着实现图像识别,做了很长时间,然后自己电脑也带不动,不过好在是最后找各种方法实现出了识别,但是准确率真的非 ...