結果
問題 | No.1170 Never Want to Walk |
ユーザー |
![]() |
提出日時 | 2022-06-07 22:14:26 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 120 ms / 2,000 ms |
コード長 | 11,075 bytes |
コンパイル時間 | 14,397 ms |
コンパイル使用メモリ | 382,492 KB |
実行使用メモリ | 22,428 KB |
最終ジャッジ日時 | 2024-09-21 04:57:30 |
合計ジャッジ時間 | 18,205 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 37 |
コンパイルメッセージ
warning: unused macro definition: `input_inner` --> src/main.rs:89:14 | 89 | macro_rules! input_inner { | ^^^^^^^^^^^ | = note: `#[warn(unused_macros)]` on by default
ソースコード
#![allow(unused_parens)]#![allow(unused_imports)]#![allow(non_upper_case_globals)]#![allow(non_snake_case)]#![allow(unused_mut)]#![allow(unused_variables)]#![allow(dead_code)]type Vec2<T> = Vec<Vec<T>>;type Vec3<T> = Vec<Vec<Vec<T>>>;#[allow(unused_macros)]macro_rules! invec {( $ t : ty ) => {{let mut s = String::new();match std::io::stdin().read_line(&mut s) {Ok(0) => Vec::<$t>::new(),Ok(n) => s.trim().split_whitespace().map(|s| s.parse::<$t>().unwrap()).collect::<Vec<$t>>(),Err(_) => Vec::<$t>::new(),}}};}#[allow(unused_macros)]macro_rules! get {($t:ty) => {{let mut line: String = String::new();std::io::stdin().read_line(&mut line).unwrap();line.trim().parse::<$t>().unwrap()}};($($t:ty),*) => {{let mut line: String = String::new();std::io::stdin().read_line(&mut line).unwrap();let mut iter = line.split_whitespace();($(iter.next().unwrap().parse::<$t>().unwrap(),)*)}};($t:ty; $n:expr) => {(0..$n).map(|_|get!($t)).collect::<Vec<_>>()};($($t:ty),*; $n:expr) => {(0..$n).map(|_|get!($($t),*)).collect::<Vec<_>>()};($t:ty ;;) => {{let mut line: String = String::new();std::io::stdin().read_line(&mut line).unwrap();line.split_whitespace().map(|t| t.parse::<$t>().unwrap()).collect::<Vec<_>>()}};($t:ty ;; $n:expr) => {(0..$n).map(|_| get!($t ;;)).collect::<Vec<_>>()};}#[allow(unused_macros)]macro_rules! input {(source = $s:expr, $($r:tt)*) => {let mut iter = $s.split_whitespace();input_inner!{iter, $($r)*}};($($r:tt)*) => {let mut s = {use std::io::Read;let mut s = String::new();std::io::stdin().read_to_string(&mut s).unwrap();s};let mut iter = s.split_whitespace();input_inner!{iter, $($r)*}};}macro_rules! input_inner {($iter:expr) => {};($iter:expr, ) => {};($iter:expr, $var:ident : $t:tt $($r:tt)*) => {let $var = read_value!($iter, $t);input_inner!{$iter $($r)*}};($iter:expr, mut $var:ident : $t:tt $($r:tt)*) => {let mut $var = read_value!($iter, $t);input_inner!{$iter $($r)*}};}#[allow(unused_macros)]macro_rules! read_value {($iter:expr, ( $($t:tt),* )) => {( $(read_value!($iter, $t)),* )};($iter:expr, [ $t:tt ; $len:expr ]) => {(0..$len).map(|_| read_value!($iter, $t)).collect::<Vec<_>>()};($next:expr, [$t:tt]) => {{let len = read_value!($next, usize);(0..len).map(|_| read_value!($next, $t)).collect::<Vec<_>>()}};($iter:expr, chars) => {read_value!($iter, String).chars().collect::<Vec<char>>()};($iter:expr, usize1) => {read_value!($iter, usize) - 1};($iter:expr, $t:ty) => {$iter.next().unwrap().parse::<$t>().expect("Parse error")};}#[allow(unused_macros)]#[cfg(debug_assertions)]macro_rules! mydbg {//($arg:expr) => (dbg!($arg))//($arg:expr) => (println!("{:?}",$arg));($($a:expr),*) => {eprintln!(concat!($(stringify!($a), " = {:?}, "),*), $($a),*);}}#[cfg(not(debug_assertions))]macro_rules! mydbg {($($arg:expr),*) => {};}macro_rules! echo {($($a:expr),*) => {$(println!("{}",$a))*}}use std::cmp::*;use std::collections::*;use std::ops::{Add, Div, Mul, Rem, Sub};trait SafeRangeContain {fn safe_contains(&self, x: i64) -> bool;}impl SafeRangeContain for std::ops::Range<usize> {fn safe_contains(&self, x: i64) -> bool {if x < 0 {return false;}return self.contains(&(x as usize));}}#[allow(dead_code)]static INF_I64: i64 = i64::max_value() / 2;#[allow(dead_code)]static INF_I32: i32 = i32::max_value() / 2;#[allow(dead_code)]static INF_USIZE: usize = usize::max_value() / 2;#[allow(dead_code)]static M_O_D: usize = 1000000007;#[allow(dead_code)]static PAI: f64 = 3.1415926535897932;trait IteratorExt: Iterator {fn toVec(self) -> Vec<Self::Item>;}impl<T: Iterator> IteratorExt for T {fn toVec(self) -> Vec<Self::Item> {self.collect()}}trait CharExt {fn toNum(&self) -> usize;fn toAlphabetIndex(&self) -> usize;fn toNumIndex(&self) -> usize;}impl CharExt for char {fn toNum(&self) -> usize {return *self as usize;}fn toAlphabetIndex(&self) -> usize {return self.toNum() - 'a' as usize;}fn toNumIndex(&self) -> usize {return self.toNum() - '0' as usize;}}trait VectorExt {fn joinToString(&self, s: &str) -> String;}impl<T: ToString> VectorExt for Vec<T> {fn joinToString(&self, s: &str) -> String {return self.iter().map(|x| x.to_string()).collect::<Vec<_>>().join(s);}}trait StringExt {fn get_reverse(&self) -> String;}impl StringExt for String {fn get_reverse(&self) -> String {self.chars().rev().collect::<String>()}}trait UsizeExt {fn pow(&self, n: usize) -> usize;}impl UsizeExt for usize {fn pow(&self, n: usize) -> usize {return ((*self as u64).pow(n as u32)) as usize;}}//https://github.com/rust-lang-ja/ac-library-rspub mod dsu {/// Implement (union by size) + (path compression)/// Reference:/// Zvi Galil and Giuseppe F. Italiano,/// Data structures and algorithms for disjoint set union problemspub struct Dsu {n: usize,// root node: -1 * component size// otherwise: parentk: usize,parent_or_size: Vec<i32>,}impl Dsu {// 0 <= size <= 10^8 is constrained.pub fn new(size: usize) -> Self {Self {n: size,k: size,parent_or_size: vec![-1; size],}}pub fn merge(&mut self, a: usize, b: usize) -> usize {assert!(a < self.n);assert!(b < self.n);let (mut x, mut y) = (self.leader(a), self.leader(b));if x == y {return x;}if !self.same(a, b) {self.k -= 1;}if -self.parent_or_size[x] < -self.parent_or_size[y] {std::mem::swap(&mut x, &mut y);}self.parent_or_size[x] += self.parent_or_size[y];self.parent_or_size[y] = x as i32;x}pub fn same(&mut self, a: usize, b: usize) -> bool {assert!(a < self.n);assert!(b < self.n);self.leader(a) == self.leader(b)}pub fn leader(&mut self, a: usize) -> usize {assert!(a < self.n);if self.parent_or_size[a] < 0 {return a;}self.parent_or_size[a] = self.leader(self.parent_or_size[a] as usize) as i32;self.parent_or_size[a] as usize}pub fn groupsize(&self) -> usize {self.k}pub fn size(&mut self, a: usize) -> usize {assert!(a < self.n);let x = self.leader(a);-self.parent_or_size[x] as usize}pub fn groups(&mut self) -> Vec<Vec<usize>> {let mut leader_buf = vec![0; self.n];let mut group_size = vec![0; self.n];for i in 0..self.n {leader_buf[i] = self.leader(i);group_size[leader_buf[i]] += 1;}let mut result = vec![Vec::new(); self.n];for i in 0..self.n {result[i].reserve(group_size[i]);}for i in 0..self.n {result[leader_buf[i]].push(i);}result.into_iter().filter(|x| !x.is_empty()).collect::<Vec<Vec<usize>>>()}}#[cfg(test)]mod tests {use super::*;#[test]fn dsu_works() {let mut d = Dsu::new(4);d.merge(0, 1);assert_eq!(d.same(0, 1), true);d.merge(1, 2);assert_eq!(d.same(0, 2), true);assert_eq!(d.size(0), 3);assert_eq!(d.same(0, 3), false);assert_eq!(d.groups(), vec![vec![0, 1, 2], vec![3]]);assert_eq!(d.groupsize(), 2);}}}use dsu::*;pub trait BinarySearch<T> {fn lower_bound(&self, x: &T) -> usize;fn upper_bound(&self, x: &T) -> usize;}impl<T: Ord> BinarySearch<T> for [T] {fn lower_bound(&self, x: &T) -> usize {let mut low = 0;let mut high = self.len();while low != high {let mid = (low + high) / 2;match self[mid].cmp(x) {Ordering::Less => {low = mid + 1;}Ordering::Equal | Ordering::Greater => {high = mid;}}}low}fn upper_bound(&self, x: &T) -> usize {let mut low = 0;let mut high = self.len();while low != high {let mid = (low + high) / 2;match self[mid].cmp(x) {Ordering::Less | Ordering::Equal => {low = mid + 1;}Ordering::Greater => {high = mid;}}}low}}fn main() {solve();}fn solve() {let mut ans: u64 = 0;let (N, A, B) = get!(usize, i64, i64);let mut E = invec!(i64);let mut h = HashMap::new();for i in 0..N {h.entry(E[i]).or_insert(i);}E.sort();mydbg!(E);let mut dsu = Dsu::new(N);for i in 0..N {let a = E[i];let mut l = E.lower_bound(&(a + A));let mut r = E.upper_bound(&(a + B));for j in l..r {let b = E[j];let v = *h.get(&b).unwrap();if dsu.same(i, v) {break;}dsu.merge(i, v);}for j in (l..r).rev() {let b = E[j];let v = *h.get(&b).unwrap();if dsu.same(i, v) {break;}dsu.merge(i, v);}}let mut ans = vec![0; N];for item in dsu.groups() {let a = item.len();for i in item {ans[i] = a;}}echo!(ans.joinToString("\n"));}