Submission #63598577
Source Code Expand
Copy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//#[derive_readable]
#[derive(Debug, Clone)]
struct Problem {
n: usize,
xs: Vec<i64>,
}
impl Problem {
fn read() -> Problem {
input! {
n: usize,
xs: [i64; n],
}
Problem { n, xs }
}
fn solve(&self) -> Answer {
let n = self.n;
let xs = &self.xs;
let mut dp = vec![0; n + 1];
dp[0] = 0;
dp[1] = xs[0];
for i in 2..=n {
dp[i] = dp[i - 2].max(dp[i - 1] + xs[i - 1]);
}
let ans = dp[n];
Answer { ans }
}
#[allow(dead_code)]
fn solve_naive(&self) -> Answer {
let n = self.n;
let xs = &self.xs;
let ans = BitSet::all_subset(n)
.filter_map(|set| {
let mut stack = Stack::new();
for i in 0..n {
if set.contains(i) {
stack.push(xs[i]);
} else {
stack.pop()?;
}
}
let sub_ans = stack.raw.iter().copied().sum::<i64>();
Some(sub_ans)
})
.max()
.unwrap();
Answer { ans }
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
struct Answer {
ans: i64,
}
impl Answer {
fn print(&self) {
println!("{}", self.ans);
}
}
fn main() {
Problem::read().solve().print();
}
#[cfg(test)]
mod tests {
#[allow(unused_imports)]
use super::*;
#[allow(unused_imports)]
use rand::{rngs::SmallRng, seq::SliceRandom, *};
#[test]
fn test_problem() {
assert_eq!(1 + 1, 2);
}
#[allow(dead_code)]
#[derive(Debug)]
struct WrongTestCase {
problem: Problem,
main_ans: Answer,
naive_ans: Answer,
}
#[allow(dead_code)]
fn check(p: &Problem) -> Option<WrongTestCase> {
let main_ans = p.solve();
let naive_ans = p.solve_naive();
if main_ans != naive_ans {
Some(WrongTestCase {
problem: p.clone(),
main_ans,
naive_ans,
})
} else {
None
}
}
#[allow(dead_code)]
fn make_random_problem(rng: &mut SmallRng) -> Problem {
todo!()
// let n = rng.gen_range(1..=10);
// let p = Problem { _a: n };
// println!("{:?}", &p);
// p
}
#[allow(unreachable_code)]
#[test]
fn test_with_naive() {
let num_tests = 0;
let max_wrong_case = 10; // この件数間違いが見つかったら打ち切り
let mut rng = SmallRng::seed_from_u64(42);
// let mut rng = SmallRng::from_entropy();
let mut wrong_cases: Vec<WrongTestCase> = vec![];
for _ in 0..num_tests {
let p = make_random_problem(&mut rng);
let result = check(&p);
if let Some(wrong_test_case) = result {
wrong_cases.push(wrong_test_case);
}
if wrong_cases.len() >= max_wrong_case {
break;
}
}
if !wrong_cases.is_empty() {
for t in &wrong_cases {
println!("{:?}", t.problem);
println!("main ans : {:?}", t.main_ans);
println!("naive ans: {:?}", t.naive_ans);
println!();
}
println!("{} cases are wrong.", wrong_cases.len());
panic!();
}
}
}
// ====== import ======
#[allow(unused_imports)]
use itertools::{chain, iproduct, izip, Itertools};
#[allow(unused_imports)]
use proconio::{
derive_readable, fastout, input,
marker::{Bytes, Chars, Usize1},
};
#[allow(unused_imports)]
use std::cmp::Reverse;
#[allow(unused_imports)]
use std::collections::{BinaryHeap, HashMap, HashSet};
// ====== output func ======
#[allow(unused_imports)]
use print_vec::*;
pub mod print_vec {
use itertools::Itertools;
use proconio::fastout;
#[fastout]
pub fn print_vec<T: std::fmt::Display>(arr: &[T]) {
for a in arr {
println!("{}", a);
}
}
#[fastout]
pub fn print_vec_1line<T: std::fmt::Display>(arr: &[T]) {
let msg = arr.iter().map(|x| format!("{}", x)).join(" ");
println!("{}", msg);
}
#[fastout]
pub fn print_vec2<T: std::fmt::Display>(arr: &Vec<Vec<T>>) {
for row in arr {
let msg = row.iter().map(|x| format!("{}", x)).join(" ");
println!("{}", msg);
}
}
pub fn print_bytes(bytes: &[u8]) {
let msg = String::from_utf8(bytes.to_vec()).unwrap();
println!("{}", msg);
}
pub fn print_chars(chars: &[char]) {
let msg = chars.iter().collect::<String>();
println!("{}", msg);
}
#[fastout]
pub fn print_vec_bytes(vec_bytes: &[Vec<u8>]) {
for row in vec_bytes {
let msg = String::from_utf8(row.to_vec()).unwrap();
println!("{}", msg);
}
}
}
#[allow(unused)]
fn print_yesno(ans: bool) {
let msg = if ans { "Yes" } else { "No" };
println!("{}", msg);
}
// ====== snippet ======
use mod_stack::*;
pub mod mod_stack {
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Stack<T> {
pub raw: Vec<T>,
}
impl<T> Stack<T> {
pub fn new() -> Self {
Stack { raw: Vec::new() }
}
pub fn push(&mut self, value: T) {
self.raw.push(value)
}
pub fn pop(&mut self) -> Option<T> {
self.raw.pop()
}
pub fn peek(&self) -> Option<&T> {
self.raw.last()
}
pub fn is_empty(&self) -> bool {
self.raw.is_empty()
}
pub fn len(&self) -> usize {
self.raw.len()
}
}
impl<T> Default for Stack<T> {
fn default() -> Self {
Self::new()
}
}
}
use bitset::*;
#[allow(clippy::module_inception)]
pub mod bitset {
use itertools::Itertools;
use std::{
fmt::{Error, Formatter},
ops::{BitAnd, BitOr, BitXor, Index, IndexMut},
};
#[derive(Clone, Copy, PartialEq, Eq)]
pub struct BitSet {
bit: usize,
}
impl BitSet {
#[inline]
pub fn new(bit: usize) -> BitSet {
BitSet { bit }
}
pub fn to_bit(self) -> usize {
self.bit
}
/// 持っている要素を Vec<usize> で返す
pub fn to_vec(self, len: usize) -> Vec<usize> {
(0..len).filter(|i| (self.bit >> i) & 1 == 1).collect_vec()
}
/// 持っている要素を Iterator で返す
pub fn to_iter(self, len: usize) -> impl Iterator<Item = usize> {
(0..len).filter(move |i| (self.bit >> i) & 1 == 1)
}
pub fn contains(self, x: usize) -> bool {
(self.bit >> x) & 1 == 1
}
pub fn len(self) -> usize {
self.bit.count_ones() as usize
}
pub fn inserted(self, x: usize) -> BitSet {
BitSet::new(self.bit | (1 << x))
}
pub fn removed(self, x: usize) -> BitSet {
BitSet::new(self.bit & !(1 << x))
}
pub fn empty() -> BitSet {
BitSet::new(0)
}
pub fn universal_set(size: usize) -> BitSet {
BitSet::new((1 << size) - 1)
}
pub fn complement(self, size: usize) -> BitSet {
BitSet::new(self.bit ^ ((1 << size) - 1))
}
pub fn set_minus(self, other: BitSet) -> BitSet {
BitSet::new(self.bit & !other.bit)
}
pub fn is_empty(self) -> bool {
self.bit == 0
}
pub fn is_subset(self, other: BitSet) -> bool {
self | other == other
}
pub fn all_subset(size: usize) -> impl Iterator<Item = BitSet> {
(0..(1 << size)).map(BitSet::new)
}
pub fn subsets(self) -> impl Iterator<Item = BitSet> {
std::iter::successors(Some(self.bit), move |x| {
if *x == 0 {
None
} else {
Some((x - 1) & self.bit)
}
})
.map(BitSet::new)
}
}
impl BitAnd for BitSet {
type Output = BitSet;
fn bitand(self, rhs: BitSet) -> BitSet {
BitSet::new(self.bit & rhs.bit)
}
}
impl BitOr for BitSet {
type Output = BitSet;
fn bitor(self, rhs: BitSet) -> BitSet {
BitSet::new(self.bit | rhs.bit)
}
}
impl BitXor for BitSet {
type Output = BitSet;
fn bitxor(self, rhs: BitSet) -> BitSet {
BitSet::new(self.bit ^ rhs.bit)
}
}
use std::fmt::Debug;
impl Debug for BitSet {
fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
f.write_fmt(format_args!("{:#b}", self.bit))?;
Ok(())
}
}
impl<T> Index<BitSet> for [T] {
type Output = T;
fn index(&self, s: BitSet) -> &Self::Output {
&self[s.to_bit()]
}
}
impl<T> IndexMut<BitSet> for [T] {
fn index_mut(&mut self, s: BitSet) -> &mut Self::Output {
&mut self[s.to_bit()]
}
}
impl<T> Index<BitSet> for Vec<T> {
type Output = T;
fn index(&self, s: BitSet) -> &Self::Output {
&self[..][s]
}
}
impl<T> IndexMut<BitSet> for Vec<T> {
fn index_mut(&mut self, s: BitSet) -> &mut Self::Output {
&mut self[..][s]
}
}
}
Submission Info
Submission Time |
|
Task |
A - Operations on a Stack |
User |
paruma184 |
Language |
Rust (rustc 1.70.0) |
Score |
400 |
Code Size |
9561 Byte |
Status |
AC |
Exec Time |
8 ms |
Memory |
7152 KB |
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
400 / 400 |
Status |
|
|
Set Name |
Test Cases |
Sample |
example0.txt, example1.txt, example2.txt |
All |
000.txt, 001.txt, 002.txt, 003.txt, 004.txt, 005.txt, 006.txt, 007.txt, 008.txt, 009.txt, 010.txt, 011.txt, 012.txt, 013.txt, 014.txt, 015.txt, 016.txt, 017.txt, 018.txt, 019.txt, 020.txt, 021.txt, 022.txt, 023.txt, 024.txt, example0.txt, example1.txt, example2.txt |
Case Name |
Status |
Exec Time |
Memory |
000.txt |
AC |
0 ms |
2000 KB |
001.txt |
AC |
0 ms |
1936 KB |
002.txt |
AC |
8 ms |
6928 KB |
003.txt |
AC |
7 ms |
6880 KB |
004.txt |
AC |
7 ms |
7040 KB |
005.txt |
AC |
7 ms |
6944 KB |
006.txt |
AC |
7 ms |
7152 KB |
007.txt |
AC |
0 ms |
1856 KB |
008.txt |
AC |
0 ms |
1924 KB |
009.txt |
AC |
0 ms |
1868 KB |
010.txt |
AC |
4 ms |
4688 KB |
011.txt |
AC |
2 ms |
2780 KB |
012.txt |
AC |
4 ms |
4100 KB |
013.txt |
AC |
5 ms |
4736 KB |
014.txt |
AC |
5 ms |
5008 KB |
015.txt |
AC |
8 ms |
6896 KB |
016.txt |
AC |
8 ms |
6932 KB |
017.txt |
AC |
8 ms |
6828 KB |
018.txt |
AC |
8 ms |
6876 KB |
019.txt |
AC |
8 ms |
6916 KB |
020.txt |
AC |
8 ms |
6928 KB |
021.txt |
AC |
8 ms |
6816 KB |
022.txt |
AC |
8 ms |
6768 KB |
023.txt |
AC |
8 ms |
6956 KB |
024.txt |
AC |
8 ms |
6988 KB |
example0.txt |
AC |
1 ms |
2072 KB |
example1.txt |
AC |
0 ms |
2076 KB |
example2.txt |
AC |
1 ms |
2064 KB |