[R19A]特殊卡片
数据规模:,保证 是 到 的排列(每个数字恰好出现一次)。
思路
第 张卡片是特殊卡片,当且仅当存在某个 满足 且 。
由于输入保证是 到 的一个排列(即数组下标集合 到数值集合 的双射), 中的 被 唯一确定:。于是「存在 」这个条件不用枚举,直接看 是否满足 即可。
也就是说,第 张卡片特殊当且仅当
逐位判断即可。注意题目中卡片下标从 开始,代码里数组下标从 开始,要做相应偏移。
复杂度
时间 ,空间 。
仓颉实现
import std.env.*
import std.convert.*
main(): Int64 {
let reader = getStdIn()
let n = Int64.parse(reader.readln().getOrThrow())
let a = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p: String => Int64.parse(p) })
var cnt = 0
var i = Int64(0)
while (i < n) {
// 第 (i+1) 张卡片上的数字是 a[i];条件 a_{a_{i+1}} == i+1
if (a[a[i] - 1] == i + 1) {
cnt++
}
i++
}
println(cnt)
return 0
}