第一行输入一个整数
,表示数组
的长度。
第二行输入
个整数
,表示数组元素。
输出一个整数,表示可行二元组的数量。
5 1 2 3 4 5
2
macro_rules! read_line {
($buf:ident) => {
$buf.clear();
std::io::stdin().read_line(&mut $buf)?;
};
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut buf = String::new();
read_line!(buf);
read_line!(buf);
let nums = buf
.trim()
.split(' ')
.map(|s| s.parse::<usize>().unwrap())
.collect::<Vec<_>>();
let n = nums.len();
let mut sum = vec![0; n + 1];
for i in 0..n {
sum[i + 1] = sum[i] + nums[i];
}
// [0, i) [i, j) [j, n) 2 * sum[j] > sum[n] + sum[i]
// sum[j] - sum[i] > sum[i];
// sum[j] > 2 * sum[i]
let mut ret = 0;
for i in 1..n - 1 {
let target = (sum[i] * 4).max(sum[n] + sum[i]);
let mut left = i + 1;
let mut right = n;
while left < right {
let mid = (left + right) >> 1;
if sum[mid] * 2 > target {
right = mid;
} else {
left = mid + 1;
}
}
ret += n - right;
}
print!("{}", ret);
Ok(())
}