1535C. Unstable String Problem - 1535C - Codeforces
t 组询问,每次给定一个仅包含字符 1
或 0
或 ?
字符串 s。定义一个子串是不稳定的当且仅当子串中任意相邻两数均不相同,如 101010⋯101010⋯ 或 010101⋯010101⋯。
我们称一个子串是好看的当且仅当我们可以将其中的 ?
换为 1
或 0
其中一种使得这个子串是不稳定的。
求字符串中好看的子串个数之和。
思路
这也算dp题?
先思考如何判断一个序列[l,r]是否是不稳定的,发现只要[l,r-1]是不稳定的,且r和r-1不一样即可①那么可以dp。
初始化为全0
转移方程:
如果i为1,dp[i][1]=dp[i-1][0]+1
如果i为0,dp[i][0]=dp[i-1][1]+1
如果i为?,dp[i][1]=dp[i-1][0]+1,dp[i][0]=dp[i-1][1]+1
再考虑如何统计一个序列的贡献,对于序列 [1,r] 它的子序列有1+2+..+r,那么如果遍历右端点(从[1,1]到[1,r]),很显然每个序列都是不稳定,那么对于本次遍历,如果[1,ri]为不稳定①,那么贡献为ri,即dp[i]=dp[i-1]+1。
再考虑稳定序列对答案的影响。发现:对于序列01011010,可以视为0101+1010,且两半不相互影响,因此遍历时发现不稳定可以直接设置当前贡献为0,即dp[i]=0.
1548A. Web of Lies Problem - 1548A - Codeforces
有 n 个人,q 组询问。一开始这 n 个人之间有 m 条边相连。
有 3 种操作:
-
1 u v(1≤u,v≤n,u=v) 表示在 u 和 v 之间连一条边。保证 u 和 v 之间没有边。
-
2 u v(1≤u,v≤n,u=v) 表示在 u 和 v 之间删一条边。保证 u 和 v 之间有边。
-
3 表示执行以下操作直至不可再执行为止。定义一个人的强度为其编号。在每个 大小大于 1 的连通块中找到强度最小的人,将这个人及其所连的边一同删去。在所有操作执行完毕后,请你输出还剩下多少人。注意,每个 3 操作之间彼此独立。即删人只是暂时的,这次操作结束之后所有被删的人连同边会复活。
思路
图
考虑情况3:
可以发现,最后存活的一定是只连接比自己小的节点的点以及没有连接的点
那么只要一个点有比自己大的朋友,那么这个点就一定会死,再考虑到有删除操作,那么只要给每个点设置一个变量x储存比自己大的朋友的个数,每次更新时进行维护就可以,时间复杂度O(1)。
为避免重复计算,只有在x增加,并且0->1的情况才计算为死亡,即die++
每次删除边时,只有在x减少,并且1->0的情况,才视为复活,即die--
最后输出n-die