题目大意:
给定n个只包括( )的序列,判断是否可以将这n个序列合成一个合法括号序列。
n<=1e6
题目解法:
首先我们很容易观察到对于每一个序列我们只需要维护两个值:总和和最小前缀和(‘(‘=1,‘)‘=-1),分别即为val[i]和mn[i]
首先如果所有字符串的总和加起来不为0显然无解
我们需要找到某种排序,对于任意一个i,第i个字符串的最小前缀mn[i] 和 前面所有字符串的val总和 之和>=0
一开始想到了一种贪心取法 即在所有当前可取的字符串中选择总和最大的那一个。但这个好像得用线段树套有序数组写起来很麻烦还可能超时。
观察到前后两个字符串的相对位置不会影响除他们以外其他前缀的合法性,考虑排序
对于相邻的两个字符串i,j(i<j),i一定在j前面需要满足以下条件:(注意这里的一定,就像我们想从大到小排序数组时重新定义的cmp函数用的是a>b而不是a>=b,这里的判定条件放的是一定满足的条件,不然会出问题)
因此cmp函数的写法就是return (mn[i]>mn[j]&&val[i]>0)||(mn[i]-val[i]<mn[j]-val[j]&&val[j]<0)
然后check一边中间会不会出问题就好了
[0003]AtCoder-abc 167F Bracket Sequencing
原文:https://www.cnblogs.com/myrcella/p/12870510.html