Submission #68216359


Source Code Expand

// Takahashi's Expectation
#![allow(non_snake_case)]

use std::cmp::max;


//////////////////// library ////////////////////

fn read<T: std::str::FromStr>() -> T {
	let mut line = String::new();
	std::io::stdin().read_line(&mut line).ok();
	line.trim().parse().ok().unwrap()
}

fn read_vec<T: std::str::FromStr>() -> Vec<T> {
	read::<String>().split_whitespace()
			.map(|e| e.parse().ok().unwrap()).collect()
}


//////////////////// process ////////////////////

type Present = (i64, i64, i64);

fn read_present() -> Present {
	let v: Vec<i64> = read_vec();
	let (P, A, B) = (v[0], v[1], v[2]);
	(P, A, B)
}

fn read_input() -> (Vec<Present>, usize) {
	let N: usize = read();
	let presents: Vec<Present> = (0..N).map(|_| read_present()).collect();
	let Q: usize = read();
	(presents, Q)
}

fn make_DP(presents: &Vec<Present>) -> Vec<Vec<i64>> {
	let N = presents.len();
	let M = presents.iter().map(|&(P, A, _)| P+A).max().unwrap();
	let mut dp: Vec<Vec<i64>> = vec![vec![0; M as usize + 1]; N+1];
	dp[N] = (0..M+1).collect();
	for n in (0..N).rev() {
		let (P, A, B) = presents[n];
		for x in 0..M+1 {
			if x <= P {
				dp[n][x as usize] = dp[n+1][(x+A) as usize];
			}
			else {
				dp[n][x as usize] = dp[n+1][max(0, x-B) as usize]
			}
		}
	}
	dp
}

fn accumulate(v: &Vec<i64>) -> Vec<i64> {
	let N = v.len();
	let mut a: Vec<i64> = vec![0; N+1];
	for n in 0..N {
		a[n+1] = a[n] + v[n]
	}
	a
}

fn bin_search(x: i64, first: usize, last: usize, acc: &Vec<i64>) -> usize {
	let mid = (first + last) / 2;
	if last - first == 1 {
		first
	}
	else if last - first == 2 {
		if acc[first] >= x {
			first
		}
		else {
			first + 1
		}
	}
	else if acc[mid] >= x {
		bin_search(x, first, mid + 1, acc)
	}
	else {
		bin_search(x, mid + 1, last, acc)
	}
}

fn F_each(X: i64, dp: &Vec<Vec<i64>>, acc_B: &Vec<i64>) -> i64 {
	let N = dp.len() - 1;
	let M = dp[0].len() as i64;
	if X < M {
		dp[0][X as usize]
	}
	else if X > acc_B[N-1] + M - 1 {
		X - acc_B[N]
	}
	else {
		let n = bin_search(X - M + 1, 0, N + 1, acc_B);
		if n == 0 {
//			X - acc_B[n]
			X
		}
		else {
			let x = X - acc_B[n];
			dp[n][x as usize]
		}
	}
}

fn F(presents: Vec<Present>, Q: usize) {
	let dp = make_DP(&presents);
	let v: Vec<i64> = presents.iter().map(|&(_, _, B)| B).collect::<Vec<_>>();
	let acc_B = accumulate(&v);
	for _ in 0..Q {
		let X: i64 = read();
		println!("{}", F_each(X, &dp, &acc_B))
	}
}

fn main() {
	let (presents, Q) = read_input();
	F(presents, Q)
}

Submission Info

Submission Time
Task D - Takahashi's Expectation
User m_inamori
Language Rust (rustc 1.70.0)
Score 0
Code Size 2573 Byte
Status RE
Exec Time 517 ms
Memory 84324 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 0 / 425
Status
AC × 3
AC × 29
RE × 1
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 01_random_10.txt, 01_random_11.txt, 01_random_12.txt, 01_random_13.txt, 01_random_14.txt, 01_random_15.txt, 01_random_16.txt, 01_random_17.txt, 01_random_18.txt, 01_random_19.txt, 01_random_20.txt, 01_random_21.txt, 01_random_22.txt, 01_random_23.txt, 01_random_24.txt, 01_random_25.txt, 01_random_26.txt, 01_random_27.txt, 01_random_28.txt, 01_random_29.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 1924 KiB
00_sample_01.txt AC 1 ms 2096 KiB
00_sample_02.txt AC 1 ms 1864 KiB
01_random_03.txt AC 506 ms 84192 KiB
01_random_04.txt AC 509 ms 84044 KiB
01_random_05.txt AC 507 ms 83552 KiB
01_random_06.txt AC 509 ms 84064 KiB
01_random_07.txt AC 507 ms 83812 KiB
01_random_08.txt AC 512 ms 83632 KiB
01_random_09.txt AC 509 ms 84084 KiB
01_random_10.txt AC 517 ms 84288 KiB
01_random_11.txt AC 512 ms 84244 KiB
01_random_12.txt AC 514 ms 83892 KiB
01_random_13.txt AC 512 ms 83680 KiB
01_random_14.txt AC 512 ms 83512 KiB
01_random_15.txt AC 513 ms 83984 KiB
01_random_16.txt AC 163 ms 31016 KiB
01_random_17.txt AC 192 ms 3568 KiB
01_random_18.txt AC 468 ms 65860 KiB
01_random_19.txt AC 98 ms 24668 KiB
01_random_20.txt AC 139 ms 48124 KiB
01_random_21.txt AC 464 ms 38532 KiB
01_random_22.txt AC 465 ms 7232 KiB
01_random_23.txt AC 258 ms 8276 KiB
01_random_24.txt AC 467 ms 6276 KiB
01_random_25.txt AC 488 ms 45388 KiB
01_random_26.txt AC 496 ms 45344 KiB
01_random_27.txt AC 513 ms 84288 KiB
01_random_28.txt AC 514 ms 84324 KiB
01_random_29.txt RE 3 ms 2712 KiB