[R69B] osu!

  • 难度 入门
  • 时限 1s
  • 空限 512m
  • 模拟

数据规模:1n2×1051 \le n \le 2 \times 10^5,字符串仅由 PGM 构成。

思路

按顺序模拟每个判定:P300+combo300 + combo 分、G100+combo100 + combo 分,二者都使连击数加 1;M 不得分且连击数归零。边处理边更新最大连击数。

复杂度:时间 O(n)O(n),空间 O(n)O(n)

仓颉实现

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

main(): Int64 {
    let reader = getStdIn()
    let n = Int64.parse(reader.readln().getOrThrow())
    let s = reader.readln().getOrThrow()
    var score: Int64 = 0
    var combo: Int64 = 0
    var mx: Int64 = 0
    for (i in 0..n) {
        let c = s[i]
        if (c == UInt8(0x50)) {
            score = score + 300 + combo
            combo = combo + 1
        } else if (c == UInt8(0x47)) {
            score = score + 100 + combo
            combo = combo + 1
        } else {
            combo = 0
        }
        if (combo > mx) {
            mx = combo
        }
    }
    let out = StringBuilder()
    out.append(score)
    out.append(" ")
    out.append(mx)
    println(out.toString())
    return 0
}

要点:

  • P0x50)和 G0x47)走加分分支并累加连击,其余(M)直接归零连击。
  • 总分约 n×(300+n)4×1010n \times (300 + n) \approx 4 \times 10^{10},用 Int64 累加。