結果
| 問題 |
No.1460 Max of Min
|
| コンテスト | |
| ユーザー |
akakimidori
|
| 提出日時 | 2021-04-02 02:48:05 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,753 bytes |
| コンパイル時間 | 13,515 ms |
| コンパイル使用メモリ | 402,256 KB |
| 実行使用メモリ | 6,824 KB |
| 最終ジャッジ日時 | 2024-12-21 12:34:17 |
| 合計ジャッジ時間 | 30,969 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 69 WA * 22 |
ソースコード
// ---------- begin chmin, chmax ----------
pub trait ChangeMinMax {
fn chmin(&mut self, x: Self) -> bool;
fn chmax(&mut self, x: Self) -> bool;
}
impl<T: PartialOrd> ChangeMinMax for T {
fn chmin(&mut self, x: Self) -> bool {
*self > x && {
*self = x;
true
}
}
fn chmax(&mut self, x: Self) -> bool {
*self < x && {
*self = x;
true
}
}
}
// ---------- end chmin, chmax ----------
fn read() -> (usize, Vec<i64>, Vec<i64>) {
let mut s = String::new();
use std::io::Read;
std::io::stdin().read_to_string(&mut s).unwrap();
let mut it = s.trim().split_whitespace();
let mut next = || it.next().unwrap().parse::<i64>().unwrap();
let k = next() as usize;
let n = next() as usize;
let a = (0..k).map(|_| next()).collect::<Vec<_>>();
let b = (0..k).map(|_| next()).collect::<Vec<_>>();
(n, a, b)
}
const INF: i64 = 1_000_000_000_000_000_000 + 1;
fn solve(n: usize, a: &[i64], b: &[i64]) -> i64 {
if n < a.len() {
return a[n];
}
let k = a.len();
let mut ok = -INF;
let mut ng = INF;
while ng - ok > 1 {
let mid = (ok + ng) / 2;
let a = a.iter().map(|a| *a >= mid).collect::<Vec<_>>();
let b = b.iter().map(|a| *a >= mid).collect::<Vec<_>>();
let mut c = vec![false; 2 * k];
c[..k].copy_from_slice(&a);
for i in 0..k {
c[i + k] = c[i..].iter().zip(b.iter()).any(|p| *p.0 && *p.1);
}
if n < 2 * k {
if c[n] {
ok = mid;
} else {
ng = mid;
}
continue;
}
let mut dp = vec![n + 1; k];
for (i, c) in c[k..].iter().enumerate() {
if *c {
dp[i] = k + i;
}
}
let mut used = vec![false; k];
for _ in 0..k {
let x = (0..k).filter(|p| !used[*p]).min_by_key(|p| dp[*p]).unwrap();
used[x] = true;
let v = dp[x];
for (i, c) in b.iter().enumerate() {
if *c {
dp[(x + k - i) % k].chmin(v + k - i);
}
}
}
let mut can = false;
for (i, c) in b.iter().enumerate() {
if *c {
for (j, dp) in dp.iter().enumerate() {
if (n - k - j) % (k - i) == 0 {
can |= *dp <= n;
}
}
}
}
if can {
ok = mid;
} else {
ng = mid;
}
}
ok
}
fn run() {
let (n, a, b) = read();
let ans = solve(n, &a, &b);
println!("{}", ans);
}
fn main() {
run();
}
akakimidori