CF2036C Anya and 1100

Posted on 2025-04-18 23:14  K_J_M  阅读(9)  评论(0)    收藏  举报

题目大意

\(t\) 组测试数据,每一组测试数据有一个只包含 \(0,1\) 的字符串 \(s\),还有一个操作次数 \(q\),每一次操作给定两个正整数 \(i,v\),表示你可以将 \(s_i\) 改为 \(v\),注意,字符串下标从 \(1\) 开始,在每一次操作之后请你输出这个字符串中还有没有 \(1100\) 这样的字串。每一次操作均不独立,即会影响到后面的询问。

Solution

显然直接模拟时间复杂度为 \(\mathcal O(qn)\),第三个点会超时。分析一下发现每一次的修改操作只会对与它相邻的几个有影响,所以考虑对每一次操作维护答案的变化量,这里的答案指的是字符串中一共有多少个为 \(1100\) 的字串,记为 \(cnt\),最后只需要查看 \(cnt>0\) 即可。现在问题就在于怎么在修改过程中维护 \(cnt\)。显然,对于每一次操作,只会对 \(s_{i-3\dots i},s_{i-2\dots i+1},s_{i-1\dots i+2},s_{i,\dots i+3}\) 有影响,所以我们只需要看更改后是否形成了新的 \(1100\),或者有没有把原来的 \(1100\) 给顶替掉了。这样做的时间复杂度为 \(\mathcal O(1)\),总共的时间复杂度为 \(\mathcal O(q)\)
Ac Code