[R23B]翻转数位

  • 难度 普及−
  • 时限 1s
  • 空限 512m
  • 模拟

数据规模:1n1041 \le n \le 10^40k1090 \le k \le 10^9ai{0,1}a_i \in \{0, 1\}

思路

统计数组中 11 的个数 cc。要把数组全变成 00,最直接的做法是挑出每个 11 各翻转一次,恰好用掉 cc 次操作。题目要求操作恰好 kk 次,因此剩下 kck - c 次必须消耗在「无效翻转」上:对任意一个位置翻转两次后会回到原状,所以多余的次数只能成对地消耗。

于是充要条件为:kck \ge ckck - c 为偶数。满足则输出 Yes,否则输出 No

复杂度

时间 O(n)O(n)(每组数据遍历一次数组),空间 O(n)O(n)

仓颉实现

import std.env.*
import std.convert.*

main(): Int64 {
    let reader = getStdIn()
    let t = Int64.parse(reader.readln().getOrThrow())
    for (_ in 0..t) {
        let parts = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p: String => Int64.parse(p) })
        let k = parts[1]
        let a = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p: String => Int64.parse(p) })
        var c = 0
        for (x in a) {
            if (x == 1) {
                c += 1
            }
        }
        if (k >= Int64(c) && ((k - Int64(c)) % 2 == 0)) {
            println("Yes")
        } else {
            println("No")
        }
    }
    return 0
}