結果
問題 | No.2308 [Cherry 5th Tune B] もしかして、真? |
ユーザー |
|
提出日時 | 2023-05-19 22:27:02 |
言語 | Rust (1.83.0 + proconio) |
結果 |
WA
|
実行時間 | - |
コード長 | 5,236 bytes |
コンパイル時間 | 12,808 ms |
コンパイル使用メモリ | 397,032 KB |
実行使用メモリ | 25,856 KB |
最終ジャッジ日時 | 2024-12-18 03:18:03 |
合計ジャッジ時間 | 20,808 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 12 WA * 27 |
ソースコード
//https://github.com/rust-lang-ja/ac-library-rspub mod fenwicktree {use std::ops::{Bound, RangeBounds};// Reference: https://en.wikipedia.org/wiki/Fenwick_treepub struct FenwickTree<T> {n: usize,ary: Vec<T>,e: T,}impl<T: Clone + std::ops::AddAssign<T>> FenwickTree<T> {pub fn new(n: usize, e: T) -> Self {FenwickTree {n,ary: vec![e.clone(); n],e,}}pub fn accum(&self, mut idx: usize) -> T {let mut sum = self.e.clone();while idx > 0 {sum += self.ary[idx - 1].clone();idx &= idx - 1;}sum}/// performs data[idx] += val;pub fn add<U: Clone>(&mut self, mut idx: usize, val: U)whereT: std::ops::AddAssign<U>,{let n = self.n;idx += 1;while idx <= n {self.ary[idx - 1] += val.clone();idx += idx & idx.wrapping_neg();}}/// Returns data[l] + ... + data[r - 1].pub fn sum<R>(&self, range: R) -> TwhereT: std::ops::Sub<Output = T>,R: RangeBounds<usize>,{let r = match range.end_bound() {Bound::Included(r) => r + 1,Bound::Excluded(r) => *r,Bound::Unbounded => self.n,};let l = match range.start_bound() {Bound::Included(l) => *l,Bound::Excluded(l) => l + 1,Bound::Unbounded => return self.accum(r),};self.accum(r) - self.accum(l)}}#[cfg(test)]mod tests {use super::*;use std::ops::Bound::*;#[test]fn fenwick_tree_works() {let mut bit = FenwickTree::new(5, 0i64);// [1, 2, 3, 4, 5]for i in 0..5 {bit.add(i, i as i64 + 1);}assert_eq!(bit.sum(0..5), 15);assert_eq!(bit.sum(0..4), 10);assert_eq!(bit.sum(1..3), 5);assert_eq!(bit.sum(..), 15);assert_eq!(bit.sum(..2), 3);assert_eq!(bit.sum(..=2), 6);assert_eq!(bit.sum(1..), 14);assert_eq!(bit.sum(1..=3), 9);assert_eq!(bit.sum((Excluded(0), Included(2))), 5);}}}use fenwicktree::*;pub mod scanner {pub struct Scanner {buf: Vec<String>,}impl Scanner {pub fn new() -> Self {Self { buf: vec![] }}pub fn new_from(source: &str) -> Self {let source = String::from(source);let buf = Self::split(source);Self { buf }}pub fn next<T: std::str::FromStr>(&mut self) -> T {loop {if let Some(x) = self.buf.pop() {return x.parse().ok().expect("");}let mut source = String::new();std::io::stdin().read_line(&mut source).expect("");self.buf = Self::split(source);}}fn split(source: String) -> Vec<String> {source.split_whitespace().rev().map(String::from).collect::<Vec<_>>()}}}use std::ops::Deref;use crate::scanner::Scanner;use crate::FenwickTree;fn main() {let mut scanner = Scanner::new();let t: usize = scanner.next();for _ in 0..t {solve(&mut scanner);}}fn solve(scanner: &mut Scanner) {let n: usize = scanner.next();let mut x: Vec<bool> = (0..n).map(|_| {let s = scanner.next::<String>();s.deref() == "True"}).collect();let y: Vec<usize> = (0..n - 1).map(|_| {let s = scanner.next::<String>();match s.deref() {"and" => 0,"or" => 1,"xor" => 2,_ => 3,}}).collect();let s: Vec<usize> = (0..n - 1).map(|_| scanner.next::<usize>()).collect();let mut bit = FenwickTree::new(n, 0i64);for i in 0..n {bit.add(i, 1);}let cont = |ok: usize, ng: usize| -> bool {let l = ok.min(ng);let r = ok.max(ng);l + 1 < r};for &si in s.iter() {let si = si as i64;let mut ok: usize = 0;let mut ng: usize = n + 1;while cont(ok, ng) {let x = (ok + ng) / 2;if bit.sum(0..x) < si {ok = x;} else {ng = x;}}let i = ok;bit.add(i, -1);match y[i] {0 => x[i + 1] = x[i] && x[i + 1],1 => x[i + 1] = x[i] || x[i + 1],2 => x[i + 1] = x[i] ^ x[i + 1],_ => {if !x[i] {x[i + 1] = true}}}}if x[n - 1] {println!("True");} else {println!("False");}}