Luogu P5658 括号树|搜索+递推

CSP2019 S组D1T2

题目链接

#include<bits/stdc++.h>
using namespace std;
int cc,to[600000],net[600000],fr[600000],fa[600000],zhan[600000],t,n,nt[600000];
long long s[600000];
char ch[600000];string st;bool vis[600000];
void addedge(int u,int v)
{
    cc++;
    to[cc]=v;net[cc]=fr[u];fr[u]=cc;
}
void dfs1(int x)
{
    if (ch[x]=='(')
    {
        zhan[++t]=x;
    }
    else
    {
        nt[x]=t;
        while (vis[zhan[nt[x]]]&&nt[x])
        {
            nt[x]--;
        }
        if (nt[x])
        {
            vis[zhan[nt[x]]]=true;
            s[x]=s[x]+1+s[fa[zhan[nt[x]]]];
        }
    }
    for (int i=fr[x];i;i=net[i])
    {
        dfs1(to[i]);
    }
    if (ch[x]=='(')
         t--;
    else vis[zhan[nt[x]]]=false;
}
void dfs2(int x)
{
    for (int i=fr[x];i;i=net[i])
    {
        s[to[i]]+=s[x];
        dfs2(to[i]);
    }
}
int main()
{
//  freopen("brackets.in","r",stdin);
//  freopen("brackets.out","w",stdout);
    cin>>n;
    cin>>st;
    for (int i=1;i<=n;i++)
    {
        ch[i]=st[i-1];
    }
    bool lian=true;
    for (int i=2;i<=n;i++)
    {
        cin>>fa[i];
        if (fa[i]!=i-1) lian=false;
        addedge(fa[i],i);
    }
/*  if (lian)
    {
        for (int i=1;i<=n;i++)
        {
            if (ch[i]=='(')
            {
                zhan[++t]=i;
            }
            else
            {
                if (!t) continue;
                s[i]=1+s[fa[zhan[t]]];
                t--;
            }
        }
        for (int i=1;i<=n;i++)
        {
            s[i]+=s[i-1];
        }
    }
    else*/
    {
        dfs1(1);
        dfs2(1);
    }
    long long ans=s[1];
    for (int i=2;i<=n;i++)
    {
        ans^=s[i]*i;
    }
    cout<<ans<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/fmj123/p/12210703.html

时间: 2024-07-31 06:38:30

Luogu P5658 括号树|搜索+递推的相关文章

hdu--1978--记忆化深度搜索||递推

这题 我开始的做法是 记忆化搜索  但是tm地竟然tle了...很想不通 因为数据很小啊 就100 虽然方案的总数可能会很大.. 然后 我就去百度 记忆化搜索 看下是不是我用错方法了 事实证明 我虽然没有用错 但还是 学到了很多=-=. 其实  我很早以前 也看过关于 记忆化搜索的一些介绍 但是 并没有太多感觉 并不是那些作者写的不好 而是我的水平没到 感受不了.. 很多东西会在不知不觉中提升~ 我想 将我读的这篇介绍 传到这篇博客里来 似乎只能上传照片和视频=-=   那我给个链接吧  传送

P5658 括号树

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

【BZOJ】1089: [SCOI2003]严格n元树(递推+高精度/fft)

http://www.lydsy.com/JudgeOnline/problem.php?id=1089 想了好久的递推式,,,然后放弃了QAQ 神思路!orz 首先我们设$f[i]$表示深度最大为i的n元树的数目,注意,是最大深度为i! 那么易得递推式 f[i]=f[i-1]^n+1 前面表示子树的情况乘积,后面表示树为1层!因为1层是合法的!即没有子女! 然后答案就是 f[d]-f[d-1] !!!为什么要剪掉呢?因为看我们的转移,并不是深度为i,而是深度最大为i,那么为什么要这样减呢?理由

Luogu P1057 传球游戏(dp 递推)

P1057 传球游戏 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没有传出去的那个同学就是败者,要给大家表演一个节目. 聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次以后,又回到小蛮手里.两种传球方法被视

Luogu P2327 [SCOI2005]扫雷【递推/数学】By cellur925

题目传送门 推了好久啊.看来以后要多玩扫雷了qwq. 其实本题只有三种答案:0.1.2. 对于所有第一列,只要第一个数和第二个数确定后,其实整个数列就确定了,我们可以通过这个递推式得出 1 sec[i-1]=fir[i]+fir[i-2]+fir[i-1] 所以我们可以枚举每列的第1/2个数. 如果推到第n+1个数还存在,那么指定这种情况不成立. Code 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring&

[位运算] [搜索] [递推优化] [计算几何] TEST 2016.7.15

NOIP2014 提高组模拟试题 第一试试题 题目概况: 中文题目名称 合理种植 排队 科技节 源程序文件名 plant.pas/.c/.cpp lineup.pas/.c/.cpp scifest.pas/.c/.cpp 输入文件名 plant.in lineup.in scifest.in 输出文件名 plant.out lineup.out scifest.out 每个测试点时限 1s 1s 1s 测试点数目 10 10 10 每个测试点分值 10 10 10 内存上限 128MB 128

【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】

还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. 在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论起了二叉搜索树.什么是二叉搜索树呢?二叉搜索树首先是一棵二叉树.设key[p]表示结点p上的数值.对于其中的每个结点p,若其存在左孩子lch,则key

[BZOJ1089][SCOI2003]严格n元树(递推+高精度)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1089 分析: 第一感觉可以用一个通式求出来,但是考虑一下很麻烦,不好搞的.很容易发现最底层必有一个是满高度的,其他的任意. 所以直接的递推也不好想. (以下所述都是n元树) 于是可以令f[d]为深度<=d的树的个数,那么深度为d的就是f[d]-f[d-1] 对于深度<=d的又该怎么处理呢? 考虑第一层的n个点(根为0层),每个点都要底下连子树,深度为0~i-1,方案数即f[d-1]

多校第九场:贪心+矩阵快速幂中间优化+线性递推&amp;线段树递推

HDU 4968 Improving the GPA 思路:贪心的搞吧!比赛的时候想了好久,然后才发现了点规律,然后乱搞1A. 因为贪心嘛!大的情况就是刚开始每个人的分数都是最大的最小值,即绩点4.0的最低分数85,然后最后一个数设为剩余的分数,然后如果小于60就从第一个分数补到这个分数来,然后最后一个分数还小于60,那就用第二个补--依次往下搞,那时我也不知道这样就搞出答案了,我还没证明这个对不对呢,哈哈. 小的情况:小的情况就是先假设每个人都是绩点最小的最大分数,即绩点2.0的最大分数69,