結果
| 問題 | No.1435 Mmm...... |
| コンテスト | |
| ユーザー |
yakamoto
|
| 提出日時 | 2021-03-19 23:30:50 |
| 言語 | Kotlin (2.3.20) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 4,627 bytes |
| 記録 | |
| コンパイル時間 | 14,206 ms |
| コンパイル使用メモリ | 513,292 KB |
| 実行使用メモリ | 441,640 KB |
| 最終ジャッジ日時 | 2026-05-13 10:47:55 |
| 合計ジャッジ時間 | 70,142 ms |
|
ジャッジサーバーID (参考情報) |
judge2_1 / judge1_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 6 TLE * 18 |
コンパイルメッセージ
Main.kt:30:26: warning: the corresponding parameter in the supertype 'Comparable' is named 'other'. This may cause problems when calling this function with named arguments.
override fun compareTo(v: Val): Int {
^
Main.kt:192:11: warning: expected performance impact from inlining is insignificant. Inlining works best for functions with parameters of function types.
private inline fun debug(a: LongArray) {
^^^^^^
Main.kt:196:11: warning: expected performance impact from inlining is insignificant. Inlining works best for functions with parameters of function types.
private inline fun debug(a: IntArray) {
^^^^^^
Main.kt:200:11: warning: expected performance impact from inlining is insignificant. Inlining works best for functions with parameters of function types.
private inline fun debug(a: BooleanArray) {
^^^^^^
Main.kt:204:11: warning: expected performance impact from inlining is insignificant. Inlining works best for functions with parameters of function types.
private inline fun toString(a: BooleanArray) = run{a.map { if (it) 1 else 0 }.joinToString("")}
^^^^^^
Main.kt:206:11: warning: expected performance impact from inlining is insignificant. Inlining works best for functions with parameters of function types.
private inline fun debugDim(A: Array<LongArray>) {
^^^^^^
Main.kt:213:11: warning: expected performance impact from inlining is insignificant. Inlining works best for functions with parameters of function types.
private inline fun debugDim(A: Array<IntArray>) {
^^^^^^
Main.kt:220:11: warning: expected performance impact from inlining is insignificant. Inlining works best for functions with parameters of function types.
private inline fun debugDim(A: Array<BooleanArray>) {
^^^^^^
Main.kt:237:11: warning: expected performance impact from inlining is insignificant. Inlining works best for functions with parameters of function types.
private inline fu
ソースコード
import java.io.BufferedReader
import java.io.InputStream
import java.io.InputStreamReader
import java.lang.AssertionError
import java.util.*
import kotlin.collections.HashSet
import kotlin.math.abs
import kotlin.math.max
import kotlin.math.min
val MOD = 1_000_000_007
/**
* 単調減少
* [l, h) 方式
* @return マッチするものがなかったらl
*/
inline fun findMax(l: Int, r: Int, f: (Int) -> Boolean): Int {
var low = l
var high = r + 1
while(high - low > 1) {
val m = (low + high) / 2
if (f(m)) low = m
else high = m
}
return low
}
data class Val(val i: Int, val a: Int) : Comparable<Val> {
fun max(v: Val) = if (a > v.a) this else v
override fun compareTo(v: Val): Int {
if (a != v.a) return a.compareTo(v.a)
return i.compareTo(v.i)
}
}
data class Entry(val mx: Val, val mn: List<Val>) {
fun merge(e: Entry): Entry {
val mns = HashSet(mn)
mns.addAll(e.mn)
val sort = mns.toMutableList()
sort.sort()
return Entry(mx.max(e.mx), sort.take(2))
}
}
class Solver(stream: InputStream, private val out: java.io.PrintWriter) {
private val reader = BufferedReader(InputStreamReader(stream), 32768)
private val N = ni()
private val A = na(N)
fun solve() {
val tbl = mutableListOf(Array(N){Entry(Val(it, A[it]), mutableListOf(Val(it, A[it])))})
var k = 1
while (2 * k <= N) {
val lst = tbl.last()
val build = Array(N){lst[it]}
for (i in 0 until N) {
if (i + k < N) {
build[i] = lst[i].merge(lst[i + k])
}
else {
build[i] = lst[i]
}
}
tbl += build
k *= 2
}
val n2k = IntArray(N + 1)
val n2ksize = IntArray(N + 1)
k = 1
var ki = 0
for (n in 1..N) {
if (k * 2 == n) {
k *= 2
ki++
}
n2k[n] = ki
n2ksize[n] = k
}
debug(n2k)
debug(n2ksize)
debug{"${tbl[1].joinToString("")}"}
var ans = 0L
for (i in 0 until N) {
val len = findMax(1, N - i) { len ->
val k = n2k[len]
val ksize = n2ksize[len]
var e = tbl[k][i]
val j = len - ksize
e = e.merge(tbl[k][i + j])
e.mn.size == 2 && e.mn[0].a + e.mn[1].a >= e.mx.a
}
debug{"$i $len"}
if (len > 1) ans += len - 1
}
out.println(ans)
}
private val isDebug = try {
// なんか本番でエラーでる
System.getenv("MY_DEBUG") != null
} catch (t: Throwable) {
false
}
private var tokenizer: StringTokenizer? = null
private fun next(): String {
while (tokenizer == null || !tokenizer!!.hasMoreTokens()) {
tokenizer = StringTokenizer(reader.readLine())
}
return tokenizer!!.nextToken()
}
private fun ni() = next().toInt()
private fun nl() = next().toLong()
private fun ns() = next()
private fun na(n: Int, offset: Int = 0): IntArray {
return IntArray(n) { ni() + offset }
}
private fun nal(n: Int, offset: Int = 0): LongArray {
val res = LongArray(n)
for (i in 0 until n) {
res[i] = nl() + offset
}
return res
}
private fun na2(n: Int, offset: Int = 0): Array<IntArray> {
val a = Array(2){IntArray(n)}
for (i in 0 until n) {
for (e in a) {
e[i] = ni() + offset
}
}
return a
}
private inline fun debug(msg: () -> String) {
if (isDebug) System.err.println(msg())
}
/**
* コーナーケースでエラー出たりするので、debug(dp[1])のように添え字付きの場合はdebug{}をつかうこと
*/
private inline fun debug(a: LongArray) {
debug { a.joinToString(" ") }
}
private inline fun debug(a: IntArray) {
debug { a.joinToString(" ") }
}
private inline fun debug(a: BooleanArray) {
debug { toString(a) }
}
private inline fun toString(a: BooleanArray) = run{a.map { if (it) 1 else 0 }.joinToString("")}
private inline fun debugDim(A: Array<LongArray>) {
if (isDebug) {
for (a in A) {
debug(a)
}
}
}
private inline fun debugDim(A: Array<IntArray>) {
if (isDebug) {
for (a in A) {
debug(a)
}
}
}
private inline fun debugDim(A: Array<BooleanArray>) {
if (isDebug) {
for (a in A) {
debug(a)
}
}
}
/**
* 勝手にimport消されるのを防ぎたい
*/
private fun hoge() {
min(1, 2)
max(1, 2)
abs(-10)
}
private inline fun assert(b: Boolean) = run{if (!b) throw AssertionError()}
}
fun main() {
val out = java.io.PrintWriter(System.out)
Solver(System.`in`, out).solve()
out.flush()
}
yakamoto