首页 > 其他分享 >1.12 CW 模拟赛 T1. 括号序列

1.12 CW 模拟赛 T1. 括号序列

时间:2025-01-12 16:48:31浏览次数:1  
标签:1.12 int T1 括号 MAXN rb ans lb CW

思路

根据赛时的检验,
典型的动点问题的 \(\rm{trick}\) 并不能在这里使用, 也就是说, 分类讨论

  • 前缀 + \(i\) + 后缀
  • 前缀 + \(i\)
  • 后缀 + \(i\)

是不可行的

考虑括号串问题的常见做法, 先将其赋值成 \(1, -1\) 之后进行处理
你发现这种做法有枚举字段和的瓶颈, 所以也不可行
当然你可以进行转化之后利用这种做法

用栈来处理更是天方夜谭

考虑转到图上去处理, 容易的, 你可以将一个合法括号串表示成这样
pEPdtzQ.png

你发现令 \(f_i\) 表示 \(i\) 节点的答案, 容易有

\[f_i = f_{\textrm{fa}_ \textrm{i}} + (lb_i + 1) \times (rb_i + 1) \]

其中 \(lb, rb\) 表示左右兄弟的个数

容易转移

考虑建树怎么建
你发现不用真的建树, 你只需要把 \(lb, rb\) 求出来即可, 而这个你只需要在原串上直接做即可

实现

框架

如上维护

代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int MAXN = 10000010, mod = 1e9 + 7;
int n, to[MAXN], stk[MAXN], tp, ans[MAXN], rans[MAXN]; ll res;
char s[MAXN];
int pre[MAXN];

signed main () {
	scanf("%s", s + 1), n = strlen (s + 1);
	for (int i = 1; i <= n; i++) {
		if (s[i] == '(') stk[++tp] = i;
		else if (tp) {
            to[stk[tp]] = i, to[i] = stk[tp], tp--;
            if (tp) pre[to[i]] = stk[tp];
        }
	}
	for (int i = n; i >= 1; i--) if (to[i]) {
		if (s[i] == '(') ans[i] = ans[to[i] + 1] + 1;
	}
	for (int i = 1; i <= n; i++) if (to[i]) {
		if (s[i] == ')') rans[i] = rans[to[i] - 1] + 1;
	}
	for (int i = 1; i <= n; i++) if (to[i]) {
		if (s[i] == '(') { ans[i] = ans[to[i]] = ans[pre[i]] + 1ll * ans[i] * rans[to[i]] % mod; }
		res += (1ll * i * ans[i]) % mod;
	}
	printf("%lld", res);
	return 0;
}

总结

想的其实挺有逻辑的, 但是确实不会这种情况下的问题

常用的方法, 把匹配类问题丢到图 / 树上去做
本质上其实是因为这个题中, 包含关系的括号串对答案是有继承关系的, 这种继承关系可以建成树来处理

不好建树考虑只利用思想, 简化计算

标签:1.12,int,T1,括号,MAXN,rb,ans,lb,CW
From: https://www.cnblogs.com/YzaCsp/p/18667026

相关文章

  • 1.12 CW 模拟赛 赛时记录
    看题不是哥们怎么感觉一堆原题但是都不会做没复习最悲惨的一次策略肯定还是暴力,没有什么看上去简单的题\(\rm{T1}\)思路侥幸心理找了一下没有啊,必须自己想合法串显然就是满足匹配的串考虑这种经典问题的常见转化:令(为\(1\),)为\(-1\),合法括号串仅当其任......
  • Text1-综合练习4
    Text-综合练习4猜数字游戏用随机数生成一个1-100之间的数字如果猜的打了就打印大了,如果猜的小了就打印小了如果猜中了就打印猜中了!Randomnum=newRandom();intnumber=num.nextInt(100)+1;//生成1-100之间的随机数Scannernum1=newScanner(System.in);......
  • Text1-综合练习3
    Text-综合练习3判断一个数是否为质数质数为只能被1和本身整除的数Scannertext=newScanner(System.in);System.out.println("请输入要进行质数判断的数:");intz=text.nextInt();booleanflag=true;//开始认为这个数是质数for(inti=2;i......
  • Text1-综合练习5
    Text-综合练习5产生十个1-100之间的随机数存入数组求和求平均数找出有几个数字比平均值小Randomnumber1=newRandom();Scannernumber2=newScanner(System.in);System.out.println("请输入要产生随机数的个数:");intn=number2.nextInt();......
  • Text1-综合练习6
    Text-综合练习6键盘录入n个数字,倒放他们的顺序例如:输入12345,输出54321ScannerEX=newScanner(System.in);Stringarr[]=newString[100];Stringtemp;intcount=0;System.out.println("请输入要交换的数字:,以空格结束");......
  • Text1-综合练习2
    Text-综合练习2键盘录入一个大于2的整数,求它的平方根结果省去小数部分保留整数Scannerst=newScanner(System.in);System.out.println("请输入一个大于2的整数:");intnumber1=st.nextInt();for(inti=1;i<number1;i++){//从1开始查找一直到numb......
  • Text1-综合练习1
    Text1-综合练习1逢七过游戏规则:从任意一个数字开始报数当你要报的数字包含七或者是七的倍数时都要说过需求:使用程序在控制台打印出1-100之间满足逢七过规则的数for(inti=1;i<=100;i++){if(i/10%10==7||i%10==7||i%7==0){//判断十位、个位有没有七,这个数是否......
  • Sigrity System SI SerialLink模式进行100base_T1协议仿真分析操作指导-100BaseT1_Rx
    SigritySystemSISerialLink模式进行100base_T1协议仿真分析操作指导-100BaseT1_RxSigritySystemSISerialLink模式提供了10个协议合规性检查工具模板,用户可以将根据实际应用替换模板中的SPICE文件,然后进行协议仿真分析,同时软件还提供了目标结果的模板MASK以及该协议需要......
  • 2024.11.12(spring boot创建数据库)
    前端代码UserMapper.xmlselect*fromspringboot.user<selectid="queryUserById"resultType="User"parameterType="int">select*fromspringboot.userwhereid=#{id};</select><insertid="......
  • AcWing算法基础课打卡 | 790 数的三次方根
    学习C++从娃娃抓起!记录下AcWing刷过的题目,记录每一个瞬间。附上汇总贴:AcWing算法基础课打卡|汇总【题目描述】给定一个浮点数,求它的三次方根。【输入】共一行,包含一个浮点数。【输出】共一行,包含一个浮点数,表示问题的解。注意,结果保留位小数。【输入样例】1......