complete 1024.rs 1063.rs 1108.rs 1111.rs 3086.rs 7695.rs 17256.rs 17371.rs 27634.rs 31846.rs
This commit is contained in:
67
storage/zeta/rs/completed/1024.rs
Normal file
67
storage/zeta/rs/completed/1024.rs
Normal file
@@ -0,0 +1,67 @@
|
||||
use std::io::stdin;
|
||||
|
||||
fn can_lowerbound_accept(n: usize, l: usize) -> bool {
|
||||
if l % 2 == 0 {
|
||||
let d = n / l;
|
||||
if d >= l / 2 { true } else { false }
|
||||
} else {
|
||||
let d = n / l;
|
||||
if d >= l / 2 { true } else { false }
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut line = String::new();
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
let mut iter = line
|
||||
.trim_ascii_end()
|
||||
.split(' ')
|
||||
.map(|x| x.parse::<usize>().unwrap());
|
||||
|
||||
let n = iter.next().unwrap();
|
||||
let l = iter.next().unwrap();
|
||||
|
||||
let mut candidate = vec![];
|
||||
|
||||
for i in l..=100 {
|
||||
if 2 * n % i == 0 {
|
||||
let d = 2 * n / i;
|
||||
if d % 2 != 0 { // even
|
||||
if i % 2 != 0 {
|
||||
continue;
|
||||
} else {
|
||||
let mid = d / 2;
|
||||
if mid < i / 2 - 1 {
|
||||
break;
|
||||
}
|
||||
let lo = mid + 1 - i / 2;
|
||||
for j in lo..lo + i {
|
||||
candidate.push(j);
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else { // odd
|
||||
if i % 2 == 0 {
|
||||
continue;
|
||||
} else {
|
||||
let mid = d / 2;
|
||||
if mid < i / 2 {
|
||||
break;
|
||||
}
|
||||
let lo = mid - i / 2;
|
||||
for j in lo..lo + i {
|
||||
candidate.push(j);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if candidate.len() == 0 {
|
||||
println!("-1");
|
||||
} else {
|
||||
for i in candidate {
|
||||
print!("{} ", i);
|
||||
}
|
||||
}
|
||||
}
|
||||
100
storage/zeta/rs/completed/1063.rs
Normal file
100
storage/zeta/rs/completed/1063.rs
Normal file
@@ -0,0 +1,100 @@
|
||||
use std::io::{read_to_string, stdin};
|
||||
|
||||
enum Movement {
|
||||
R,
|
||||
L,
|
||||
B,
|
||||
T,
|
||||
RT,
|
||||
LT,
|
||||
RB,
|
||||
LB,
|
||||
}
|
||||
|
||||
impl Movement {
|
||||
fn from_str(s: &str) -> Self {
|
||||
match s {
|
||||
"R" => Self::R,
|
||||
"L" => Self::L,
|
||||
"B" => Self::B,
|
||||
"T" => Self::T,
|
||||
"RT" => Self::RT,
|
||||
"LT" => Self::LT,
|
||||
"RB" => Self::RB,
|
||||
"LB" => Self::LB,
|
||||
_ => panic!("Invalid movement"),
|
||||
}
|
||||
}
|
||||
|
||||
fn to_delta(&self) -> (i8, i8) {
|
||||
match self {
|
||||
Self::R => (1, 0),
|
||||
Self::L => (-1, 0),
|
||||
Self::B => (0, -1),
|
||||
Self::T => (0, 1),
|
||||
Self::RT => (1, 1),
|
||||
Self::LT => (-1, 1),
|
||||
Self::RB => (1, -1),
|
||||
Self::LB => (-1, -1),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn to_pos(s: &str) -> (u8, u8) {
|
||||
(s.as_bytes()[0] - b'A', s.as_bytes()[1] - b'1')
|
||||
}
|
||||
|
||||
fn to_code(pos: (u8, u8)) -> String {
|
||||
let col = (pos.0 + b'A') as char;
|
||||
let row = (pos.1 + b'1') as char;
|
||||
format!("{}{}", col, row)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let temp = read_to_string(stdin()).unwrap();
|
||||
let mut iter = temp.split_ascii_whitespace();
|
||||
|
||||
let str_king = iter.next().unwrap();
|
||||
let mut pos_king = to_pos(str_king);
|
||||
|
||||
let str_stone = iter.next().unwrap();
|
||||
let mut pos_stone = to_pos(str_stone);
|
||||
|
||||
let n = iter.next().unwrap().parse::<usize>().unwrap();
|
||||
|
||||
let movements = iter
|
||||
.take(n)
|
||||
.map(Movement::from_str)
|
||||
.collect::<Vec<Movement>>();
|
||||
|
||||
for mv in movements {
|
||||
let (dx, dy) = mv.to_delta();
|
||||
let new_pos_king = (pos_king.0 as i8 + dx, pos_king.1 as i8 + dy);
|
||||
if new_pos_king.0 < 0 || new_pos_king.0 >= 8 || new_pos_king.1 < 0 || new_pos_king.1 >= 8 {
|
||||
continue;
|
||||
}
|
||||
|
||||
let new_pos_king = (new_pos_king.0 as u8, new_pos_king.1 as u8);
|
||||
|
||||
if new_pos_king == pos_stone {
|
||||
let new_pos_stone = (pos_stone.0 as i8 + dx, pos_stone.1 as i8 + dy);
|
||||
|
||||
if new_pos_stone.0 < 0
|
||||
|| new_pos_stone.0 >= 8
|
||||
|| new_pos_stone.1 < 0
|
||||
|| new_pos_stone.1 >= 8
|
||||
{
|
||||
continue;
|
||||
}
|
||||
let new_pos_stone = (new_pos_stone.0 as u8, new_pos_stone.1 as u8);
|
||||
|
||||
pos_stone = new_pos_stone;
|
||||
pos_king = new_pos_king;
|
||||
} else {
|
||||
pos_king = new_pos_king;
|
||||
}
|
||||
}
|
||||
|
||||
println!("{}", to_code(pos_king));
|
||||
println!("{}", to_code(pos_stone));
|
||||
}
|
||||
105
storage/zeta/rs/completed/1108.rs
Normal file
105
storage/zeta/rs/completed/1108.rs
Normal file
@@ -0,0 +1,105 @@
|
||||
use std::{collections::HashMap, io::stdin};
|
||||
|
||||
fn score(graph: &Vec<Vec<usize>>, guess: usize) -> usize {
|
||||
let n = graph.len();
|
||||
|
||||
let mut reach = vec![vec![false; n]; n];
|
||||
for i in 0..n {
|
||||
for j in 0..n {
|
||||
if graph[i][j] == 1 {
|
||||
reach[i][j] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for k in 0..n {
|
||||
for i in 0..n {
|
||||
for j in 0..n {
|
||||
if reach[i][k] && reach[k][j] {
|
||||
reach[i][j] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let mut memo = vec![usize::MAX; n];
|
||||
|
||||
fn get_score(
|
||||
curr: usize,
|
||||
n: usize,
|
||||
graph: &Vec<Vec<usize>>,
|
||||
reachable: &Vec<Vec<bool>>,
|
||||
memo: &mut Vec<usize>,
|
||||
) -> usize {
|
||||
if memo[curr] != usize::MAX {
|
||||
return memo[curr];
|
||||
}
|
||||
|
||||
let mut total = 1;
|
||||
|
||||
for next in 0..n {
|
||||
if graph[curr][next] == 1 && !reachable[next][curr] {
|
||||
total += get_score(next, n, graph, reachable, memo);
|
||||
}
|
||||
}
|
||||
|
||||
memo[curr] = total;
|
||||
total
|
||||
}
|
||||
|
||||
get_score(guess, n, graph, &reach, &mut memo)
|
||||
}
|
||||
fn main() {
|
||||
let mut line = String::new();
|
||||
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
|
||||
let n = line.trim().parse::<usize>().unwrap();
|
||||
|
||||
let mut name_map = HashMap::new();
|
||||
|
||||
let mut idx: usize = 0;
|
||||
let edges_info = (0..n)
|
||||
.map(|_| {
|
||||
line.clear();
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
let mut iter = line.trim().split(' ');
|
||||
|
||||
let start = iter.next().unwrap().trim().to_string();
|
||||
if !name_map.contains_key(&start) {
|
||||
name_map.insert(start.clone(), idx);
|
||||
idx += 1;
|
||||
}
|
||||
let cnt = iter.next().unwrap().parse::<usize>().unwrap();
|
||||
let dests = (0..cnt)
|
||||
.map(|_| {
|
||||
let t = iter.next().unwrap().trim().to_string();
|
||||
if !name_map.contains_key(&t) {
|
||||
name_map.insert(t.clone(), idx);
|
||||
idx += 1;
|
||||
}
|
||||
t
|
||||
})
|
||||
.collect::<Vec<String>>();
|
||||
|
||||
(start, dests)
|
||||
})
|
||||
.collect::<Vec<(String, Vec<String>)>>();
|
||||
|
||||
let mut graph = vec![vec![0; idx]; idx];
|
||||
|
||||
for (start, dests) in edges_info {
|
||||
let start_idx = name_map[&start];
|
||||
for dest in dests {
|
||||
let dest_idx = name_map[&dest];
|
||||
graph[start_idx][dest_idx] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
line.clear();
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
let guess = line.trim().to_string();
|
||||
let guess_idx = name_map[&guess];
|
||||
|
||||
println!("{}", score(&graph, guess_idx));
|
||||
}
|
||||
73
storage/zeta/rs/completed/1111.rs
Normal file
73
storage/zeta/rs/completed/1111.rs
Normal file
@@ -0,0 +1,73 @@
|
||||
use std::io::stdin;
|
||||
|
||||
fn main() {
|
||||
let mut line = String::new();
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
let n = line.trim().parse::<usize>().unwrap();
|
||||
|
||||
line.clear();
|
||||
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
let arr = line
|
||||
.trim()
|
||||
.split(' ')
|
||||
.map(|x| x.parse::<i32>().unwrap())
|
||||
.collect::<Vec<i32>>();
|
||||
|
||||
if n <= 1 {
|
||||
println!("A");
|
||||
} else if n == 2 {
|
||||
if arr[0] == arr[1] {
|
||||
println!("{}", arr[0]);
|
||||
} else {
|
||||
println!("A");
|
||||
}
|
||||
} else {
|
||||
if arr[0] == arr[1] {
|
||||
let same_flag = arr.iter().all(|&x| x == arr[0]);
|
||||
|
||||
if same_flag {
|
||||
println!("{}", arr[0]);
|
||||
} else {
|
||||
println!("B");
|
||||
}
|
||||
} else {
|
||||
if arr[1] == arr[2] {
|
||||
for i in 2..n - 1 {
|
||||
if arr[i + 1] == arr[i] {
|
||||
continue;
|
||||
} else {
|
||||
println!("B");
|
||||
return;
|
||||
}
|
||||
}
|
||||
println!("{}", arr[n - 1]);
|
||||
} else {
|
||||
let d_a = arr[2] - arr[1];
|
||||
let d_b = arr[1] - arr[0];
|
||||
|
||||
if d_a % d_b == 0 {
|
||||
let a = d_a / d_b;
|
||||
let b = arr[1] - a * arr[0];
|
||||
let mut flag = true;
|
||||
for i in 1..n - 1 {
|
||||
if arr[i + 1] == arr[i] * a + b {
|
||||
continue;
|
||||
} else {
|
||||
flag = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if flag {
|
||||
println!("{}", arr[n - 1] * a + b);
|
||||
} else {
|
||||
println!("B");
|
||||
}
|
||||
} else {
|
||||
println!("B");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
25
storage/zeta/rs/completed/17256.rs
Normal file
25
storage/zeta/rs/completed/17256.rs
Normal file
@@ -0,0 +1,25 @@
|
||||
use std::io::stdin;
|
||||
|
||||
fn main() {
|
||||
let mut line = String::new();
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
|
||||
let mut iter = line.trim().split(' ').map(|s| s.parse::<usize>().unwrap());
|
||||
let a = (
|
||||
iter.next().unwrap(),
|
||||
iter.next().unwrap(),
|
||||
iter.next().unwrap(),
|
||||
);
|
||||
line.clear();
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
let mut iter = line.trim().split(' ').map(|s| s.parse::<usize>().unwrap());
|
||||
let c = (
|
||||
iter.next().unwrap(),
|
||||
iter.next().unwrap(),
|
||||
iter.next().unwrap(),
|
||||
);
|
||||
|
||||
let b = (c.0 - a.2, c.1 / a.1, c.2 - a.0);
|
||||
|
||||
println!("{} {} {}", b.0, b.1, b.2);
|
||||
}
|
||||
84
storage/zeta/rs/completed/17371.rs
Normal file
84
storage/zeta/rs/completed/17371.rs
Normal file
@@ -0,0 +1,84 @@
|
||||
use std::io::stdin;
|
||||
|
||||
fn optimized_pos(poses: &Vec<(f64, f64)>) -> (f64, f64) {
|
||||
let n = poses.len();
|
||||
if n == 0 {
|
||||
return (0.0, 0.0);
|
||||
}
|
||||
if n == 1 {
|
||||
return poses[0];
|
||||
}
|
||||
|
||||
let mut sorted_poses = poses.clone();
|
||||
sorted_poses.sort_by(|a, b| {
|
||||
a.0.partial_cmp(&b.0)
|
||||
.unwrap_or(std::cmp::Ordering::Equal)
|
||||
.then(a.1.partial_cmp(&b.1).unwrap_or(std::cmp::Ordering::Equal))
|
||||
});
|
||||
|
||||
fn cross_product(o: (f64, f64), a: (f64, f64), b: (f64, f64)) -> f64 {
|
||||
(a.0 - o.0) * (b.1 - o.1) - (a.1 - o.1) * (b.0 - o.0)
|
||||
}
|
||||
|
||||
let mut hull = Vec::new();
|
||||
for &p in &sorted_poses {
|
||||
while hull.len() >= 2 && cross_product(hull[hull.len() - 2], hull[hull.len() - 1], p) <= 0.0
|
||||
{
|
||||
hull.pop();
|
||||
}
|
||||
hull.push(p);
|
||||
}
|
||||
let lower_len = hull.len();
|
||||
for i in (0..sorted_poses.len() - 1).rev() {
|
||||
let p = sorted_poses[i];
|
||||
while hull.len() > lower_len
|
||||
&& cross_product(hull[hull.len() - 2], hull[hull.len() - 1], p) <= 0.0
|
||||
{
|
||||
hull.pop();
|
||||
}
|
||||
hull.push(p);
|
||||
}
|
||||
hull.pop();
|
||||
|
||||
let dist_sq = |p1: (f64, f64), p2: (f64, f64)| (p1.0 - p2.0).powi(2) + (p1.1 - p2.1).powi(2);
|
||||
|
||||
let mut min_max_dist_sq = f64::MAX;
|
||||
let mut best_pos = poses[0];
|
||||
|
||||
for &p in poses {
|
||||
let mut max_d_sq = 0.0;
|
||||
for &h in &hull {
|
||||
let d_sq = dist_sq(p, h);
|
||||
if d_sq > max_d_sq {
|
||||
max_d_sq = d_sq;
|
||||
}
|
||||
}
|
||||
|
||||
if max_d_sq < min_max_dist_sq {
|
||||
min_max_dist_sq = max_d_sq;
|
||||
best_pos = p;
|
||||
}
|
||||
}
|
||||
|
||||
best_pos
|
||||
}
|
||||
fn main() {
|
||||
let mut line = String::new();
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
|
||||
let n = line.trim().parse::<usize>().unwrap();
|
||||
|
||||
let mut poses_infra = (0..n)
|
||||
.map(|_| {
|
||||
line.clear();
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
let mut iter = line.split(' ').map(|s| s.trim().parse::<f64>().unwrap());
|
||||
|
||||
let (a, b) = (iter.next().unwrap(), iter.next().unwrap());
|
||||
(a, b)
|
||||
})
|
||||
.collect::<Vec<(f64, f64)>>();
|
||||
|
||||
let res = optimized_pos(&mut poses_infra);
|
||||
println!("{:.7} {:.7}", res.0, res.1);
|
||||
}
|
||||
37
storage/zeta/rs/completed/27634.rs
Normal file
37
storage/zeta/rs/completed/27634.rs
Normal file
@@ -0,0 +1,37 @@
|
||||
use std::io::stdin;
|
||||
|
||||
fn main() {
|
||||
let mut line = String::new();
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
|
||||
let mut iter = line.split_whitespace();
|
||||
|
||||
let k: i64 = iter.next().unwrap().parse().unwrap();
|
||||
let s: i64 = iter.next().unwrap().parse().unwrap();
|
||||
let n: i64 = iter.next().unwrap().parse().unwrap();
|
||||
|
||||
if n < s * k {
|
||||
println!("NO");
|
||||
return;
|
||||
}
|
||||
|
||||
if k == 2 {
|
||||
if n % 2 == 0 {
|
||||
println!("YES");
|
||||
} else {
|
||||
println!("NO");
|
||||
}
|
||||
} else {
|
||||
if s == 1 {
|
||||
if n <= 2 * k - 2 {
|
||||
println!("YES");
|
||||
} else if n % 2 == 0 {
|
||||
println!("YES");
|
||||
} else {
|
||||
println!("NO");
|
||||
}
|
||||
} else {
|
||||
println!("YES");
|
||||
}
|
||||
}
|
||||
}
|
||||
46
storage/zeta/rs/completed/3086.rs
Normal file
46
storage/zeta/rs/completed/3086.rs
Normal file
@@ -0,0 +1,46 @@
|
||||
use std::{
|
||||
io::{read_to_string, stdin},
|
||||
usize,
|
||||
};
|
||||
|
||||
fn main() {
|
||||
let temp = read_to_string(stdin()).unwrap();
|
||||
let mut iter = temp
|
||||
.split_ascii_whitespace()
|
||||
.map(|x| x.parse::<usize>().unwrap());
|
||||
|
||||
let (n, m) = {
|
||||
let (x, y) = (iter.next().unwrap(), iter.next().unwrap());
|
||||
if x >= y { (x, y) } else { (y, x) }
|
||||
};
|
||||
|
||||
let mut dp = vec![vec![0; n + 1]; n + 1];
|
||||
|
||||
for i in 1..=m {
|
||||
dp[1][i] = i;
|
||||
dp[i][i] = 1;
|
||||
}
|
||||
|
||||
for i in 1..=n {
|
||||
dp[i][1] = i;
|
||||
}
|
||||
|
||||
for i in 2..=n {
|
||||
for j in 2..=m {
|
||||
if dp[i][j] > 0 {
|
||||
continue;
|
||||
}
|
||||
let mut a = usize::MAX;
|
||||
for x in 1..=i / 2 {
|
||||
a = a.min(dp[i - x][j] + dp[x][j]);
|
||||
}
|
||||
for x in 1..=j / 2 {
|
||||
a = a.min(dp[i][j - x] + dp[i][x]);
|
||||
}
|
||||
dp[i][j] = a;
|
||||
dp[j][i] = a;
|
||||
}
|
||||
}
|
||||
|
||||
println!("{}", dp[n][m]);
|
||||
}
|
||||
43
storage/zeta/rs/completed/31846.rs
Normal file
43
storage/zeta/rs/completed/31846.rs
Normal file
@@ -0,0 +1,43 @@
|
||||
use std::io::stdin;
|
||||
|
||||
fn main() {
|
||||
let mut line = String::new();
|
||||
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
|
||||
let _ = line.trim().parse::<usize>().unwrap();
|
||||
|
||||
line.clear();
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
let s = line.trim().chars().collect::<Vec<char>>();
|
||||
|
||||
line.clear();
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
let q = line.trim().parse::<usize>().unwrap();
|
||||
|
||||
let queries = (0..q).map(|_| {
|
||||
line.clear();
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
let mut parts = line.trim().split_whitespace();
|
||||
let l = parts.next().unwrap().parse::<usize>().unwrap() - 1;
|
||||
let r = parts.next().unwrap().parse::<usize>().unwrap() - 1;
|
||||
(l, r)
|
||||
});
|
||||
|
||||
for (l, r) in queries {
|
||||
let len = r - l + 1;
|
||||
let sub = &s[l..=r];
|
||||
|
||||
let mut max_score = 0;
|
||||
for k in 1..len {
|
||||
let mut score = 0;
|
||||
for i in 0..k.min(len - k) {
|
||||
if sub[k - 1 - i] == sub[k + i] {
|
||||
score += 1;
|
||||
}
|
||||
}
|
||||
max_score = max_score.max(score);
|
||||
}
|
||||
println!("{}", max_score);
|
||||
}
|
||||
}
|
||||
39
storage/zeta/rs/completed/7695.rs
Normal file
39
storage/zeta/rs/completed/7695.rs
Normal file
@@ -0,0 +1,39 @@
|
||||
use std::cmp::max;
|
||||
use std::io::stdin;
|
||||
|
||||
fn longest_sub_regular_bracket_string(s: String) -> usize {
|
||||
let n = s.len();
|
||||
let mut dp = vec![vec![0; n]; n];
|
||||
|
||||
for dx in 1..n {
|
||||
for left in 0..n - dx {
|
||||
let right = left + dx;
|
||||
if (s.as_bytes()[left] == b'(' && s.as_bytes()[right] == b')')
|
||||
|| (s.as_bytes()[left] == b'[' && s.as_bytes()[right] == b']')
|
||||
{
|
||||
dp[left][right] = dp[left + 1][right - 1] + 2;
|
||||
}
|
||||
for k in left..right {
|
||||
dp[left][right] = max(dp[left][right], dp[left][k] + dp[k + 1][right]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dp[0][n - 1]
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut line = String::new();
|
||||
|
||||
loop {
|
||||
line.clear();
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
if line.starts_with("end") {
|
||||
break;
|
||||
}
|
||||
|
||||
let s = line.trim().to_string();
|
||||
|
||||
println!("{}", longest_sub_regular_bracket_string(s));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user