Submission #38877573
Source Code Expand
// -*- coding:utf-8-unix -*-
// rustup doc --std --toolchain 1.42.0
#![allow(unused_imports)]
#![allow(unused_macros)]
/*
use bitset_fixed::BitSet;
use itertools::*;
use num::integer::*;
use petgraph::algo::*;
use petgraph::graph::{DiGraph, Graph, NodeIndex, UnGraph};
use petgraph::unionfind::UnionFind;
use petgraph::visit::{
Bfs, Dfs, EdgeRef, IntoEdges, NodeCount, NodeIndexable, VisitMap, Visitable,
};
//use proconio::{input, marker::{Bytes, Chars, Isize1, Usize1}, source::{auto::AutoSource, line::LineSource, once::OnceSource}};
use rand::{
distributions::WeightedIndex,
prelude::{thread_rng, Distribution},
seq::SliceRandom,
Rng,
};
use regex::Regex;
use std::collections::*;
use superslice::Ext;
*/
use std::io::{stderr, stdin, stdout, BufRead, BufReader, BufWriter, Read, StdoutLock, Write};
pub fn solve() {
#[cfg(tcheck)]
let tins = std::time::Instant::now();
#[cfg(tcheck)]
let mut durs = Vec::with_capacity(16);
use fastproconio::*;
let stdin = std::io::stdin();
let mut source = ProconIBufIter::new(stdin.lock());
#[rustfmt::skip] macro_rules! fread {($t:tt)=>{{fread_value!(source, $t)}};}
macro_rules! finput {($($r:tt)*)=>{finput_inner!{source, $($r)*}};}
let out = std::io::stdout();
let mut outbuf = out.lock();
//let mut outbuf = std::io::BufWriter::new(out.lock());
let mut obuf = ProconWriteBuffer::with_capacity(1 << 10);
#[cfg(tcheck)]
durs.push((tins.elapsed(), String::from("initial")));
//let mut out = std::io::BufWriter::new(out.lock());
//let err = std::io::stderr();
//let mut err = std::io::BufWriter::new(err.lock());
finput! {
mut sx: i32, mut sy: i32,
tx: i32, ty: i32,
a: i32, b: i32, c: i32, d: i32,
}
#[cfg(tcheck)]
durs.push((tins.elapsed(), String::from("input")));
if ((sx ^ tx) & 1) != 0 || ((sy ^ ty) & 1) != 0 {
std::io::Write::write_all(&mut outbuf, b"No\n").ok();
return;
}
let possible_even = (a != b || sx == tx) && (c != d || sy == ty);
let possible_odd = (a != b || sx + tx == a + b) && (c != d || sy + ty == c + d);
if !possible_even && !possible_odd {
std::io::Write::write_all(&mut outbuf, b"No\n").ok();
return;
}
std::io::Write::write_all(&mut outbuf, b"Yes\n").ok();
if !possible_even {
let x = (((sx + tx) & -2) / 2).max(a).min(b);
let y = (((sy + ty) & -2) / 2).max(c).min(d);
obuf.uint(x as u32);
obuf.sp();
obuf.uint(y as u32);
obuf.lf();
sx = 2 * x - sx;
sy = 2 * y - sy;
obuf.write_all(&mut outbuf);
} else if possible_odd {
fn rep_ceil(sx: i32, sy: i32, tx: i32, ty: i32, a: i32, b: i32, c: i32, d: i32) -> i32 {
if sx == tx && sy == ty {
return 0;
}
let xdiff = (((sx - tx) & -2) / 2).abs();
let ydiff = (((sy - ty) & -2) / 2).abs();
let xstep = (b - a).min(xdiff);
let ystep = (d - c).min(ydiff);
let xrep = (xdiff + xstep.saturating_sub(1))
.checked_div(xstep)
.unwrap_or(i32::max_value());
let yrep = (ydiff + ystep.saturating_sub(1))
.checked_div(ystep)
.unwrap_or(i32::max_value());
xrep.min(yrep)
}
let x = (((sx + tx) & -2) / 2).max(a).min(b);
let y = (((sy + ty) & -2) / 2).max(c).min(d);
let tmp_sx = 2 * x - sx;
let tmp_sy = 2 * y - sy;
if rep_ceil(sx, sy, tx, ty, a, b, c, d) > rep_ceil(tmp_sx, tmp_sy, tx, ty, a, b, c, d) {
obuf.uint(x as u32);
obuf.sp();
obuf.uint(y as u32);
obuf.lf();
sx = tmp_sx;
sy = tmp_sy;
}
obuf.write_all(&mut outbuf);
}
while sx != tx || sy != ty {
let xdiff = (((sx - tx) & -2) / 2).abs();
let ydiff = (((sy - ty) & -2) / 2).abs();
let xstep = (b - a).min(xdiff);
let ystep = (d - c).min(ydiff);
let xrep = xdiff.checked_div(xstep).unwrap_or(i32::max_value());
let yrep = ydiff.checked_div(ystep).unwrap_or(i32::max_value());
let rep = xrep.min(yrep);
let x0 = if sx > tx { a + xstep } else { a };
let x1 = if sx < tx { a + xstep } else { a };
let y0 = if sy > ty { c + ystep } else { c };
let y1 = if sy < ty { c + ystep } else { c };
sx += 2 * (x1 - x0) * rep;
sy += 2 * (y1 - y0) * rep;
obuf.uint(x0 as u32);
obuf.sp();
obuf.uint(y0 as u32);
obuf.lf();
obuf.uint(x1 as u32);
obuf.sp();
obuf.uint(y1 as u32);
obuf.lf();
let mut rep = rep as u32;
let oslice = obuf.get_slice();
let reprep_threthold = 1024;
if rep >= reprep_threthold {
let repbuf = oslice.repeat(reprep_threthold as usize);
let repbufslice = repbuf.as_slice();
for _ in 0..(rep / reprep_threthold) {
std::io::Write::write_all(&mut outbuf, repbufslice).ok();
}
rep %= reprep_threthold;
}
if rep == 0 {
} else if rep == 1 {
std::io::Write::write_all(&mut outbuf, oslice).ok();
} else {
std::io::Write::write_all(&mut outbuf, oslice.repeat(rep as usize).as_slice()).ok();
}
obuf.clear();
}
//let _ = std::io::Write::flush(&mut out);
#[cfg(tcheck)]
durs.push((tins.elapsed(), String::from("output")));
#[cfg(tcheck)]
for (dur, s) in durs.iter() {
eprintln!("{:.6} {}", dur.as_secs_f64(), s);
}
//let _ = writeln!(&mut err, "{}", count);
//let _ = std::io::Write::flush(&mut err);
}
pub fn main() {
const USE_THREAD: bool = false;
if USE_THREAD {
// In order to avoid potential stack overflow, spawn a new thread.
let stack_size = 134_217_728; // 128 MB
let thd = std::thread::Builder::new().stack_size(stack_size);
thd.spawn(|| solve()).unwrap().join().unwrap();
} else {
solve()
}
}
/// chmax, chmin sugar syntax
trait Change {
fn chmax(&mut self, x: Self);
fn chmin(&mut self, x: Self);
}
impl<T: PartialOrd> Change for T {
fn chmax(&mut self, x: T) {
if *self < x {
*self = x;
}
}
fn chmin(&mut self, x: T) {
if *self > x {
*self = x;
}
}
}
pub mod fastproconio {
/// input macros based on tanakh's input macro / proconio-rs.
/// tanakh's input macro: <https://qiita.com/tanakh/items/0ba42c7ca36cd29d0ac8>
/// proconio-rs: <https://docs.rs/proconio/0.3.8/proconio/>
/// this macro recieve `Iterator<Item = u8>` input source, except for Bytes/Chars/String read
/// ProconIBufIter receive `std::io::BufRead` trait. (`std::io::StdinLock`, `std::io::BufReader`, `&[u8]`, etc.)
#[macro_export]
macro_rules! finput_inner {
($iter:expr) => {};
($iter:expr, ) => {};
($iter:expr, mut $var:ident : $t:tt $($r:tt)*) => {
let mut $var = fread_value!($iter, $t);
finput_inner!{$iter $($r)*}
};
($iter:expr, $var:ident : $t:tt $($r:tt)*) => {
let $var = fread_value!($iter, $t);
finput_inner!{$iter $($r)*}
};
}
#[macro_export]
macro_rules! fread_value {
($iter:expr, ( $($t:tt),* )) => { ( $(fread_value!($iter, $t)),* ) };
($iter:expr, [ $t:tt ; $len:expr ]) => { (0..$len).map(|_| fread_value!($iter, $t)).collect::<Vec<_>>() };
($iter:expr, u128) => { $iter.parse_uint::<u128>() };
($iter:expr, usize) => { $iter.parse_uint::<usize>() };
($iter:expr, usize1) => { $iter.parse_uint::<usize>() - 1 };
($iter:expr, u64) => { $iter.parse_uint::<u64>() };
($iter:expr, u64_1) => { $iter.parse_uint::<u64>() - 1 };
($iter:expr, u32) => { $iter.parse_uint::<u32>() };
($iter:expr, u32_1) => { $iter.parse_uint::<u32>() - 1 };
($iter:expr, u16) => { $iter.parse_uint::<u16>() };
($iter:expr, u8) => { $iter.parse_uint::<u8>() };
($iter:expr, i128) => { $iter.parse_iint::<i128>() };
($iter:expr, isize) => { $iter.parse_iint::<isize>() };
($iter:expr, i64) => { $iter.parse_iint::<i64>() };
($iter:expr, i32) => { $iter.parse_iint::<i32>() };
($iter:expr, i16) => { $iter.parse_iint::<i16>() };
($iter:expr, i8) => { $iter.parse_iint::<i16>() as i8 };
($iter:expr, byte) => { $iter.get_ascii_byte() };
($iter:expr, Bytes) => {{ let mut v = vec![];$iter.get_ascii_bytes(&mut v);v }};
($iter:expr, String) => {{ let mut v = vec![];$iter.get_ascii_bytes(&mut v);unsafe { std::string::String::from_utf8_unchecked(v) }}};
($iter:expr, LineBytes) => {{ let mut v = vec![];$iter.get_ascii_line_bytes(&mut v).and(Some(v)).unwrap() }};
($iter:expr, LineBytesTrim) => {{ let mut v = vec![];$iter.get_ascii_line_bytes_trim(&mut v);v }};
($iter:expr, LineString) => {{ let mut v = vec![];$iter.get_ascii_line_bytes(&mut v);unsafe { std::string::String::from_utf8_unchecked(v) }}};
($iter:expr, LineStringTrim) => {{ let mut v = vec![];$iter.get_ascii_line_bytes_trim(&mut v);unsafe { std::string::String::from_utf8_unchecked(v) }}};
($iter:expr, Utf8Bytes) => {{ let mut v = vec![];$iter.get_utf8_bytes(&mut v);v }};
($iter:expr, Utf8String) => {{ let mut v = vec![];$iter.get_utf8_bytes(&mut v);unsafe { std::string::String::from_utf8_unchecked(v) }}};
($iter:expr, Utf8LineBytes) => {{ let mut v = vec![];$iter.get_utf8_line_bytes(&mut v);v }};
($iter:expr, Utf8LineBytesTrim) => {{ let mut v = vec![];$iter.get_utf8_line_bytes_trim(&mut v);v }};
($iter:expr, Utf8LineString) => {{ let mut v = vec![];$iter.get_utf8_line_bytes(&mut v);unsafe { std::string::String::from_utf8_unchecked(v) }}};
($iter:expr, Utf8LineStringTrim) => {{ let mut v = vec![];$iter.get_utf8_line_bytes_trim(&mut v);unsafe { std::string::String::from_utf8_unchecked(v) }}};
($iter:expr, $t:ty) => {{ let mut v = vec![];$iter.get_utf8_bytes(&mut v);unsafe { std::string::String::from_utf8_unchecked(v.as_slice()) }.parse::<$t>().expect("Parse error") }};
}
unsafe fn ptr_offset_u8(dist: *const u8, origin: *const u8) -> usize {
// Rust 1.47.0 or later, `dist.offset_from(origin) as usize`
// <https://doc.rust-lang.org/std/primitive.pointer.html#method.offset_from>
dist as usize - origin as usize
}
/// Interaction with `std::io::BufRead` Trait, Implementation of `Iterator<Item = u8>`
pub struct ProconIBufIter<R: std::io::BufRead> {
inner: R,
raw: *const u8,
ptr: *const u8,
end: *const u8,
len: usize,
}
impl<R: std::io::BufRead> ProconIBufIter<R> {
pub fn new(inner: R) -> Self {
Self {
inner,
raw: std::ptr::null(),
ptr: std::ptr::null(),
end: std::ptr::null(),
len: 0,
}
}
}
impl<R: std::io::BufRead> ProconIBufIter<R> {
pub fn buf_empty(&self) -> bool {
self.ptr == self.end
}
#[allow(clippy::missing_safety_doc)]
#[cold]
unsafe fn inner_read(&mut self) -> bool {
debug_assert_eq!(self.ptr, self.end);
self.inner.consume(ptr_offset_u8(self.ptr, self.raw));
if let Ok(s) = self.inner.fill_buf() {
self.raw = s.as_ptr();
self.ptr = s.as_ptr();
self.end = s.as_ptr().add(s.len());
self.len = s.len();
self.len != 0
} else {
self.raw = self.ptr;
self.len = self.end as usize - self.ptr as usize;
false
}
}
#[allow(clippy::missing_safety_doc)]
unsafe fn next_unchecked(&mut self) -> u8 {
let p = self.ptr;
self.ptr = p.add(1);
*p
}
/// skip unmatch bytes
pub fn skipuntil_bytes_fn<F: FnMut(u8) -> bool>(&mut self, f: &mut F) -> bool {
loop {
let mut ptr = self.ptr;
while ptr != self.end {
if f(unsafe { *ptr }) {
self.ptr = ptr;
return true;
}
unsafe {
ptr = ptr.add(1);
}
}
self.ptr = ptr;
if unsafe { !self.inner_read() } {
return false;
}
}
}
}
impl<R: std::io::BufRead> Iterator for ProconIBufIter<R> {
type Item = u8;
fn next(&mut self) -> Option<Self::Item> {
if !self.buf_empty() || unsafe { self.inner_read() } {
Some(unsafe { self.next_unchecked() })
} else {
None
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
(usize::max_value(), None)
}
}
pub trait UPrimInt:
Copy
+ Default
+ std::ops::Add<Output = Self>
+ std::ops::Sub<Output = Self>
+ std::ops::Mul<Output = Self>
+ std::convert::From<u8>
{
const BITS: u32;
}
macro_rules! impl_uprimint {
($t:ty) => {
impl UPrimInt for $t {
const BITS: u32 = (0 as $t).count_zeros();
}
};
}
impl_uprimint!(u8);
impl_uprimint!(u16);
impl_uprimint!(u32);
impl_uprimint!(u64);
impl_uprimint!(u128);
impl_uprimint!(usize);
pub trait IPrimInt:
Copy
+ Default
+ std::ops::Add<Output = Self>
+ std::ops::Sub<Output = Self>
+ std::ops::Neg<Output = Self>
+ std::ops::Mul<Output = Self>
+ std::convert::From<i8>
{
const BITS: u32;
}
macro_rules! impl_iprimint {
($t:ty) => {
impl IPrimInt for $t {
const BITS: u32 = (0 as $t).count_zeros();
}
};
}
impl_iprimint!(i8);
impl_iprimint!(i16);
impl_iprimint!(i32);
impl_iprimint!(i64);
impl_iprimint!(i128);
impl_iprimint!(isize);
/// speed frenzy input parser for program compete
pub trait ProconParse {
fn get_ascii_byte(&mut self) -> u8 {
self.get_ascii_byte_opt().unwrap()
}
fn get_ascii_byte_or_default(&mut self) -> u8 {
self.get_ascii_byte_opt().unwrap_or_default()
}
fn get_ascii_byte_opt(&mut self) -> Option<u8>;
fn parse_uint<U: UPrimInt>(&mut self) -> U {
self.parse_uint_opt().unwrap()
}
fn parse_uint_or_default<U: UPrimInt>(&mut self) -> U {
self.parse_uint_opt().unwrap_or_default()
}
fn parse_uint_opt<U: UPrimInt>(&mut self) -> Option<U>;
fn parse_iint<I: IPrimInt>(&mut self) -> I {
self.parse_iint_opt().unwrap()
}
fn parse_iint_or_default<I: IPrimInt>(&mut self) -> I {
self.parse_iint_opt().unwrap_or_default()
}
fn parse_iint_opt<I: IPrimInt>(&mut self) -> Option<I>;
}
/// speed frenzy input byte reader for program compete
pub trait ProconBytes {
/// get bytes
fn get_bytes_fn<F: Fn(u8) -> bool>(&mut self, vec: &mut Vec<u8>, f: &mut F);
/// get bytes (printable ascii word)
fn get_ascii_bytes(&mut self, vec: &mut Vec<u8>);
/// get line bytes (sp+printable ascii)
fn get_ascii_line_bytes(&mut self, vec: &mut Vec<u8>);
/// get line bytes (trimed sp+printable ascii)
fn get_ascii_line_bytes_trim(&mut self, vec: &mut Vec<u8>);
/// get bytes (printable utf8 word)
fn get_utf8_bytes(&mut self, vec: &mut Vec<u8>);
/// get line bytes (sp+printable utf8)
fn get_utf8_line_bytes(&mut self, vec: &mut Vec<u8>);
/// get line bytes (trimed sp+printable utf8)
fn get_utf8_line_bytes_trim(&mut self, vec: &mut Vec<u8>);
}
impl<T: Iterator<Item = u8>> ProconParse for T {
fn get_ascii_byte_opt(&mut self) -> Option<u8> {
loop {
match self.next() {
Some(c @ 0x21..=0x7e) => {
return Some(c);
}
Some(_) => continue,
_ => return None,
}
}
}
fn parse_uint_opt<U: UPrimInt>(&mut self) -> Option<U> {
loop {
match self.next() {
Some(c @ b'0'..=b'9') => {
let mut v = U::from(c - b'0');
while let Some(c @ b'0'..=b'9') = self.next() {
v = v * U::from(10) + U::from(c - b'0');
}
return Some(v);
}
Some(_) => continue,
_ => return None,
}
}
}
fn parse_iint_opt<I: IPrimInt>(&mut self) -> Option<I> {
loop {
match self.next() {
Some(c @ b'0'..=b'9') => {
let mut v = I::from((c - b'0') as i8);
while let Some(c @ b'0'..=b'9') = self.next() {
v = v * I::from(10) + I::from((c - b'0') as i8);
}
return Some(v);
}
Some(b'-') => match self.next() {
Some(c @ b'0'..=b'9') => {
let mut v = I::from(-((c - b'0') as i8));
while let Some(c @ b'0'..=b'9') = self.next() {
v = v * I::from(10) - I::from((c - b'0') as i8);
}
return Some(v);
}
_ => return None,
},
Some(_) => continue,
_ => return None,
}
}
}
}
impl<R: std::io::BufRead> Drop for ProconIBufIter<R> {
/// Saving the pointer on interruption
fn drop(&mut self) {
self.inner
.consume(unsafe { ptr_offset_u8(self.ptr, self.raw) });
}
}
impl<R: std::io::BufRead> ProconBytes for ProconIBufIter<R> {
/// get bytes vector
fn get_bytes_fn<F: Fn(u8) -> bool>(&mut self, vec: &mut Vec<u8>, f: &mut F) {
if !self.skipuntil_bytes_fn(f) {
return;
}
let begin_ptr = self.ptr;
let mut ptr = self.ptr;
loop {
unsafe {
ptr = ptr.add(1);
}
if ptr == self.end {
self.ptr = ptr;
vec.extend_from_slice(unsafe {
std::slice::from_raw_parts(begin_ptr, ptr_offset_u8(ptr, begin_ptr))
});
break;
}
if !f(unsafe { *ptr }) {
self.ptr = ptr;
vec.extend_from_slice(unsafe {
std::slice::from_raw_parts(begin_ptr, ptr_offset_u8(ptr, begin_ptr))
});
return;
}
}
if unsafe { !self.inner_read() } {
return;
}
ptr = self.ptr;
loop {
if !f(unsafe { *ptr }) {
self.ptr = ptr;
vec.extend_from_slice(unsafe {
std::slice::from_raw_parts(self.raw, ptr_offset_u8(ptr, self.raw))
});
return;
}
unsafe {
ptr = ptr.add(1);
}
if ptr == self.end {
self.ptr = ptr;
vec.extend_from_slice(unsafe {
std::slice::from_raw_parts(self.raw, self.len)
});
if unsafe { !self.inner_read() } {
return;
}
ptr = self.ptr;
}
}
}
fn get_ascii_bytes(&mut self, vec: &mut Vec<u8>) {
self.get_bytes_fn(vec, &mut |c| c.is_ascii_graphic())
}
fn get_ascii_line_bytes(&mut self, vec: &mut Vec<u8>) {
self.get_bytes_fn(vec, &mut |c| (b' '..=b'~').contains(&c))
}
fn get_ascii_line_bytes_trim(&mut self, vec: &mut Vec<u8>) {
self.skipuntil_bytes_fn(&mut |c| c.is_ascii_graphic());
self.get_bytes_fn(vec, &mut |c| (b' '..=b'~').contains(&c));
while vec.last() == Some(&b' ') {
vec.pop();
}
}
fn get_utf8_bytes(&mut self, vec: &mut Vec<u8>) {
self.get_bytes_fn(vec, &mut |c| (b'!'..=0xf4).contains(&c))
}
fn get_utf8_line_bytes(&mut self, vec: &mut Vec<u8>) {
self.get_bytes_fn(vec, &mut |c| (b' '..=0xf4).contains(&c))
}
fn get_utf8_line_bytes_trim(&mut self, vec: &mut Vec<u8>) {
self.skipuntil_bytes_fn(&mut |c| (b'!'..=0xf4).contains(&c));
self.get_bytes_fn(vec, &mut |c| (b' '..=0xf4).contains(&c));
while vec.last() == Some(&b' ') {
vec.pop();
}
}
}
/// Insufficient write buffer size causes undefined operation.
pub struct ProconWriteBuffer(*mut u8, Vec<u8>);
impl ProconWriteBuffer {
pub fn with_capacity(capacity: usize) -> Self {
let mut b = Vec::<u8>::with_capacity(capacity);
let ptr = b.as_mut_ptr();
Self(ptr, b)
}
pub fn get_mut_ptr(&self) -> *mut u8 {
self.0
}
pub fn set_mut_ptr(&mut self, p: *mut u8) {
self.0 = p;
}
fn decision(&mut self) {
let bptr = self.1.as_mut_ptr();
unsafe { self.1.set_len((self.0 as usize) - (bptr as usize)) };
}
pub fn clear(&mut self) {
self.1.clear();
self.0 = self.1.as_mut_ptr();
}
pub fn get_slice(&mut self) -> &[u8] {
self.decision();
self.1.as_slice()
}
pub fn reserve(&mut self, additional: usize) {
self.decision();
self.1.reserve(additional);
self.0 = self.1.as_mut_ptr();
}
pub fn reserve_exact(&mut self, additional: usize) {
self.decision();
self.1.reserve_exact(additional);
self.0 = self.1.as_mut_ptr();
}
pub fn uint<U>(&mut self, d: U)
where
U: Copy
+ std::cmp::Ord
+ std::ops::Div<Output = U>
+ std::ops::Rem<Output = U>
+ std::convert::From<u8>
+ std::convert::Into<u128>,
{
proconwritebuf_uint(&mut self.0, d);
}
pub fn uint_sp<U>(&mut self, s: &[U])
where
U: Copy
+ std::cmp::Ord
+ std::ops::Div<Output = U>
+ std::ops::Rem<Output = U>
+ std::convert::From<u8>
+ std::convert::Into<u128>,
{
let mut p = self.0;
let mut it = s.iter();
if let Some(&d) = it.next() {
proconwritebuf_uint(&mut p, d);
for &d in it {
proconwritebuf_sp(&mut p);
proconwritebuf_uint(&mut p, d);
}
}
self.0 = p;
}
pub fn uint_splf<U>(&mut self, s: &[U])
where
U: Copy
+ std::cmp::Ord
+ std::ops::Div<Output = U>
+ std::ops::Rem<Output = U>
+ std::convert::From<u8>
+ std::convert::Into<u128>,
{
let mut p = self.0;
let mut it = s.iter();
if let Some(&d) = it.next() {
proconwritebuf_uint(&mut p, d);
for &d in it {
proconwritebuf_sp(&mut p);
proconwritebuf_uint(&mut p, d);
}
}
proconwritebuf_lf(&mut p);
self.0 = p;
}
pub fn usize(&mut self, d: usize) {
proconwritebuf_uint(&mut self.0, d as u64);
}
pub fn usize_sp(&mut self, s: &[usize]) {
let mut p = self.0;
let mut it = s.iter();
if let Some(&d) = it.next() {
proconwritebuf_uint(&mut p, d as u64);
for &d in it {
proconwritebuf_sp(&mut p);
proconwritebuf_uint(&mut p, d as u64);
}
}
self.0 = p;
}
pub fn usize_splf(&mut self, s: &[usize]) {
let mut p = self.0;
let mut it = s.iter();
if let Some(&d) = it.next() {
proconwritebuf_uint(&mut p, d as u64);
for &d in it {
proconwritebuf_sp(&mut p);
proconwritebuf_uint(&mut p, d as u64);
}
}
proconwritebuf_lf(&mut p);
self.0 = p;
}
pub fn iint<I>(&mut self, d: I)
where
I: Copy
+ std::cmp::Ord
+ std::ops::Neg<Output = I>
+ std::ops::Div<Output = I>
+ std::ops::Rem<Output = I>
+ std::convert::From<i8>
+ std::convert::Into<i128>,
{
proconwritebuf_iint(&mut self.0, d);
}
pub fn iint_sp<I>(&mut self, s: &[I])
where
I: Copy
+ std::cmp::Ord
+ std::ops::Neg<Output = I>
+ std::ops::Div<Output = I>
+ std::ops::Rem<Output = I>
+ std::convert::From<i8>
+ std::convert::Into<i128>,
{
let mut p = self.0;
let mut it = s.iter();
if let Some(&d) = it.next() {
proconwritebuf_iint(&mut p, d);
for &d in it {
proconwritebuf_sp(&mut p);
proconwritebuf_iint(&mut p, d);
}
}
self.0 = p;
}
pub fn iint_splf<I>(&mut self, s: &[I])
where
I: Copy
+ std::cmp::Ord
+ std::ops::Neg<Output = I>
+ std::ops::Div<Output = I>
+ std::ops::Rem<Output = I>
+ std::convert::From<i8>
+ std::convert::Into<i128>
+ std::convert::TryInto<u8>,
{
let mut p = self.0;
let mut it = s.iter();
if let Some(&d) = it.next() {
proconwritebuf_iint(&mut p, d);
for &d in it {
proconwritebuf_sp(&mut p);
proconwritebuf_iint(&mut p, d);
}
}
proconwritebuf_lf(&mut p);
self.0 = p;
}
pub fn sp(&mut self) {
proconwritebuf_sp(&mut self.0);
}
pub fn lf(&mut self) {
proconwritebuf_lf(&mut self.0);
}
pub fn bytes(&mut self, s: &[u8]) {
proconwritebuf_bytes(&mut self.0, s);
}
pub fn str(&mut self, s: &str) {
proconwritebuf_str(&mut self.0, s);
}
pub fn string(&mut self, s: &String) {
proconwritebuf_string(&mut self.0, s);
}
pub fn write_all<W>(&mut self, out: &mut W)
where
W: std::io::Write,
{
self.decision();
let _ = out.write_all(self.1.as_slice());
self.1.clear();
self.0 = self.1.as_mut_ptr();
}
}
pub fn proconwritebuf_uint<U>(p: &mut *mut u8, mut d: U)
where
U: Copy
+ std::cmp::Ord
+ std::ops::Div<Output = U>
+ std::ops::Rem<Output = U>
+ std::convert::From<u8>
+ std::convert::Into<u128>,
{
unsafe {
let bptr = *p;
let mut cptr = bptr;
if d != U::from(0) {
while d != U::from(0) {
let (q, r) = (d / U::from(10), d % U::from(10));
d = q;
*cptr = b'0' + U::into(r) as u8;
cptr = cptr.add(1);
}
*p = cptr;
let mut lptr = bptr;
let mut rptr = cptr.sub(1);
while (lptr as usize) < (rptr as usize) {
let (dr, dl) = (*lptr, *rptr);
*lptr = dl;
*rptr = dr;
lptr = lptr.add(1);
rptr = rptr.sub(1);
}
} else {
*cptr = b'0';
*p = cptr.add(1);
}
};
}
pub fn proconwritebuf_iint<I>(p: &mut *mut u8, mut d: I)
where
I: Copy
+ std::cmp::Ord
+ std::ops::Neg<Output = I>
+ std::ops::Div<Output = I>
+ std::ops::Rem<Output = I>
+ std::convert::From<i8>
+ std::convert::Into<i128>,
{
unsafe {
let bptr = *p;
let mut cptr = bptr;
if d > I::from(0) {
while d != I::from(0) {
let (q, r) = (d / I::from(10), d % I::from(10));
d = q;
*cptr = b'0' + I::into(r) as u8;
cptr = cptr.add(1);
}
*p = cptr;
let mut lptr = bptr;
let mut rptr = cptr.sub(1);
while (lptr as usize) < (rptr as usize) {
let (dr, dl) = (*lptr, *rptr);
*lptr = dl;
*rptr = dr;
lptr = lptr.add(1);
rptr = rptr.sub(1);
}
} else if d < I::from(0) {
*cptr = b'-';
cptr = cptr.add(1);
let mptr = cptr;
{
let (q, r) = (-(d / I::from(10)), -(d % I::from(10)));
d = q;
*cptr = b'0' + I::into(r) as u8;
cptr = cptr.add(1);
}
while d != I::from(0) {
let (q, r) = (d / I::from(10), d % I::from(10));
d = q;
*cptr = b'0' + I::into(r) as u8;
cptr = cptr.add(1);
}
*p = cptr;
let mut lptr = mptr;
let mut rptr = cptr.sub(1);
while (lptr as usize) < (rptr as usize) {
let (dr, dl) = (*lptr, *rptr);
*lptr = dl;
*rptr = dr;
lptr = lptr.add(1);
rptr = rptr.sub(1);
}
} else {
*cptr = b'0';
*p = cptr.add(1);
}
};
}
pub fn proconwritebuf_sp(p: &mut *mut u8) {
*p = unsafe {
**p = b' ';
(*p).add(1)
}
}
pub fn proconwritebuf_lf(p: &mut *mut u8) {
*p = unsafe {
**p = b'\n';
(*p).add(1)
}
}
pub fn proconwritebuf_bytes(p: &mut *mut u8, bytes: &[u8]) {
*p = unsafe {
let len = bytes.len();
std::ptr::copy_nonoverlapping(bytes.as_ptr(), *p, len);
(*p).add(len)
};
}
pub fn proconwritebuf_str(p: &mut *mut u8, s: &str) {
*p = unsafe {
let len = s.len();
std::ptr::copy_nonoverlapping(s.as_ptr(), *p, len);
(*p).add(len)
};
}
pub fn proconwritebuf_string(p: &mut *mut u8, s: &String) {
*p = unsafe {
let len = s.len();
std::ptr::copy_nonoverlapping(s.as_ptr(), *p, len);
(*p).add(len)
};
}
}
Submission Info
Submission Time |
|
Task |
F - Teleporter Takahashi |
User |
mizarjp |
Language |
Rust (1.42.0) |
Score |
500 |
Code Size |
32426 Byte |
Status |
AC |
Exec Time |
15 ms |
Memory |
6032 KiB |
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
500 / 500 |
Status |
|
|
Set Name |
Test Cases |
Sample |
00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt |
All |
00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 01_random_10.txt, 01_random_11.txt, 01_random_12.txt, 01_random_13.txt, 01_random_14.txt, 01_random_15.txt, 01_random_16.txt, 01_random_17.txt, 01_random_18.txt, 01_random_19.txt, 01_random_20.txt, 01_random_21.txt, 01_random_22.txt, 01_random_23.txt, 01_random_24.txt, 01_random_25.txt, 01_random_26.txt, 01_random_27.txt, 01_random_28.txt, 01_random_29.txt, 01_random_30.txt, 01_random_31.txt, 01_random_32.txt, 01_random_33.txt, 01_random_34.txt, 01_random_35.txt, 01_random_36.txt, 01_random_37.txt, 01_random_38.txt, 01_random_39.txt, 02_handmade_40.txt, 02_handmade_41.txt, 02_handmade_42.txt |
Case Name |
Status |
Exec Time |
Memory |
00_sample_00.txt |
AC |
6 ms |
2084 KiB |
00_sample_01.txt |
AC |
2 ms |
1972 KiB |
00_sample_02.txt |
AC |
1 ms |
2112 KiB |
00_sample_03.txt |
AC |
1 ms |
2088 KiB |
01_random_04.txt |
AC |
2 ms |
1984 KiB |
01_random_05.txt |
AC |
1 ms |
2084 KiB |
01_random_06.txt |
AC |
1 ms |
2056 KiB |
01_random_07.txt |
AC |
1 ms |
1908 KiB |
01_random_08.txt |
AC |
1 ms |
1996 KiB |
01_random_09.txt |
AC |
3 ms |
2008 KiB |
01_random_10.txt |
AC |
2 ms |
2004 KiB |
01_random_11.txt |
AC |
2 ms |
1996 KiB |
01_random_12.txt |
AC |
2 ms |
1988 KiB |
01_random_13.txt |
AC |
1 ms |
1904 KiB |
01_random_14.txt |
AC |
1 ms |
2004 KiB |
01_random_15.txt |
AC |
1 ms |
1900 KiB |
01_random_16.txt |
AC |
2 ms |
2140 KiB |
01_random_17.txt |
AC |
1 ms |
2148 KiB |
01_random_18.txt |
AC |
1 ms |
2036 KiB |
01_random_19.txt |
AC |
1 ms |
1980 KiB |
01_random_20.txt |
AC |
1 ms |
2044 KiB |
01_random_21.txt |
AC |
4 ms |
2084 KiB |
01_random_22.txt |
AC |
2 ms |
2052 KiB |
01_random_23.txt |
AC |
1 ms |
2056 KiB |
01_random_24.txt |
AC |
2 ms |
2028 KiB |
01_random_25.txt |
AC |
1 ms |
2140 KiB |
01_random_26.txt |
AC |
4 ms |
2008 KiB |
01_random_27.txt |
AC |
1 ms |
2000 KiB |
01_random_28.txt |
AC |
1 ms |
2116 KiB |
01_random_29.txt |
AC |
1 ms |
2024 KiB |
01_random_30.txt |
AC |
1 ms |
2088 KiB |
01_random_31.txt |
AC |
1 ms |
2004 KiB |
01_random_32.txt |
AC |
2 ms |
2032 KiB |
01_random_33.txt |
AC |
2 ms |
2160 KiB |
01_random_34.txt |
AC |
1 ms |
2016 KiB |
01_random_35.txt |
AC |
1 ms |
2068 KiB |
01_random_36.txt |
AC |
2 ms |
2052 KiB |
01_random_37.txt |
AC |
1 ms |
2012 KiB |
01_random_38.txt |
AC |
2 ms |
2052 KiB |
01_random_39.txt |
AC |
1 ms |
2148 KiB |
02_handmade_40.txt |
AC |
2 ms |
2056 KiB |
02_handmade_41.txt |
AC |
13 ms |
6008 KiB |
02_handmade_42.txt |
AC |
15 ms |
6032 KiB |