首页 > 其他分享 >[刷题笔记] Luogu P5658 [CSP-S 2019] 括号树

[刷题笔记] Luogu P5658 [CSP-S 2019] 括号树

时间:2023-10-13 23:47:34浏览次数:35  
标签:last P5658 int Luogu 括号 fa 2019 line 配对

Description

给定一棵树,树的每个节点都有一个左括号或者右括号,求从根节点到每个点简单路径上的括号序列上合法的子括号序列数。

Analysis

显然树形 dp。

考虑如何设计状态,定义 \(f_i\) 表示从 root 到 \(i\) 节点的字串合法数量。

考虑转移,如果当前的括号为左括号,我们无法和前面的括号相匹配,不会对答案产生新的贡献,直接继承 fa 的值即可。

如果当前的括号为右括号,那么根据括号匹配法则,它与左边第一个未匹配的左括号匹配。同时它将对 \(f_u\) 增加 当前所有的合法括号个数 个贡献。(\(f_u\) 初始继承 \(f_{fat_u}\))

所以,我们定义 \(line_i\) 表示以 \(i\) 为结尾的括号串中合法括号个数,\(last_i\) 表示从 root 到 \(i\) 路径上上一个没被配对的左括号位置。

分类讨论:

  • 当前为左括号,则记录 \(last_i=i\),其余不做处理。

  • 当前为右括号,考虑配对,如果无法配对则不做处理。否则 \(last_i=fa_{last_i}\),\(line_i=line_{fa}+1,f_i=f_{fa}+line_{fa}\)
    简单解释,当前括号配对,则从当前节点向前未配对的左括号上移。已经产生的括号个数在它父亲的基础上 +1,对答案新做出的贡献是 \(line_i\)。具体理解可以自己画图,类似于配对的思路。

需要注意一定要先更新完 \(line_i\) 后再更新 \(f\)。原因显然。

非常巧妙的是,本题的树形 dp 没有和平时一样使用记忆化搜索,线性的时间内即可完美解决。

代码如下。

Code

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define int long long
using namespace std;
const int N = 5e5+5;
char w[N];
int fa[N],last[N],line[N];
int f[N];
int ans = 0;
int n;
signed main()
{
    cin>>n;
    scanf("%s", w + 1);
    for(int i=2;i<=n;i++)
    {
        cin>>fa[i];
    }
    for(int u=1;u<=n;u++)
    {
        int fat = fa[u];
        f[u] = f[fat];
        last[u]  = last[fat];
        if(w[u] == '(') last[u] = u;
        if(w[u] == ')' && last[u])
        {
            line[u] = line[fa[last[u]]] + 1;
            last[u] = last[fa[last[u]]];
            f[u] += line[u];
        }
        ans ^= u*f[u];
    }
    cout<<ans<<endl;
    return 0;
}

标签:last,P5658,int,Luogu,括号,fa,2019,line,配对
From: https://www.cnblogs.com/SXqwq/p/CSP-S-2019-D1-T2.html

相关文章

  • 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK2019 无法解析的外部符号 _main
    问题描述按照思路写好了C++的程序之后,表面上看起来没什么错误,也没有红点点的出现,但是运行起来,就发现,爆出来这样一个错误:问题解决看了半天,查了半天资料,发现是这里出现了问题(我真的~~~):习惯了首字母大写,这个就当成类来写了,后来突然醒悟,这个是main函数,首字母是要小写:运行成功......
  • 升级Lync Server 2013到Skype for Business 2019(九)
    写在前面本章将介绍SkypeforBusiness2019OfficeOnlineServer(OOS)服务器的安装配置工作。OfficeOnlineServer安装安装必备软件以管理员身份打开MicrosoftPowerShell提示符,然后运行此命令示例来安装必需的角色和服务。Add-WindowsFeatureWeb-Server,Web-Mgmt-Tools,We......
  • [APIO2019] 路灯 题解
    LG5445把询问\(x,y\)看作平面上的点记当前时刻\(t\),\(l\)是与\(i\)连通的最左端,\(r\)是与\(i+1\)连通的最右端,可以通过set维护断边找到连边\((i,i+1)\)时\(x\in[l,i],y\in[i+1,r]\)连通了,考虑贡献提前计算,矩形\(+(q-t)\)。断边时同理\(-(q-t)\)剩下的问题是......
  • Webmin 远程命令执行 (CVE-2019-15107)
    说明内容漏洞编号CVE-2019-15107漏洞名称Webmin远程命令执行漏洞评级影响范围Webmin<=1.920漏洞描述该漏洞由于password_change.cgi文件在重置密码功能在重置密码功能中发现了一个错误,该错误允许恶意第三方由于缺少输入验证而执行恶意代码。修复方......
  • C++ - VS2019配置pthread线程库
    1.说明在VS里用MS编译器不能直接调用pthread库,需要先自行下载该库:http://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip解压后用的到的只有Pre-built.2文件夹下的文件。 2.配置如下图分别配置三大项:包含目录-->...pthreads-w32-2-9-1-release\Pre-......
  • Visual Studio 2019设置类和接口注释
     一、找到Visual Studio 2019安装目录D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\ItemTemplates\CSharp\Code\2052 二、修改类模板文件 #region<<版本注释>>/*----------------------------------------------------......
  • [GWCTF 2019]我有一个数据库
    原理phpmyadmin4.8.1漏洞php对目录不存在不敏感解题过程进入靶场,看到乱码的页面--,原代码也没啥提示,只能扫目录看看了最终扫到了phpmyadmin,进入可以看到版本信息上网搜漏洞进行复现即可....这个漏洞之前做过,就是切割问号然后目录穿越参考文章:https://blog.csdn.net/m0_55......
  • Visual Studio 2019 快速定位代码的位置
              ......
  • [GXYCTF2019]禁止套娃
    原理.git泄露,githack获取源码无参RCE执行解题过程进入靶场,每看到有用的信息,那就只能目录扫描了,扫到了.git目录,就用githack获取源码<?phpinclude"flag.php";echo"flag在哪里呢?<br>";if(isset($_GET['exp'])){if(!preg_match('/data:\/\/|filter:\/\/|php:\/......
  • 传纸条 luoguP1006
    题目描述小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排坐成一个mm行nn列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多同学传到对方手里,小渊......