結果
| 問題 | No.3509 Get More Money |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-03-20 23:21:36 |
| 言語 | Rust (1.94.0 + proconio + num + itertools) |
| 結果 |
AC
|
| 実行時間 | 257 ms / 2,000 ms |
| コード長 | 1,666 bytes |
| 記録 | |
| コンパイル時間 | 5,557 ms |
| コンパイル使用メモリ | 201,812 KB |
| 実行使用メモリ | 17,776 KB |
| 最終ジャッジ日時 | 2026-04-17 19:43:37 |
| 合計ジャッジ時間 | 19,733 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 60 |
ソースコード
#![allow(non_snake_case,dead_code)]
fn main(){
input!{
t:usize,
}
let solve=||{
input!{
n:usize,
K:i64,
A:[i64;n], // 買うときの値段
B:[i64;n], // 買う上限
C:[i64;n], // 売るときの値段
D:[i64;n], // 売る上限
}
// [x] := x個ジュエルがあるときの最大利益*-1
let mut set=std::collections::BTreeSet::new(); // (傾き,長さ,id)
set.insert((1e9 as i64,K,!0));
let mut Z=0; // 定数項
for (i,(a,b,c,d)) in izip!(A,B,C,D).enumerate(){
set.insert((a,b,i*2));
set.insert((c,d,i*2+1));
Z-=c*d;
// 前からd削る
let mut rem=d;
while rem!=0{
let &(coeff,len,it)=set.first().unwrap();
let nl=(len-rem).max(0);
let diff=len-nl;
rem-=diff;
set.remove(&(coeff,len,it));
if nl>0{
set.insert((coeff,nl,it));
}
Z+=coeff*diff;
}
// 後ろからb削る
let mut rem=b;
while rem!=0{
let &(coeff,len,it)=set.last().unwrap();
let nl=(len-rem).max(0);
let diff=len-nl;
rem-=diff;
set.remove(&(coeff,len,it));
if nl>0{
set.insert((coeff,nl,it));
}
}
}
print!("{}\n",-Z);
};
for _ in 0..t{
solve();
}
}
use proconio::*;
use itertools::*;