「CSP-S 2019」括号树
【题目描述】
传送门
【题解】
- 是时候讨论一下我在考场上是怎么将这道题写挂的了
- 初看这道题毫无思路,先看看部分分吧
- 一条链的情况?设k[i]表示前i个括号的方案数
- 显然\(k[i]=k[i-1]+\)以i结尾的合法子串个数
- 考虑求\(a[i]\)表示以\(i\)结尾的合法子串个数,显然如果第\(i\)个字符是\(‘('\),\(a[i]=0\)
- 否则,看第\(i-1\)个字符,如果是\(‘(’\),则\(a[i]=a[i-2]\),否则就跳到与\(i-1\)匹配的\(b[i-1]\)处看\(b[i-1]-1\)是否是\('('\),如果不是,就再往前匹配······依次类推即可
- 然而,我在考场上时,居然脑抽,只往前匹配了一次,并且就这样还通过了大样例···
//惨痛回忆
//d[i]=1表示是左括号,=-1表示是右括号
for(int i=1;i<=n;++i){
if(d[i]==1){
k[i]=k[i-1];
continue;
}
if(i==1) continue;
if(d[i-1]==1){
b[i]=i-1;
a[i]=a[i-2]+1;
}
else if(d[b[i-1]-1]==1) a[i]=a[b[i-1]-2]+1,b[i]=b[i-1]-1;
k[i]=k[i-1]+a[i];
}
//正解
for(int i=1;i<=n;++i){
if(d[i]==1){
k[i]=k[i-1];
continue;
}
if(i==1) continue;
int now=i-1;
while(d[now]!=1&&now)
now=b[now]-1;
if(now){
a[i]=a[now-1]+1;
b[i]=now;
}
k[i]=k[i-1]+a[i];
}
- 正解,则只需要将链中通过-1向前推改为通过父子关系推即可
【代码】
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e5+10;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*f;
}
int n,d[N],fa[N],a[N],b[N],k[N],ans;
signed main(){
n=read();
for(int i=1;i<=n;i++){
char ch=getchar();
while(ch!='('&&ch!=')') ch=getchar();
if(ch=='(') d[i]=1;
else d[i]=-1;
}
for(int i=2;i<=n;i++)
fa[i]=read();
for(int i=1;i<=n;i++){
if(i==1) continue;
if(d[i]==1) k[i]=k[fa[i]];
else{
int now=fa[i];
while(d[now]!=1&&now)
now=fa[b[now]];
if(now){
a[i]=a[fa[now]]+1;
b[i]=now;
}
k[i]=k[fa[i]]+a[i];
}
ans=ans^(i*k[i]);
}
cout<<ans<<endl;
return 0;
}
「CSP-S 2019」括号树的更多相关文章
- 上午小测3 T1 括号序列 && luogu P5658 [CSP/S 2019 D1T2] 括号树 题解
前 言: 一直很想写这道括号树..毕竟是在去年折磨了我4个小时的题.... 上午小测3 T1 括号序列 前言: 原来这题是个dp啊...这几天出了好几道dp,我都没看出来,我竟然折磨菜. 考试的时候先 ...
- 「WC 2019」数树
「WC 2019」数树 一道涨姿势的EGF好题,官方题解我并没有完全看懂,尝试用指数型生成函数和组合意义的角度推了一波.考场上只得了 44 分也暴露了我在数数的一些基本套路上的不足,后面的 \(\ex ...
- 【题解】#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT)
[题解]#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT) 之前做这道题不理解,有一点走火入魔了,甚至想要一本近世代数来看,然后通过人类智慧思考后发现, ...
- loj #535. 「LibreOJ Round #6」花火 树状数组求逆序对+主席树二维数点+整体二分
$ \color{#0066ff}{ 题目描述 }$ 「Hanabi, hanabi--」 一听说祭典上没有烟火,Karen 一脸沮丧. 「有的哦-- 虽然比不上大型烟花就是了.」 还好 Shinob ...
- Luogu P5103 「JOI 2016 Final」断层 树状数组or线段树+脑子
太神仙了这题... 原来的地面上升,可以倒着操作(时光倒流),转化为地面沉降,最后的答案就是每个点的深度. 下面的1,2操作均定义为向下沉降(与原题意的变换相反): 首先这个题目只会操作前缀和后缀,并 ...
- 「模拟赛20180306」回忆树 memory LCA+KMP+AC自动机+树状数组
题目描述 回忆树是一棵树,树边上有小写字母. 一次回忆是这样的:你想起过往,触及心底--唔,不对,我们要说题目. 这题中我们认为回忆是这样的:给定 \(2\) 个点 \(u,v\) (\(u\) 可能 ...
- CSP-S 2019 D1T2 括号树
题目链接:[https://www.luogu.com.cn/problem/P5658] 思路: 这道题不难.(为什么我在考场上一点思路也没有??) 假设我们已经处理到树上的节点u(假设1为根节点) ...
- 「LOJ 3153」 「JOI Open 2019」三级跳
题面 LOJ 3153 solution 对于任意一对\(A,B\),若区间\([A,B]\)中存在一个数权值大于\(A\)或\(B\),则用这个数来替代\(A\)或\(B\)显然更优. 故只需要考虑 ...
- Solution -「NOI 2020」「洛谷 P6776」超现实树
\(\mathcal{Description}\) Link. 对于非空二叉树 \(T\),定义 \(\operatorname{grow}(T)\) 为所有能通过若干次"替换 \( ...
随机推荐
- s == t 何解?
Integer s=new Integer(9); Integer t=new Integer(9); Long u=new Long(9); (s==t) 这个是错的,只要有new这个关键字 ...
- linux mount 挂载提示 mount: you must specify the filesystem type
解决方法: mkfs.ext3 /dev/vdv mount -t ext3 /dev/vdv /usr1
- Vue 学习第二部
目录 通过axios实现数据请求 json json数据的语法 js中是提供的接送数据转换方法 ajax 数据接口 ajax的使用 同源策略 ajax跨域(跨源)方案之cors 组件化开发 组件[co ...
- VirtualBox 安装Ubuntu(16.04/18.04)时显示不全的解决方法
是是系统分辨率不同导致的问题 Alt+鼠标左键 (16.04版本亲测有效,18.04版本亲测无效)或者Win+鼠标左键 (18.04版本亲测有效)拖动安装界面,即可显示内容.
- 助力全球抗疫:3D突发公共卫生事件管理平台
前言 秋冬降临,北半球气温转凉.欧洲多个国家单日新增病例持续创新高,美国更是成为全球疫情最严重的国家.国内山东青岛.新疆喀什等地也相继发现多例病情.全球第二波疫情已经开始,国内疫情牵动人心,全球抗疫仍 ...
- D. 停不下来的团长奥尔加 动态规划
题目描述 分析 设\(f[i]\) 为从 \(i\) 走到 \(i+1\) 的步数 初始值 \(f[i]=2\) 则 \(f[i]=\sum_{i=p[i]}^{i}f[i]\) 考试的时候用树状数组 ...
- 简单盘点 CVPR2020 的图像合成论文
前言 本文将简单盘点在 CVPR2020 上的图像合成方面的论文,然后给出下载地址以及开源代码 github(如果有开源). 原文:https://evgenykashin.github.io/202 ...
- mysql运维-slave_skip_errors
1 简介 mysql在主从复制过程中,由于各种的原因,从服务器可能会遇到执行BINLOG中的SQL出错的情况,在默认情况下,服务器会停止复制进程,不再进行同步,等到用户自行来处理. sla ...
- 详解Git
版本控制 基本概念 版本控制是一个非常简单的概念,我举个例子简单说明一下你就能大概明白它是一个什么东西,当你不会版本控制的时候: 你的BOSS决定做一款灰常牛逼的软件,找你进行开发 当你做好之后,老板 ...
- js 元素添加多个监听
function addListener(element,e,fn){ if(element.addEventListener){ element.addEventListen ...