闲话8.13
今天上午打了一场模拟赛,被一群邢紫藤暴打了🤣🤣🤣
上来 T1 想了半个小时想到个做法,写了十几分钟发现假了。又想了个做法,写写写然后过了大样例,然后每 \(5\) 分钟就能拍出来一个错,大样例我谢谢你😊😊😊。T2 感觉是排列组合,写了个大 dp 跑了,考完发现 WA 了,但是不知道 WA 哪了。T3 看着不太可做,跳了。T4 完全不可做,跳了。
最终得分:\(92+0+0+0=92pts\)。
wangk 的奇妙数据:
属于是逆天,\(n\le 20\) 的数据能 TLE 是吧。
下午终于能回二北机房写题了,舒服。晚上让 Zkl21 点的炸鸡,ytq 要求点一份火鸡面,最后把他辣的🤪🤪🤪
晚上建议直接把 pdqb 枪决。
今晚见证 ezOIer 和管理对线:https://lglg.top/659513
推歌:CHAOS -Æsir
虽然我不玩 cy2,但是这首歌联动到 Arc 的时候第一时间去听了听,感觉意外的好听。而且也久仰 CHAOS 大名。
ARC 侧铺面不评价
模拟赛T1
感觉比lbx 的做法好理解一些。
首先我们考虑一个合法括号序列的产生条件:和未匹配的括号产生、和前面合法的括号序列产生。我们将两种贡献分开考虑。
第一种贡献十分好计算,我们可以直接维护一个当前未匹配左括号数量,加入右括号的时候计算即可。
我们设 \(ext_i\) 为第 \(i\) 次添加括号后最右端向左能扩展出多少段合法括号序列。拿下面这个图来说:
这个玩意用上面的方法就不太好维护了,就比如图中的 \(ext_4\),这里就和前面的括号牵扯上了,因此我们需要维护当前最后匹配上的括号,这提醒着我们可以用栈来维护这个过程。
具体的说,我们栈中存放加入这个括号的时间和当前剩余的括号数(只有左括号),加入右括号时弹栈计算第一类贡献,同时利用 \(ext_i\) 来计算被弹出这些节点的第二类贡献。
而当弹到栈空或者当前右括号匹配完后,我们就可以进行一个大分类讨论,分四种情况讨论并且维护 \(ext_i\) 即可。这里就不再展开。
应 lbx 要求,这里把分类讨论的部分写出来:
- 栈空,右括号未匹配完
这时直接把 \(ext\) 设为 \(0\) 即可,后面也不会和前面的形成新合法序列。
- 栈空,右括号匹配完
这时恰好和上次匹配的左括号形成一个完整的合法括号序列。记上次匹配的左括号是在第 \(j\) 次加入的,那么 \(ext_i=ext_{j-1}+1\)(这里 \(j-1\) 是因为我们的 \(ext\) 都是保存在右括号上的)
- 栈不空,右括号匹配完。
这时左括号有剩余,但是如果我们先把已经匹配的左括号看成没有,那么情况转化为第二种,就相同了。
- 栈不空,右括号未匹配完
这意味着有节点的左括号剩余超过了右括号,那么我们先让右括号和这些左括号匹配,这时右括号和这些左括号共同构成了一个大的括号序列,因此 \(ext_i = 1\)。
最终复杂度 \(O(n)\)。
今晚没有 fumo 图。