水题大全(退役老人准备ccf-csp认证于是刷了一点题)

力扣2116:左右括号+万能括号判断是否合法问题
solution: 统计一下对于每个前缀的时候,未匹配的左括号数量的范围,如果最大值小于0了就不合法,到最后如果最小值大于0了就不合法,总长度是奇数也不合法,其余都合法。

2712:使串中所有01都相等的最小代价
solution:注意对于翻转[1,i-1]和[i,n-1]影响的只有i-1和i之间的关系,所以可以dp,f[i]=f[i-1]+min(i,n-i); 最终答案为f[n-1]

csp D题 跳房子

  • 主要注意一个性质:每个点其实可以只被到达一次,只作为出发点一次。

  • 然后可以考虑bfs,点i被第一次到达时(还没有减a[i]),可能会产生一个新的出发点i-a[i],如果是新的出发点,那么可以加进队列,(后续可能会到达一些新未到达过的的点)判断哪些是未到达过的点可以用set,到达过就直接erase,出发点向后跳一步能到达的新点直接在set里面lowerbound找就可以了。 时间nlog

  • 还有一种O(n)的写法,就是f[i]表示第一次到达i走的步数(还没有-a[i]所以不可能站得住脚),这种情况下每个点第一次被到达应该是由前面跳过来的,所以可以顺序遍历,

  • 对于i,如果到不了那就continue,否则,会产生一个新的起点i-a[i],如果这个起点不是新的(曾经作为过起点),那就continue

子集异或和再求和
按位考虑,然后考虑乘以选奇数个的方案数,然后发现奇偶方案数相同,所以方案数都是 \(2^{n-1}\)
所以复杂度O(n)

spfa

  • 复习一下,基本思路就是bfs,可以入队多次,不过每个时刻队列中不会出现重复节点
  • 如果一个节点入队次数大于n,则图中有负环,陷入死循环
  • spfa两个优化,用双端队列
  • 一是如果dis[y] \(\leq\) dis[队首] 则放入队首,否则放队尾;
  • 二是每次取队首的时候,如果dis大于平均值,就取出来放队尾,直到队首小于等于平均值再取出来进行松弛操作。
  • 以上两个优化方法可以一起用
posted @ 2025-03-23 21:25  liuzhaoxu  阅读(2)  评论(0)    收藏  举报