编程题
### 问题描述 $01$ 王国上次才打完没多久,这次它们又打起来啦! 不过因为两边都在上次的战斗中吃了亏,它们这次学聪明了,开战前往对方的队伍里安插了间谍,开战之后,有可能某个 $0$ 变成 $1$ ,有可能某个 $1$ 变成 $0$ ,这下局势更加瞬息万变了! 它们想知道对于某一场战斗谁又会赢呢?注意,如果某一段区间内,$“0 0”$ 子串的数量多于 $“1 1”$ 子串,那么 $0$ 就会获胜,反之 $1$ 会获胜 先给出一个长度为 $n$ 的数组,描述局势,再进行 $m$ 次操作,操作分为两种: - 第 $1$ 种是给出一个区间,问这个区间里谁会赢,且赢得哪一方有多少个“x x”子段。 - 第 $2$ 种是给出一个区间,这个区间里都是间谍,他如果是 $0$ 就会变成 $1$ ,如果是 $1$ 就会变成 $0$(注意同一个数有可能多次反转,要不怎么叫谍中谍)。 ### 输入格式 第一行包含 $2$ 个正整数 $n$ 和 $m$ ($1\leq n,m \leq 1\times 10^5$),表示数组的长度和询问的次数。 第二行包含 $n$ 个正整数 $a_i$($0\leq a_i \leq 1$),$a_i$ 表示第 $i$ 个位置上的数字是 $a_i$ 。 接下来 $m$ 行,每行包含 $3$ 个正整数 $op$ 、$l$ 和 $r$ ($1\leq op\leq 2$,$1\leq l,r \leq n$),表示当前操作的类型和询问的区间。 ### 输出格式 对于每一行操作 $1$ ,输出 $2$ 个整数。 第 $1$ 个整数表示赢的是哪一个数字,如果是 $0$ 赢就输出 $0$ ,如果是 $1$ 赢就输出 $1$ ,如果打平,就输出 $-1$ 。 第 $2$ 个整数表示赢的那一方在当前询问的区间里,有几个 $"x x"$ 子串,如果平手,则输出任意一个数字的 “x x” 子串数量即可。 ### 样例输入 ```text 8 3 0 0 1 0 1 1 1 0 1 1 3 2 1 3 1 1 3 ``` ### 样例输出 ```text 0 1 1 1 ``` ### 说明 **样例说明** 第一次操作询问 $[1,3]$ ,有 $1$ 个 $“0 0”$ 子串,有 $0$ 个 $“1 1”$ 子串,所以 $0$ 赢了。 第二次操作翻转 $[1,3]$ ,此时数组为 $1 1 0 0 1 1 1 0$ 。 第三次操作询问 $[1,3]$ ,有 $0$ 个 $“0 0”$ 子串,有 $1$ 个 $“1 1”$ 子串,所以 $1$ 赢了。 **提示** 注意,因为本题输入输出数据较大,所以要用快一些的输入输出方式,比如 $scanf$ 和 $printf$ 。如果想使用 $cin$ 和 $cout$ ,需要关闭流同步。 以及换行不能使用 $endl$ 作为换行符,要用 $"\setminus n"$ 。
查看答案
赣ICP备20007335号-2