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

前 言: 一直很想写这道括号树..毕竟是在去年折磨了我4个小时的题.... 上午小测3 T1 括号序列 前言: 原来这题是个dp啊...这几天出了好几道dp,我都没看出来,我竟然折磨菜. 考试的时候先打了个暴力,然后就开始往容斥上想.... 解析: 考虑dp. 令dp[i] 表示以i为结尾的,合法的子串数量. 令match[i] 表示进行括号匹配时,与i匹配的括号的编号. (以上i都是右括号,如果是左括号置为0即可) 然后,就有: if(match[i]) dp[i]=dp[match[i]-1…
原题: 因为是NOIP题,所以首先先看特殊数据,前35分是一条长度不超过2000的链,N^2枚举所有子区间暴力check就能拿到分 其次可以思考特殊情况,一条链的情况怎么做 OI系列赛事的特殊性质分很多时候不仅是帮助得分,还帮助选手找到思路 观察合法串的形状,可以发现主要由括号嵌套和并列组成 嵌套好说,一对匹配的括号对答案贡献为1(里边包的东西不合法的括号不算匹配的括号) 对于并列的括号,可以发现如果要把两对匹配的括号并列算作一个贡献,那么必须要求这两个括号挨着,即右边的左括号的左边是左边的右括…
前言:抽时间做了做这道题,把学长送退役的题. ----------------- 题目链接 题目大意:定义$()$是合法括号串.如果$A,B$是合法括号串,那么$(AB),AB$为合法括号串.现给定根节点为$1$的一棵树,每个节点有一个括号.定义$s_i$是从根节点到$i$结点的括号串,$k_i$是$s_i$的合法子串,求$1*k_1 \ xor \ 2*k_2 \ xor \cdots \ n*k_n$. 这道题其实实现起来并不难,重要的是思维.我也是想了快一个小时才推出来式子QAQ. 可以发…
题目链接:[https://www.luogu.com.cn/problem/P5658] 思路: 这道题不难.(为什么我在考场上一点思路也没有??) 假设我们已经处理到树上的节点u(假设1为根节点),那么可以知道: \([1,u]的合法括号串数=[1,fa[u]]的合法括号串数+u处新增的合法括号串数\) 对于前者,直接继承即可. 对于后者,我们令f[u]表示u节点新增的合法括号串数,栈s表示还未被匹配的'('所处在的节点,那么可以得到: u的字符为'(':\(s[++top]=u,f[u]=…
Description: 给定括号树,每个节点都是 ( 或 ) ,定义节点的权值为根到该节点的简单路径所构成的括号序列中不同合法子串的个数(子串需要连续,子串所在的位置不同即为不同.)与节点编号的乘积,求所有节点权值的异或和. Solution: 闻到一股深深的 stack 气息. 懒得写了 Code: #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 5e5+1; int n; c…
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…
[CSP-S 2019]括号树 源代码: #include<cstdio> #include<cctype> #include<vector> inline int getint() { register char ch; while(!isdigit(ch=getchar())); register int x=ch^'0'; while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); re…
2021.08.09 P5658 括号树(树形结构) [P5658 CSP-S2019] 括号树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 太长,在链接中. 分析及代码: //从一条链开始思考,得出num[x]=num[fa[x]]+1,sum[x]=sum[fa[x]]+num[x] //接下来思考是一棵树的情况:只是比一条链多了回溯 #include<cstdio> #include<algorithm> #include<iostream…
题面 不再多说,想必大家都看过这个题 思路 我们可以手推几个满足条件的字符串 我们发现在这些字符串里 每个)都与离它最近的(的匹配 所以我们维护树上每个节点到根节点中没用使用过的(的位置(nl[n]) h[i]表示以i的结尾的满足条件的串的个数 nl[n] = nl[fa[n]]; if(value[n] == 1) nl[n] = n; else { if(nl[n] != 0) { ll f = fa[nl[n]]; nl[n] = nl[f]; h[n] = 1 + h[f];//把离)最…
洛谷AC通道 本题,题目长,但是实际想起来十分简单. 首先,对于树上的每一个后括号,我们很容易知道,他的贡献值等于上一个后括号的贡献值 + 1.(当然,前提是要有人跟他匹配,毕竟题目中要求了,是不同的子串.) 那么,如何记录是否有人跟他匹配??  也很好想...  用一个栈来维护(同时也方便我们记录上一个后括号所在的位置.) 那么,求总贡献值呢??  更好办了.  直接等于他爸爸 + 他自己的呗!! 结束了~~~ #include <bits/stdc++.h> using namespace…