結果
問題 | No.274 The Wall |
ユーザー |
![]() |
提出日時 | 2020-09-26 00:05:48 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 672 ms / 2,000 ms |
コード長 | 5,768 bytes |
コンパイル時間 | 15,450 ms |
コンパイル使用メモリ | 379,024 KB |
実行使用メモリ | 323,968 KB |
最終ジャッジ日時 | 2024-06-28 08:26:36 |
合計ジャッジ時間 | 18,370 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 22 |
コンパイルメッセージ
warning: unused variable: `i` --> src/main.rs:23:9 | 23 | for i in 0..n { | ^ help: if this is intentional, prefix it with an underscore: `_i` | = note: `#[warn(unused_variables)]` on by default
ソースコード
#![allow(unused_imports)]use std::cmp::*;use std::collections::*;use std::io::Write;use std::ops::Bound::*;#[allow(unused_macros)]macro_rules! debug {($($e:expr),*) => {#[cfg(debug_assertions)]$({let (e, mut err) = (stringify!($e), std::io::stderr());writeln!(err, "{} = {:?}", e, $e).unwrap()})*};}fn main() {let v = read_vec::<usize>();let (n, m) = (v[0], v[1] as i64);let mut blocks = vec![];for i in 0..n {let v = read_vec::<i64>();let (l, r) = (v[0], v[1]);blocks.push((l, r));}let mut cons = vec![];for i in 0..n {let (l1, r1) = blocks[i];for j in i + 1..n {let (l2, r2) = blocks[j];if r1 < l2 || r2 < l1 {} else {cons.push((i as i32 + 1, j as i32 + 1));cons.push((-(i as i32 + 1), -(j as i32 + 1)));}let (l2, r2) = (m - 1 - r2, m - 1 - l2);if r1 < l2 || r2 < l1 {} else {cons.push((i as i32 + 1, -(j as i32 + 1)));cons.push((-(i as i32 + 1), j as i32 + 1));}}}if let Some(_) = two_sat(n, &cons) {println!("YES");} else {println!("NO");}}fn read<T: std::str::FromStr>() -> T {let mut s = String::new();std::io::stdin().read_line(&mut s).ok();s.trim().parse().ok().unwrap()}fn read_vec<T: std::str::FromStr>() -> Vec<T> {read::<String>().split_whitespace().map(|e| e.parse().ok().unwrap()).collect()}struct SCC {n: usize,ncc: usize,g: Vec<Vec<usize>>, // graph in adjacent listrg: Vec<Vec<usize>>, // reverse graphcmp: Vec<usize>, // topological order}impl SCC {fn new(n: usize) -> Self {SCC {n: n,ncc: n + 1,g: vec![Vec::new(); n],rg: vec![Vec::new(); n],cmp: vec![0; n],}}fn add_edge(&mut self, from: usize, to: usize) {self.g[from].push(to);self.rg[to].push(from);}fn dfs(&self, v: usize, used: &mut [bool], vs: &mut Vec<usize>) {used[v] = true;for &w in self.g[v].iter() {if !used[w] {self.dfs(w, used, vs);}}vs.push(v);}fn rdfs(&self, v: usize, k: usize, used: &mut [bool], cmp: &mut [usize]) {used[v] = true;cmp[v] = k;for &w in self.rg[v].iter() {if !used[w] {self.rdfs(w, k, used, cmp);}}}fn scc(&mut self) -> usize {let n = self.n;let mut used = vec![false; n];let mut vs = Vec::new();let mut cmp = vec![0; n];for v in 0..n {if !used[v] {self.dfs(v, &mut used, &mut vs);}}for u in used.iter_mut() {*u = false;}let mut k = 0;for &t in vs.iter().rev() {if !used[t] {self.rdfs(t, k, &mut used, &mut cmp);k += 1;}}self.ncc = k;self.cmp = cmp;k}#[allow(dead_code)]fn top_order(&self) -> Vec<usize> {assert!(self.ncc <= self.n);self.cmp.clone()}/** Returns a dag whose vertices are scc's, and whose edges are those of the original graph.*/#[allow(dead_code)]fn dag(&self) -> Vec<Vec<usize>> {assert!(self.ncc <= self.n);let ncc = self.ncc;let mut ret = vec![HashSet::new(); ncc];let n = self.n;for i in 0..n {for &to in self.g[i].iter() {if self.cmp[i] != self.cmp[to] {assert!(self.cmp[i] < self.cmp[to]);ret[self.cmp[i]].insert(self.cmp[to]);}}}ret.into_iter().map(|set| set.into_iter().collect()).collect()}#[allow(dead_code)]fn rdag(&self) -> Vec<Vec<usize>> {assert!(self.ncc <= self.n);let ncc = self.ncc;let mut ret = vec![HashSet::new(); ncc];let n = self.n;for i in 0..n {for &to in self.g[i].iter() {if self.cmp[i] != self.cmp[to] {assert!(self.cmp[i] < self.cmp[to]);ret[self.cmp[to]].insert(self.cmp[i]);}}}ret.into_iter().map(|set| set.into_iter().collect()).collect()}}/*** 2-SAT solver.* n: the number of variables (v_1, ..., v_n)* cons: constraints, given in 2-cnf* i (1 <= i <= n) means v_i, -i (1 <= i <= n) means not v_i.* Returns: None if there's no assignment that satisfies cons.* Otherwise, it returns an assignment that safisfies cons. (true: true, false: false)* Dependencies: SCC.rs* Verified by: Codeforces #400 D* (http://codeforces.com/contest/776/submission/24957215)*/fn two_sat(n: usize, cons: &[(i32, i32)]) -> Option<Vec<bool>> {let mut scc = SCC::new(2 * n);let ni = n as i32;for &(c1, c2) in cons.iter() {let x = if c1 > 0 { c1 - 1 + ni } else { -c1 - 1 } as usize;let y = if c2 > 0 { c2 - 1 } else { -c2 - 1 + ni } as usize;scc.add_edge(x, y);scc.add_edge((y + n) % (2 * n), (x + n) % (2 * n));}scc.scc();let mut result = vec![false; n];let top_ord = scc.top_order();for i in 0..n {if top_ord[i] == top_ord[i + n] {return None;}result[i] = top_ord[i] > top_ord[i + n];}Some(result)}