#![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::*;