Submission #40826591
Source Code Expand
use itertools::{izip, Itertools};
use lib::{acl::dsu::Dsu, is_covered, parse_input, ChangeMinMax, Input, Output};
use rand::Rng;
use rand_pcg::Pcg64Mcg;
use std::{cmp::Reverse, collections::BinaryHeap};
const MAX_POWER: i32 = 5000;
/// 色々改善した焼きなまし
fn main() {
let input = parse_input();
let mut env = Environment::new(&input, false, 0);
let state = generate_initial_solution(&env);
let mut state = annealing(&env, state, 1.5, 3e6, 3e5, 1000.0, 200.0);
env.consider_edges = true;
// 一旦連結にする
for i in 0..input.station_count {
if state.powers[i] == 0 {
state.change_power(&env, i, 1);
}
}
let state = annealing(&env, state, 0.45, 3e5, 1e4, 200.0, 10.0);
let output = Output::new(state.powers.clone(), state.get_edges(&env).unwrap(), &input);
println!("{}", output);
eprintln!("score: {}", output.calc_score(&input));
}
fn generate_initial_solution(env: &Environment) -> State {
let input = &env.input;
let mut dsu = Dsu::new(input.station_count);
let mut edges = vec![];
for &i in &env.edge_candidates {
let (u, v, _) = input.edges[i];
if !dsu.same(u, v) {
dsu.merge(u, v);
edges.push((u, v));
}
}
let powers = vec![power_binary_search(&input); input.station_count];
State::new(powers, env)
}
fn power_binary_search(input: &Input) -> i32 {
let mut ok = MAX_POWER;
let mut ng = -1;
while (ok - ng).abs() > 1 {
let mid = (ok + ng) / 2;
let mut broadcasted = vec![false; input.resident_count];
for i in 0..input.resident_count {
broadcasted[i] = input
.stations
.iter()
.any(|b| is_covered(&input.residents[i], b, mid));
}
if broadcasted.iter().all(|&b| b) {
ok = mid;
} else {
ng = mid;
}
}
ok
}
#[derive(Debug, Clone)]
struct Environment<'a> {
input: &'a Input,
points: Vec<Vec<(i32, usize)>>,
consider_edges: bool,
edge_candidates: Vec<usize>,
approx_edge_cost: Vec<i64>,
output_interval: usize,
}
impl<'a> Environment<'a> {
fn new(input: &'a Input, consider_edges: bool, output_interval: usize) -> Self {
Self {
input,
points: Self::generate_points_vec(input),
consider_edges,
edge_candidates: Self::generate_edge_candidates(input),
approx_edge_cost: Self::generate_approx_edge_costs(input),
output_interval,
}
}
fn generate_points_vec(input: &Input) -> Vec<Vec<(i32, usize)>> {
let mut result = vec![];
for j in 0..input.station_count {
let mut points = vec![];
for i in 0..input.resident_count {
let dist_sq = input.stations[j].calc_sq_dist(&input.residents[i]);
points.push((dist_sq, i));
}
points.sort_unstable();
result.push(points);
}
result
}
fn generate_edge_candidates(input: &Input) -> Vec<usize> {
let mut all_edges = (0..input.edge_count)
.map(|i| (input.edges[i].2, i))
.collect_vec();
all_edges.sort_unstable();
all_edges.iter().map(|&(_, i)| i).collect_vec()
}
fn generate_approx_edge_costs(input: &Input) -> Vec<i64> {
let mut graph = vec![vec![]; input.station_count];
for &(u, v, w) in &input.edges {
graph[u].push((v, w));
graph[v].push((u, w));
}
let mut dists = vec![std::i64::MAX / 2; input.station_count];
let mut approx_costs = vec![0; input.station_count];
let mut queue = BinaryHeap::new();
dists[0] = 0;
queue.push(Reverse((0, 0)));
while let Some(Reverse((cost, v))) = queue.pop() {
if cost > dists[v] {
continue;
}
for &(next, w) in &graph[v] {
let next_cost = cost + w as i64;
if dists[next].change_min(next_cost) {
queue.push(Reverse((next_cost, next)));
// 使った辺のコストを近似コストとする
approx_costs[next] = w as i64;
}
}
}
approx_costs
}
}
#[derive(Debug, Clone)]
struct State {
powers: Vec<i32>,
covered_count: Vec<usize>,
covering_count: Vec<usize>,
not_covered_count: usize,
power_cost_sum: i64,
approx_edge_cost_sum: i64,
edge_cost: i64,
}
impl State {
fn new(powers: Vec<i32>, env: &Environment) -> Self {
let mut covered_count = vec![0; env.input.resident_count];
for (i, h) in env.input.residents.iter().enumerate() {
covered_count[i] = env
.input
.stations
.iter()
.zip(powers.iter())
.filter(|(b, &p)| is_covered(h, b, p))
.count();
}
let mut covering_count = vec![];
for j in 0..env.input.station_count {
let mut i = 0;
let p2 = powers[j] * powers[j];
while i < env.points[j].len() && p2 >= env.points[j][i].0 {
i += 1;
}
covering_count.push(i);
}
let not_covered_count = covered_count.iter().filter(|&&i| i == 0).count();
let power_cost_sum = powers.iter().map(|&p| (p * p) as i64).sum();
let approx_edge_cost_sum = izip!(powers.iter(), env.approx_edge_cost.iter())
.map(|(&p, &c)| if p > 0 { c } else { 0 })
.sum();
let mut state = Self {
powers,
covered_count,
covering_count,
not_covered_count,
power_cost_sum,
approx_edge_cost_sum,
edge_cost: 0,
};
state.recalc_edge_cost(env);
state
}
fn change_power(&mut self, env: &Environment, index: usize, new_power: i32) {
let count = &mut self.covering_count[index];
let points = &env.points[index];
let old_power = self.powers[index];
let p2 = new_power * new_power;
self.power_cost_sum += p2 as i64 - (old_power * old_power) as i64;
// 減らす
while *count > 0 && points[*count - 1].0 > p2 {
Self::decrease_covered_count(
&mut self.covered_count,
&mut self.not_covered_count,
points[*count - 1].1,
);
*count -= 1;
}
// 増やす
while *count < env.input.resident_count && points[*count].0 <= p2 {
Self::increase_covered_count(
&mut self.covered_count,
&mut self.not_covered_count,
points[*count].1,
);
*count += 1;
}
if old_power == 0 && new_power > 0 {
self.approx_edge_cost_sum += env.approx_edge_cost[index];
self.edge_cost = -1;
} else if old_power > 0 && new_power == 0 {
self.approx_edge_cost_sum -= env.approx_edge_cost[index];
self.edge_cost = -1;
}
self.powers[index] = new_power;
}
fn decrease_covered_count(
covered_count: &mut [usize],
not_covered_count: &mut usize,
v: usize,
) {
covered_count[v] -= 1;
if covered_count[v] == 0 {
*not_covered_count += 1;
}
}
fn increase_covered_count(
covered_count: &mut [usize],
not_covered_count: &mut usize,
v: usize,
) {
if covered_count[v] == 0 {
*not_covered_count -= 1;
}
covered_count[v] += 1;
}
fn calc_score(&mut self, env: &Environment) -> i64 {
if self.not_covered_count > 0 {
return std::i64::MAX / 2;
}
let mut score = self.power_cost_sum;
if env.consider_edges {
if self.edge_cost == -1 {
self.recalc_edge_cost(env);
}
score += self.edge_cost;
} else {
score += self.approx_edge_cost_sum;
}
score
}
fn recalc_edge_cost(&mut self, env: &Environment) {
self.edge_cost = self.calc_edge_cost(env);
}
fn calc_edge_cost(&self, env: &Environment) -> i64 {
if let Ok(edges) = self.get_edges(env) {
let mut score = 0;
for i in edges {
let (_, _, w) = env.input.edges[i];
score += w as i64;
}
score
} else {
std::i64::MAX / 2
}
}
fn get_edges(&self, env: &Environment) -> Result<Vec<usize>, Vec<usize>> {
let mut dsu = Dsu::new(env.input.station_count);
let mut edges = vec![];
for &i in &env.edge_candidates {
let (u, v, _) = env.input.edges[i];
if (u != 0 && self.powers[u] == 0) || self.powers[v] == 0 {
continue;
}
if !dsu.same(u, v) {
dsu.merge(u, v);
edges.push(i);
}
}
let connected = (0..env.input.station_count).all(|i| self.powers[i] == 0 || dsu.same(0, i));
if connected {
Ok(edges)
} else {
Err(edges)
}
}
}
trait Action {
fn apply(&self, env: &Environment, state: &mut State);
fn rollback(&self, env: &Environment, state: &mut State);
}
#[derive(Debug, Clone, Copy)]
struct ChangePower {
index: usize,
old_power: i32,
new_power: i32,
old_edge_cost: i64,
}
impl ChangePower {
fn new(index: usize, old_power: i32, new_power: i32, old_edge_cost: i64) -> Self {
Self {
index,
old_power,
new_power,
old_edge_cost,
}
}
}
impl Action for ChangePower {
fn apply(&self, env: &Environment, state: &mut State) {
state.change_power(env, self.index, self.new_power);
}
fn rollback(&self, env: &Environment, state: &mut State) {
state.change_power(env, self.index, self.old_power);
state.edge_cost = self.old_edge_cost;
}
}
fn generate_action(
env: &Environment,
state: &State,
rng: &mut Pcg64Mcg,
r0: f64,
r1: f64,
t: f64,
) -> Box<dyn Action> {
let range = (r0 * (1.0 - t) + r1 * t).round() as i32;
loop {
let index = rng.gen_range(0, env.input.station_count);
let power_diff = rng.gen_range(-range, range + 1);
let new_power = (state.powers[index] + power_diff).max(0).min(MAX_POWER);
if state.powers[index] == new_power {
continue;
}
return Box::new(ChangePower::new(
index,
state.powers[index],
new_power,
state.edge_cost,
));
}
}
fn annealing(
env: &Environment,
initial_solution: State,
duration: f64,
temp0: f64,
temp1: f64,
r0: f64,
r1: f64,
) -> State {
let mut solution = initial_solution;
let mut best_solution = solution.clone();
let mut current_score = solution.calc_score(env);
let mut best_score = current_score;
let init_score = current_score;
let mut all_iter = 0;
let mut valid_iter = 0;
let mut accepted_count = 0;
let mut update_count = 0;
let mut rng = rand_pcg::Pcg64Mcg::new(42);
let duration_inv = 1.0 / duration;
let since = std::time::Instant::now();
let mut inv_temp = 1.0 / temp0;
let mut time = 0.0;
loop {
if env.output_interval > 0 && all_iter % env.output_interval == 0 {
let edges = match solution.get_edges(&env) {
Ok(edges) => edges,
Err(edges) => edges,
};
let output = Output::new(solution.powers.clone(), edges, &env.input);
println!("{}", output);
}
all_iter += 1;
if (all_iter & ((1 << 10) - 1)) == 0 {
time = (std::time::Instant::now() - since).as_secs_f64() * duration_inv;
let temp = f64::powf(temp0, 1.0 - time) * f64::powf(temp1, time);
inv_temp = 1.0 / temp;
if time >= 1.0 {
break;
}
}
// 変形
let action = generate_action(env, &solution, &mut rng, r0, r1, time);
action.apply(env, &mut solution);
// スコア計算
let new_score = solution.calc_score(env);
let score_diff = new_score - current_score;
if score_diff <= 0 || rng.gen_bool(f64::exp(-score_diff as f64 * inv_temp)) {
// 解の更新
current_score = new_score;
accepted_count += 1;
if best_score.change_min(current_score) {
best_solution = solution.clone();
update_count += 1;
}
} else {
action.rollback(env, &mut solution);
}
valid_iter += 1;
}
eprintln!("===== annealing =====");
eprintln!("init score : {}", init_score);
eprintln!("score : {}", best_score);
eprintln!("all iter : {}", all_iter);
eprintln!("valid iter : {}", valid_iter);
eprintln!("accepted : {}", accepted_count);
eprintln!("updated : {}", update_count);
eprintln!("");
best_solution
}
mod lib {
use acl::dsu::Dsu;
use itertools::Itertools;
use proconio::{input, marker::Usize1};
use std::fmt::Display;
pub trait ChangeMinMax {
fn change_min(&mut self, v: Self) -> bool;
fn change_max(&mut self, v: Self) -> bool;
}
impl<T: PartialOrd> ChangeMinMax for T {
fn change_min(&mut self, v: T) -> bool {
*self > v && {
*self = v;
true
}
}
fn change_max(&mut self, v: T) -> bool {
*self < v && {
*self = v;
true
}
}
}
#[derive(Clone, Debug)]
pub struct Input {
pub station_count: usize,
pub edge_count: usize,
pub resident_count: usize,
pub stations: Vec<Point>,
pub edges: Vec<(usize, usize, i32)>,
pub residents: Vec<Point>,
}
#[derive(Clone, Debug)]
pub struct Output<'a> {
pub powers: Vec<i32>,
pub edge_count: usize,
pub edges: Vec<usize>,
input: &'a Input,
}
impl<'a> Output<'a> {
pub fn new(powers: Vec<i32>, edges: Vec<usize>, input: &'a Input) -> Self {
Self {
powers,
edge_count: edges.len(),
edges,
input,
}
}
pub fn calc_score(&self, input: &Input) -> i64 {
let is_connected = self.get_connection_status(input);
let broadcasted = self.get_broadcasted_count(input, &is_connected);
if broadcasted < input.resident_count {
return broadcasted as i64;
}
self.calc_cost(input)
}
fn get_connection_status(&self, input: &Input) -> Vec<bool> {
let mut dsu = Dsu::new(input.station_count);
for &i in &self.edges {
let (u, v, _) = input.edges[i];
dsu.merge(u, v);
}
(0..input.station_count).map(|i| dsu.same(0, i)).collect()
}
fn get_broadcasted_count(&self, input: &Input, is_connected: &[bool]) -> usize {
let mut broadcasted = vec![false; input.resident_count];
for i in 0..input.station_count {
if !is_connected[i] {
continue;
}
for j in 0..input.resident_count {
let dist_sq = input.stations[i].calc_sq_dist(&input.residents[j]);
let power = self.powers[i];
broadcasted[j] |= dist_sq <= power * power;
}
}
broadcasted.iter().filter(|&&b| b).count()
}
fn calc_cost(&self, input: &Input) -> i64 {
let mut broadcast_cost = 0;
for &p in &self.powers {
let p = p as i64;
broadcast_cost += p * p;
}
let mut edge_cost = 0;
for &i in &self.edges {
let (_, _, w) = input.edges[i];
edge_cost += w as i64;
}
eprintln!("broadcast_cost: {:>10}", broadcast_cost);
eprintln!("edge_cost : {:>10}", edge_cost);
broadcast_cost + edge_cost
}
}
impl<'a> Display for Output<'a> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
writeln!(f, "{}", self.powers.iter().map(|p| p.to_string()).join(" "))?;
let mut used = vec![0; self.input.edge_count];
for &e in &self.edges {
used[e] = 1;
}
write!(f, "{}", used.iter().map(|u| u.to_string()).join(" "))?;
Ok(())
}
}
#[derive(Clone, Debug, Copy, PartialEq, Eq, Hash)]
pub struct Point {
pub x: i32,
pub y: i32,
}
impl Point {
pub fn new(x: i32, y: i32) -> Self {
Self { x, y }
}
pub fn calc_sq_dist(&self, other: &Point) -> i32 {
let dx = self.x - other.x;
let dy = self.y - other.y;
dx * dx + dy * dy
}
}
pub fn parse_input() -> Input {
input! {
n: usize,
m: usize,
k: usize,
stations: [(i32, i32); n],
edges: [(Usize1, Usize1, i32); m],
residents: [(i32, i32); k],
}
Input {
station_count: n,
edge_count: m,
resident_count: k,
stations: stations.iter().map(|&(x, y)| Point::new(x, y)).collect(),
edges,
residents: residents.iter().map(|&(x, y)| Point::new(x, y)).collect(),
}
}
pub fn is_covered(p1: &Point, p2: &Point, power: i32) -> bool {
p1.calc_sq_dist(p2) <= power * power
}
pub mod acl {
pub mod dsu {
pub struct Dsu {
n: usize,
parent_or_size: Vec<i32>,
}
impl Dsu {
pub fn new(size: usize) -> Self {
Self {
n: 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.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
}
}
}
}
}
Submission Info
| Submission Time | |
|---|---|
| Task | A - Broadcasting |
| User | terry_u16 |
| Language | Rust (1.42.0) |
| Score | 506513542 |
| Code Size | 20550 Byte |
| Status | AC |
| Exec Time | 1992 ms |
| Memory | 11396 KiB |
Judge Result
| Set Name | test_ALL | ||
|---|---|---|---|
| Score / Max Score | 506513542 / 3300000000 | ||
| Status |
|
| Set Name | Test Cases |
|---|---|
| test_ALL | test_0000.txt, test_0001.txt, test_0002.txt, test_0003.txt, test_0004.txt, test_0005.txt, test_0006.txt, test_0007.txt, test_0008.txt, test_0009.txt, test_0010.txt, test_0011.txt, test_0012.txt, test_0013.txt, test_0014.txt, test_0015.txt, test_0016.txt, test_0017.txt, test_0018.txt, test_0019.txt, test_0020.txt, test_0021.txt, test_0022.txt, test_0023.txt, test_0024.txt, test_0025.txt, test_0026.txt, test_0027.txt, test_0028.txt, test_0029.txt, test_0030.txt, test_0031.txt, test_0032.txt, test_0033.txt, test_0034.txt, test_0035.txt, test_0036.txt, test_0037.txt, test_0038.txt, test_0039.txt, test_0040.txt, test_0041.txt, test_0042.txt, test_0043.txt, test_0044.txt, test_0045.txt, test_0046.txt, test_0047.txt, test_0048.txt, test_0049.txt, test_0050.txt, test_0051.txt, test_0052.txt, test_0053.txt, test_0054.txt, test_0055.txt, test_0056.txt, test_0057.txt, test_0058.txt, test_0059.txt, test_0060.txt, test_0061.txt, test_0062.txt, test_0063.txt, test_0064.txt, test_0065.txt, test_0066.txt, test_0067.txt, test_0068.txt, test_0069.txt, test_0070.txt, test_0071.txt, test_0072.txt, test_0073.txt, test_0074.txt, test_0075.txt, test_0076.txt, test_0077.txt, test_0078.txt, test_0079.txt, test_0080.txt, test_0081.txt, test_0082.txt, test_0083.txt, test_0084.txt, test_0085.txt, test_0086.txt, test_0087.txt, test_0088.txt, test_0089.txt, test_0090.txt, test_0091.txt, test_0092.txt, test_0093.txt, test_0094.txt, test_0095.txt, test_0096.txt, test_0097.txt, test_0098.txt, test_0099.txt, test_0100.txt, test_0101.txt, test_0102.txt, test_0103.txt, test_0104.txt, test_0105.txt, test_0106.txt, test_0107.txt, test_0108.txt, test_0109.txt, test_0110.txt, test_0111.txt, test_0112.txt, test_0113.txt, test_0114.txt, test_0115.txt, test_0116.txt, test_0117.txt, test_0118.txt, test_0119.txt, test_0120.txt, test_0121.txt, test_0122.txt, test_0123.txt, test_0124.txt, test_0125.txt, test_0126.txt, test_0127.txt, test_0128.txt, test_0129.txt, test_0130.txt, test_0131.txt, test_0132.txt, test_0133.txt, test_0134.txt, test_0135.txt, test_0136.txt, test_0137.txt, test_0138.txt, test_0139.txt, test_0140.txt, test_0141.txt, test_0142.txt, test_0143.txt, test_0144.txt, test_0145.txt, test_0146.txt, test_0147.txt, test_0148.txt, test_0149.txt, test_0150.txt, test_0151.txt, test_0152.txt, test_0153.txt, test_0154.txt, test_0155.txt, test_0156.txt, test_0157.txt, test_0158.txt, test_0159.txt, test_0160.txt, test_0161.txt, test_0162.txt, test_0163.txt, test_0164.txt, test_0165.txt, test_0166.txt, test_0167.txt, test_0168.txt, test_0169.txt, test_0170.txt, test_0171.txt, test_0172.txt, test_0173.txt, test_0174.txt, test_0175.txt, test_0176.txt, test_0177.txt, test_0178.txt, test_0179.txt, test_0180.txt, test_0181.txt, test_0182.txt, test_0183.txt, test_0184.txt, test_0185.txt, test_0186.txt, test_0187.txt, test_0188.txt, test_0189.txt, test_0190.txt, test_0191.txt, test_0192.txt, test_0193.txt, test_0194.txt, test_0195.txt, test_0196.txt, test_0197.txt, test_0198.txt, test_0199.txt, test_0200.txt, test_0201.txt, test_0202.txt, test_0203.txt, test_0204.txt, test_0205.txt, test_0206.txt, test_0207.txt, test_0208.txt, test_0209.txt, test_0210.txt, test_0211.txt, test_0212.txt, test_0213.txt, test_0214.txt, test_0215.txt, test_0216.txt, test_0217.txt, test_0218.txt, test_0219.txt, test_0220.txt, test_0221.txt, test_0222.txt, test_0223.txt, test_0224.txt, test_0225.txt, test_0226.txt, test_0227.txt, test_0228.txt, test_0229.txt, test_0230.txt, test_0231.txt, test_0232.txt, test_0233.txt, test_0234.txt, test_0235.txt, test_0236.txt, test_0237.txt, test_0238.txt, test_0239.txt, test_0240.txt, test_0241.txt, test_0242.txt, test_0243.txt, test_0244.txt, test_0245.txt, test_0246.txt, test_0247.txt, test_0248.txt, test_0249.txt, test_0250.txt, test_0251.txt, test_0252.txt, test_0253.txt, test_0254.txt, test_0255.txt, test_0256.txt, test_0257.txt, test_0258.txt, test_0259.txt, test_0260.txt, test_0261.txt, test_0262.txt, test_0263.txt, test_0264.txt, test_0265.txt, test_0266.txt, test_0267.txt, test_0268.txt, test_0269.txt, test_0270.txt, test_0271.txt, test_0272.txt, test_0273.txt, test_0274.txt, test_0275.txt, test_0276.txt, test_0277.txt, test_0278.txt, test_0279.txt, test_0280.txt, test_0281.txt, test_0282.txt, test_0283.txt, test_0284.txt, test_0285.txt, test_0286.txt, test_0287.txt, test_0288.txt, test_0289.txt, test_0290.txt, test_0291.txt, test_0292.txt, test_0293.txt, test_0294.txt, test_0295.txt, test_0296.txt, test_0297.txt, test_0298.txt, test_0299.txt |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| test_0000.txt | AC | 1977 ms | 8616 KiB |
| test_0001.txt | AC | 1989 ms | 10832 KiB |
| test_0002.txt | AC | 1974 ms | 7144 KiB |
| test_0003.txt | AC | 1988 ms | 10368 KiB |
| test_0004.txt | AC | 1992 ms | 11348 KiB |
| test_0005.txt | AC | 1986 ms | 10180 KiB |
| test_0006.txt | AC | 1968 ms | 6288 KiB |
| test_0007.txt | AC | 1983 ms | 9676 KiB |
| test_0008.txt | AC | 1978 ms | 9200 KiB |
| test_0009.txt | AC | 1985 ms | 9876 KiB |
| test_0010.txt | AC | 1980 ms | 8800 KiB |
| test_0011.txt | AC | 1990 ms | 11288 KiB |
| test_0012.txt | AC | 1975 ms | 8076 KiB |
| test_0013.txt | AC | 1977 ms | 7776 KiB |
| test_0014.txt | AC | 1981 ms | 9472 KiB |
| test_0015.txt | AC | 1975 ms | 6976 KiB |
| test_0016.txt | AC | 1972 ms | 7548 KiB |
| test_0017.txt | AC | 1975 ms | 7092 KiB |
| test_0018.txt | AC | 1985 ms | 10064 KiB |
| test_0019.txt | AC | 1973 ms | 8016 KiB |
| test_0020.txt | AC | 1980 ms | 8908 KiB |
| test_0021.txt | AC | 1973 ms | 7264 KiB |
| test_0022.txt | AC | 1969 ms | 7272 KiB |
| test_0023.txt | AC | 1987 ms | 10444 KiB |
| test_0024.txt | AC | 1988 ms | 10564 KiB |
| test_0025.txt | AC | 1989 ms | 10904 KiB |
| test_0026.txt | AC | 1984 ms | 9700 KiB |
| test_0027.txt | AC | 1970 ms | 7500 KiB |
| test_0028.txt | AC | 1989 ms | 11396 KiB |
| test_0029.txt | AC | 1972 ms | 7656 KiB |
| test_0030.txt | AC | 1978 ms | 8236 KiB |
| test_0031.txt | AC | 1973 ms | 7840 KiB |
| test_0032.txt | AC | 1985 ms | 10384 KiB |
| test_0033.txt | AC | 1985 ms | 10008 KiB |
| test_0034.txt | AC | 1969 ms | 7012 KiB |
| test_0035.txt | AC | 1970 ms | 7404 KiB |
| test_0036.txt | AC | 1971 ms | 7488 KiB |
| test_0037.txt | AC | 1972 ms | 7208 KiB |
| test_0038.txt | AC | 1987 ms | 10468 KiB |
| test_0039.txt | AC | 1970 ms | 7140 KiB |
| test_0040.txt | AC | 1976 ms | 6908 KiB |
| test_0041.txt | AC | 1978 ms | 7440 KiB |
| test_0042.txt | AC | 1989 ms | 11344 KiB |
| test_0043.txt | AC | 1981 ms | 8368 KiB |
| test_0044.txt | AC | 1976 ms | 7748 KiB |
| test_0045.txt | AC | 1984 ms | 9744 KiB |
| test_0046.txt | AC | 1979 ms | 7976 KiB |
| test_0047.txt | AC | 1976 ms | 7656 KiB |
| test_0048.txt | AC | 1986 ms | 10116 KiB |
| test_0049.txt | AC | 1987 ms | 10176 KiB |
| test_0050.txt | AC | 1980 ms | 8884 KiB |
| test_0051.txt | AC | 1972 ms | 7284 KiB |
| test_0052.txt | AC | 1982 ms | 8704 KiB |
| test_0053.txt | AC | 1983 ms | 9608 KiB |
| test_0054.txt | AC | 1983 ms | 8900 KiB |
| test_0055.txt | AC | 1984 ms | 8964 KiB |
| test_0056.txt | AC | 1977 ms | 7672 KiB |
| test_0057.txt | AC | 1976 ms | 7508 KiB |
| test_0058.txt | AC | 1987 ms | 10564 KiB |
| test_0059.txt | AC | 1984 ms | 10440 KiB |
| test_0060.txt | AC | 1987 ms | 10156 KiB |
| test_0061.txt | AC | 1969 ms | 7092 KiB |
| test_0062.txt | AC | 1978 ms | 8368 KiB |
| test_0063.txt | AC | 1985 ms | 10036 KiB |
| test_0064.txt | AC | 1979 ms | 8924 KiB |
| test_0065.txt | AC | 1978 ms | 8764 KiB |
| test_0066.txt | AC | 1972 ms | 7628 KiB |
| test_0067.txt | AC | 1979 ms | 7876 KiB |
| test_0068.txt | AC | 1975 ms | 8944 KiB |
| test_0069.txt | AC | 1980 ms | 8940 KiB |
| test_0070.txt | AC | 1983 ms | 10140 KiB |
| test_0071.txt | AC | 1974 ms | 7888 KiB |
| test_0072.txt | AC | 1985 ms | 10440 KiB |
| test_0073.txt | AC | 1980 ms | 8652 KiB |
| test_0074.txt | AC | 1980 ms | 9736 KiB |
| test_0075.txt | AC | 1982 ms | 9380 KiB |
| test_0076.txt | AC | 1973 ms | 7652 KiB |
| test_0077.txt | AC | 1972 ms | 7156 KiB |
| test_0078.txt | AC | 1969 ms | 7160 KiB |
| test_0079.txt | AC | 1976 ms | 8768 KiB |
| test_0080.txt | AC | 1985 ms | 10068 KiB |
| test_0081.txt | AC | 1969 ms | 7284 KiB |
| test_0082.txt | AC | 1985 ms | 8584 KiB |
| test_0083.txt | AC | 1983 ms | 8952 KiB |
| test_0084.txt | AC | 1985 ms | 10000 KiB |
| test_0085.txt | AC | 1986 ms | 9980 KiB |
| test_0086.txt | AC | 1982 ms | 8912 KiB |
| test_0087.txt | AC | 1976 ms | 7836 KiB |
| test_0088.txt | AC | 1992 ms | 11300 KiB |
| test_0089.txt | AC | 1970 ms | 6876 KiB |
| test_0090.txt | AC | 1978 ms | 8180 KiB |
| test_0091.txt | AC | 1972 ms | 7744 KiB |
| test_0092.txt | AC | 1976 ms | 8812 KiB |
| test_0093.txt | AC | 1979 ms | 8772 KiB |
| test_0094.txt | AC | 1976 ms | 6984 KiB |
| test_0095.txt | AC | 1968 ms | 6380 KiB |
| test_0096.txt | AC | 1970 ms | 7188 KiB |
| test_0097.txt | AC | 1990 ms | 11332 KiB |
| test_0098.txt | AC | 1971 ms | 7380 KiB |
| test_0099.txt | AC | 1989 ms | 10960 KiB |
| test_0100.txt | AC | 1971 ms | 6816 KiB |
| test_0101.txt | AC | 1974 ms | 8500 KiB |
| test_0102.txt | AC | 1973 ms | 8060 KiB |
| test_0103.txt | AC | 1980 ms | 9676 KiB |
| test_0104.txt | AC | 1989 ms | 10888 KiB |
| test_0105.txt | AC | 1969 ms | 6996 KiB |
| test_0106.txt | AC | 1975 ms | 7644 KiB |
| test_0107.txt | AC | 1989 ms | 10932 KiB |
| test_0108.txt | AC | 1988 ms | 11220 KiB |
| test_0109.txt | AC | 1982 ms | 9672 KiB |
| test_0110.txt | AC | 1984 ms | 9360 KiB |
| test_0111.txt | AC | 1982 ms | 8868 KiB |
| test_0112.txt | AC | 1974 ms | 6432 KiB |
| test_0113.txt | AC | 1988 ms | 10884 KiB |
| test_0114.txt | AC | 1990 ms | 11252 KiB |
| test_0115.txt | AC | 1987 ms | 10160 KiB |
| test_0116.txt | AC | 1983 ms | 10132 KiB |
| test_0117.txt | AC | 1969 ms | 6856 KiB |
| test_0118.txt | AC | 1970 ms | 6784 KiB |
| test_0119.txt | AC | 1977 ms | 9304 KiB |
| test_0120.txt | AC | 1986 ms | 9968 KiB |
| test_0121.txt | AC | 1984 ms | 9720 KiB |
| test_0122.txt | AC | 1989 ms | 11200 KiB |
| test_0123.txt | AC | 1971 ms | 7096 KiB |
| test_0124.txt | AC | 1972 ms | 7524 KiB |
| test_0125.txt | AC | 1985 ms | 9756 KiB |
| test_0126.txt | AC | 1981 ms | 9232 KiB |
| test_0127.txt | AC | 1980 ms | 8820 KiB |
| test_0128.txt | AC | 1970 ms | 7152 KiB |
| test_0129.txt | AC | 1980 ms | 8840 KiB |
| test_0130.txt | AC | 1975 ms | 8692 KiB |
| test_0131.txt | AC | 1982 ms | 9668 KiB |
| test_0132.txt | AC | 1977 ms | 7952 KiB |
| test_0133.txt | AC | 1971 ms | 7292 KiB |
| test_0134.txt | AC | 1971 ms | 7208 KiB |
| test_0135.txt | AC | 1976 ms | 7288 KiB |
| test_0136.txt | AC | 1972 ms | 7912 KiB |
| test_0137.txt | AC | 1975 ms | 8652 KiB |
| test_0138.txt | AC | 1985 ms | 10440 KiB |
| test_0139.txt | AC | 1969 ms | 7124 KiB |
| test_0140.txt | AC | 1982 ms | 9260 KiB |
| test_0141.txt | AC | 1978 ms | 8736 KiB |
| test_0142.txt | AC | 1983 ms | 9668 KiB |
| test_0143.txt | AC | 1982 ms | 10124 KiB |
| test_0144.txt | AC | 1989 ms | 10872 KiB |
| test_0145.txt | AC | 1975 ms | 7496 KiB |
| test_0146.txt | AC | 1977 ms | 9476 KiB |
| test_0147.txt | AC | 1974 ms | 8212 KiB |
| test_0148.txt | AC | 1975 ms | 8476 KiB |
| test_0149.txt | AC | 1977 ms | 8508 KiB |
| test_0150.txt | AC | 1985 ms | 10444 KiB |
| test_0151.txt | AC | 1986 ms | 10424 KiB |
| test_0152.txt | AC | 1985 ms | 10452 KiB |
| test_0153.txt | AC | 1980 ms | 8784 KiB |
| test_0154.txt | AC | 1970 ms | 7276 KiB |
| test_0155.txt | AC | 1987 ms | 10840 KiB |
| test_0156.txt | AC | 1984 ms | 10104 KiB |
| test_0157.txt | AC | 1978 ms | 8728 KiB |
| test_0158.txt | AC | 1988 ms | 10468 KiB |
| test_0159.txt | AC | 1978 ms | 7984 KiB |
| test_0160.txt | AC | 1989 ms | 10564 KiB |
| test_0161.txt | AC | 1976 ms | 7712 KiB |
| test_0162.txt | AC | 1979 ms | 8248 KiB |
| test_0163.txt | AC | 1986 ms | 9948 KiB |
| test_0164.txt | AC | 1989 ms | 11148 KiB |
| test_0165.txt | AC | 1981 ms | 9208 KiB |
| test_0166.txt | AC | 1980 ms | 8744 KiB |
| test_0167.txt | AC | 1978 ms | 8828 KiB |
| test_0168.txt | AC | 1987 ms | 10476 KiB |
| test_0169.txt | AC | 1989 ms | 11288 KiB |
| test_0170.txt | AC | 1979 ms | 8628 KiB |
| test_0171.txt | AC | 1987 ms | 10888 KiB |
| test_0172.txt | AC | 1987 ms | 10480 KiB |
| test_0173.txt | AC | 1986 ms | 10048 KiB |
| test_0174.txt | AC | 1972 ms | 6972 KiB |
| test_0175.txt | AC | 1971 ms | 7224 KiB |
| test_0176.txt | AC | 1982 ms | 9388 KiB |
| test_0177.txt | AC | 1975 ms | 8288 KiB |
| test_0178.txt | AC | 1991 ms | 10160 KiB |
| test_0179.txt | AC | 1977 ms | 7932 KiB |
| test_0180.txt | AC | 1974 ms | 7768 KiB |
| test_0181.txt | AC | 1989 ms | 10996 KiB |
| test_0182.txt | AC | 1985 ms | 10336 KiB |
| test_0183.txt | AC | 1981 ms | 9644 KiB |
| test_0184.txt | AC | 1976 ms | 7264 KiB |
| test_0185.txt | AC | 1977 ms | 8688 KiB |
| test_0186.txt | AC | 1988 ms | 11380 KiB |
| test_0187.txt | AC | 1971 ms | 7156 KiB |
| test_0188.txt | AC | 1977 ms | 8976 KiB |
| test_0189.txt | AC | 1989 ms | 10136 KiB |
| test_0190.txt | AC | 1985 ms | 10128 KiB |
| test_0191.txt | AC | 1971 ms | 6892 KiB |
| test_0192.txt | AC | 1971 ms | 7272 KiB |
| test_0193.txt | AC | 1988 ms | 10888 KiB |
| test_0194.txt | AC | 1969 ms | 6424 KiB |
| test_0195.txt | AC | 1976 ms | 7936 KiB |
| test_0196.txt | AC | 1983 ms | 9720 KiB |
| test_0197.txt | AC | 1976 ms | 8192 KiB |
| test_0198.txt | AC | 1978 ms | 8044 KiB |
| test_0199.txt | AC | 1973 ms | 8372 KiB |
| test_0200.txt | AC | 1981 ms | 9300 KiB |
| test_0201.txt | AC | 1975 ms | 7944 KiB |
| test_0202.txt | AC | 1970 ms | 7472 KiB |
| test_0203.txt | AC | 1974 ms | 7436 KiB |
| test_0204.txt | AC | 1975 ms | 7956 KiB |
| test_0205.txt | AC | 1985 ms | 10508 KiB |
| test_0206.txt | AC | 1975 ms | 7472 KiB |
| test_0207.txt | AC | 1982 ms | 8968 KiB |
| test_0208.txt | AC | 1974 ms | 8128 KiB |
| test_0209.txt | AC | 1978 ms | 9160 KiB |
| test_0210.txt | AC | 1989 ms | 10980 KiB |
| test_0211.txt | AC | 1968 ms | 6440 KiB |
| test_0212.txt | AC | 1986 ms | 9704 KiB |
| test_0213.txt | AC | 1986 ms | 11332 KiB |
| test_0214.txt | AC | 1987 ms | 10472 KiB |
| test_0215.txt | AC | 1988 ms | 10788 KiB |
| test_0216.txt | AC | 1984 ms | 10136 KiB |
| test_0217.txt | AC | 1977 ms | 9096 KiB |
| test_0218.txt | AC | 1980 ms | 8344 KiB |
| test_0219.txt | AC | 1986 ms | 10528 KiB |
| test_0220.txt | AC | 1971 ms | 7200 KiB |
| test_0221.txt | AC | 1975 ms | 6868 KiB |
| test_0222.txt | AC | 1973 ms | 7916 KiB |
| test_0223.txt | AC | 1988 ms | 9956 KiB |
| test_0224.txt | AC | 1979 ms | 8816 KiB |
| test_0225.txt | AC | 1980 ms | 8608 KiB |
| test_0226.txt | AC | 1987 ms | 10956 KiB |
| test_0227.txt | AC | 1971 ms | 6884 KiB |
| test_0228.txt | AC | 1970 ms | 7188 KiB |
| test_0229.txt | AC | 1975 ms | 7368 KiB |
| test_0230.txt | AC | 1981 ms | 9600 KiB |
| test_0231.txt | AC | 1969 ms | 7004 KiB |
| test_0232.txt | AC | 1989 ms | 10880 KiB |
| test_0233.txt | AC | 1982 ms | 9320 KiB |
| test_0234.txt | AC | 1970 ms | 7300 KiB |
| test_0235.txt | AC | 1976 ms | 7984 KiB |
| test_0236.txt | AC | 1989 ms | 10960 KiB |
| test_0237.txt | AC | 1972 ms | 8108 KiB |
| test_0238.txt | AC | 1974 ms | 7276 KiB |
| test_0239.txt | AC | 1979 ms | 8884 KiB |
| test_0240.txt | AC | 1968 ms | 7056 KiB |
| test_0241.txt | AC | 1987 ms | 10352 KiB |
| test_0242.txt | AC | 1981 ms | 9544 KiB |
| test_0243.txt | AC | 1980 ms | 8944 KiB |
| test_0244.txt | AC | 1983 ms | 9732 KiB |
| test_0245.txt | AC | 1983 ms | 9252 KiB |
| test_0246.txt | AC | 1981 ms | 9612 KiB |
| test_0247.txt | AC | 1981 ms | 8712 KiB |
| test_0248.txt | AC | 1982 ms | 8800 KiB |
| test_0249.txt | AC | 1972 ms | 7492 KiB |
| test_0250.txt | AC | 1983 ms | 9524 KiB |
| test_0251.txt | AC | 1983 ms | 9508 KiB |
| test_0252.txt | AC | 1974 ms | 8376 KiB |
| test_0253.txt | AC | 1984 ms | 9640 KiB |
| test_0254.txt | AC | 1988 ms | 10580 KiB |
| test_0255.txt | AC | 1978 ms | 8936 KiB |
| test_0256.txt | AC | 1970 ms | 7088 KiB |
| test_0257.txt | AC | 1985 ms | 10088 KiB |
| test_0258.txt | AC | 1984 ms | 10420 KiB |
| test_0259.txt | AC | 1981 ms | 9352 KiB |
| test_0260.txt | AC | 1979 ms | 8912 KiB |
| test_0261.txt | AC | 1983 ms | 8988 KiB |
| test_0262.txt | AC | 1976 ms | 7656 KiB |
| test_0263.txt | AC | 1985 ms | 9116 KiB |
| test_0264.txt | AC | 1988 ms | 10884 KiB |
| test_0265.txt | AC | 1987 ms | 10512 KiB |
| test_0266.txt | AC | 1985 ms | 10888 KiB |
| test_0267.txt | AC | 1974 ms | 7664 KiB |
| test_0268.txt | AC | 1974 ms | 8396 KiB |
| test_0269.txt | AC | 1981 ms | 9392 KiB |
| test_0270.txt | AC | 1985 ms | 10028 KiB |
| test_0271.txt | AC | 1973 ms | 8344 KiB |
| test_0272.txt | AC | 1969 ms | 6312 KiB |
| test_0273.txt | AC | 1989 ms | 10444 KiB |
| test_0274.txt | AC | 1982 ms | 8900 KiB |
| test_0275.txt | AC | 1976 ms | 7784 KiB |
| test_0276.txt | AC | 1982 ms | 10052 KiB |
| test_0277.txt | AC | 1984 ms | 10052 KiB |
| test_0278.txt | AC | 1987 ms | 10028 KiB |
| test_0279.txt | AC | 1983 ms | 10548 KiB |
| test_0280.txt | AC | 1985 ms | 9244 KiB |
| test_0281.txt | AC | 1981 ms | 9208 KiB |
| test_0282.txt | AC | 1978 ms | 8124 KiB |
| test_0283.txt | AC | 1985 ms | 10556 KiB |
| test_0284.txt | AC | 1973 ms | 7608 KiB |
| test_0285.txt | AC | 1988 ms | 10860 KiB |
| test_0286.txt | AC | 1979 ms | 8996 KiB |
| test_0287.txt | AC | 1970 ms | 6968 KiB |
| test_0288.txt | AC | 1974 ms | 7756 KiB |
| test_0289.txt | AC | 1968 ms | 6728 KiB |
| test_0290.txt | AC | 1973 ms | 7248 KiB |
| test_0291.txt | AC | 1979 ms | 8816 KiB |
| test_0292.txt | AC | 1973 ms | 7672 KiB |
| test_0293.txt | AC | 1979 ms | 9224 KiB |
| test_0294.txt | AC | 1971 ms | 7204 KiB |
| test_0295.txt | AC | 1971 ms | 7448 KiB |
| test_0296.txt | AC | 1990 ms | 11340 KiB |
| test_0297.txt | AC | 1980 ms | 9644 KiB |
| test_0298.txt | AC | 1989 ms | 10936 KiB |
| test_0299.txt | AC | 1983 ms | 9672 KiB |