Submission #42195967


Source Code Expand

#![allow(non_snake_case)]

use itertools::Itertools;
use proconio::{input, marker::Usize1};
use rustc_hash::FxHashMap;
use std::{cmp::Reverse, collections::BinaryHeap, time::Instant};

use rand::Rng;

const CLIMBING_TEMPERETURE: f64 = 0.;
const RNG_SEED: u128 = 20;

const N: usize = 100;
const INF: usize = 1 << 60;
#[allow(dead_code)]
const TIME_LIMIT: f64 = 1.9;

fn main() {
    let timer = TimeKeeper::new(TIME_LIMIT);
    let input = Input::from_stdin();
    let solution = solve(&input, &timer);
    println!("{}", solution);
    eprintln!("time: {:.3}[s]", timer.instant.elapsed().as_secs_f64());
}

fn choose_powers(
    input: &Input,
    state: &mut State,
    dists_from_house_to_station: &Vec<Vec<usize>>,
    dists: &Vec<Vec<usize>>,
    path: &Vec<Vec<Vec<usize>>>,
) {
    let mut power_heap = BinaryHeap::new();

    state.clear();

    for h in 0..input.K {
        let mut min_dist = INF;
        let mut min_station = 0;
        for s in 0..N {
            if !state.use_station[s] {
                continue;
            }
            if dists_from_house_to_station[h][s] < min_dist {
                min_dist = dists_from_house_to_station[h][s];
                min_station = s;
            }
        }
        power_heap.push((min_dist, min_station, h));
    }

    while let Some((dist, station, house)) = power_heap.pop() {
        if state.coverd[house] {
            continue;
        }
        for house in 0..input.K {
            if dists_from_house_to_station[house][station] <= dist {
                state.coverd[house] = true;
            }
        }
        state.powers[station] = dist;
    }

    let mut used = vec![false; N];
    used[0] = true;
    for i in 0..N {
        if state.powers[i] > 0 {
            used[i] = true;
        }
    }

    let edge_used = spaning_tree(&input, &used, &dists, &path);
    for i in 0..input.M {
        state.switches[i] = edge_used[i];
    }
    state.use_station = used;

    state.compute_score(&input);
}

fn solve(input: &Input, timer: &TimeKeeper) -> State {
    let mut state = State::new(&input);
    let (dists, path) = warshall_floyd(&input.graph);

    let dists_from_house_to_station = dist_house_to_station(&input);
    for i in 0..N {
        state.use_station[i] = true;
    }

    eprintln!("time: {:.3}[s]", timer.instant.elapsed().as_secs_f64());

    choose_powers(
        input,
        &mut state,
        &dists_from_house_to_station,
        &dists,
        &path,
    );

    let temperature_scheduler = ClimbingTemperatureSchedule {};

    simulated_annealing(
        &mut state,
        &timer,
        &temperature_scheduler,
        &input,
        &dists_from_house_to_station,
        &dists,
        &path,
    );

    eprintln!("score: {}", state.score);
    state
}

fn spaning_tree(
    input: &Input,
    used: &Vec<bool>,
    dists: &Vec<Vec<usize>>,
    path: &Vec<Vec<Vec<usize>>>,
) -> Vec<bool> {
    let mut uf = UnionFind::new(N);
    let mut edges_heap = BinaryHeap::new();
    let mut edge_used = vec![false; input.M];
    for i in 0..N {
        if !used[i] {
            continue;
        }
        for j in i + 1..N {
            if !used[j] {
                continue;
            }

            let mut edge_ids = vec![];
            for k in 0..path[i][j].len() - 1 {
                let from = path[i][j][k];
                let to = path[i][j][k + 1];
                let edge_id = input.edge_dicts[&(from, to)];
                edge_ids.push(edge_id);
            }

            edges_heap.push(Reverse((dists[i][j], edge_ids, path[i][j].clone())));
        }
    }

    while let Some(Reverse((_cost, edge_ids, path))) = edges_heap.pop() {
        let from = path[0];
        let to = path[path.len() - 1];
        if uf.is_same(from, to) {
            continue;
        } else {
            uf.unite(from, to);
            for edge_id in edge_ids {
                edge_used[edge_id] = true;
            }
        }
    }
    edge_used
}

fn dist_house_to_station(input: &Input) -> Vec<Vec<usize>> {
    let stations = &input.stations;
    let houses = &input.houses;
    let mut dists = vec![vec![INF; N]; input.K];
    for s in 0..N {
        for h in 0..input.K {
            dists[h][s] = stations[s].dist_ceil(&houses[h]);
            // dists[h][s] = stations[s].dist(&houses[h]);
        }
    }
    dists
}

// ワーシャルフロイド法(経路復元有り)
#[allow(dead_code)]
fn warshall_floyd(graph: &Vec<Vec<Edge>>) -> (Vec<Vec<usize>>, Vec<Vec<Vec<usize>>>) {
    let mut dist = vec![vec![INF; N]; N];
    // どの頂点を経由してiからjに行くかを表す
    let mut prev = vec![vec![INF; N]; N];
    for i in 0..N {
        dist[i][i] = 0;
    }
    for i in 0..N {
        for edge in graph[i].iter() {
            dist[edge.from][edge.to] = edge.cost;
            prev[edge.from][edge.to] = edge.from;
        }
    }
    for k in 0..N {
        for i in 0..N {
            for j in 0..N {
                if dist[i][j] > dist[i][k] + dist[k][j] {
                    dist[i][j] = dist[i][k] + dist[k][j];
                    prev[i][j] = prev[k][j];
                }
            }
        }
    }

    let mut path = vec![vec![vec![]; N]; N];
    for i in 0..N {
        for j in 0..N {
            path[i][j] = restore_path(&prev, i, j);
        }
    }

    (dist, path)
}

// prevをもとに経路復元
#[allow(dead_code)]
fn restore_path(prev: &Vec<Vec<usize>>, s: usize, t: usize) -> Vec<usize> {
    let mut path = vec![];
    let mut cur = t;
    while cur != s {
        path.push(cur);
        cur = prev[s][cur];
    }
    path.push(s);
    path.reverse();
    path
}

#[derive(Debug, Clone)]
struct Point {
    x: isize,
    y: isize,
}

impl Point {
    fn new(x: isize, y: isize) -> Self {
        Self { x, y }
    }

    #[allow(dead_code)]
    fn dist(&self, other: &Self) -> usize {
        let dx = self.x - other.x;
        let dy = self.y - other.y;
        ((dx * dx + dy * dy) as f64).sqrt().round() as usize
    }
    // Pのほうはroundではだめ?
    fn dist_ceil(&self, other: &Self) -> usize {
        let dx = self.x - other.x;
        let dy = self.y - other.y;
        ((dx * dx + dy * dy) as f64).sqrt().ceil() as usize
    }
}

#[derive(Debug, Clone)]
struct Edge {
    from: usize,
    to: usize,
    cost: usize,
}

impl Edge {
    fn new(from: usize, to: usize, cost: usize) -> Self {
        Self { from, to, cost }
    }
}

#[derive(Debug, Clone)]
#[allow(dead_code)]
struct Input {
    M: usize,
    K: usize,
    stations: Vec<Point>,
    UVW: Vec<(usize, usize, usize)>,
    edges: Vec<Edge>,
    houses: Vec<Point>,
    graph: Vec<Vec<Edge>>,
    edge_dicts: FxHashMap<(usize, usize), usize>,
}

impl Input {
    fn from_stdin() -> Self {
        input! {
            _N: usize,
            M: usize,
            K: usize,
            XY_: [(isize, isize); N],
            UVW: [(Usize1, Usize1, usize); M],
            AB_: [(isize, isize); K],
        }

        let stations = XY_.into_iter().map(|(x, y)| Point::new(x, y)).collect();
        let houses = AB_.into_iter().map(|(x, y)| Point::new(x, y)).collect();
        let edges: Vec<Edge> = UVW
            .clone()
            .into_iter()
            .map(|(u, v, w)| Edge::new(u, v, w))
            .collect();

        let mut graph = vec![vec![]; N];
        for &(u, v, cost) in UVW.iter() {
            graph[u].push(Edge::new(u, v, cost));
            graph[v].push(Edge::new(v, u, cost));
        }

        let mut edge_dicts = FxHashMap::default();
        for (i, e) in edges.iter().enumerate() {
            edge_dicts.entry((e.from, e.to)).or_insert(i);
            edge_dicts.entry((e.to, e.from)).or_insert(i);
        }

        Self {
            M,
            K,
            stations,
            UVW,
            edges,
            houses,
            graph,
            edge_dicts,
        }
    }
}

/// 時間計測を行うstruct
#[derive(Debug, Clone)]
struct TimeKeeper {
    instant: Instant,
    time_limit: f64,
}

impl TimeKeeper {
    fn new(time_limit: f64) -> Self {
        Self {
            instant: Instant::now(),
            time_limit,
        }
    }

    fn intime(&self) -> bool {
        self.instant.elapsed().as_secs_f64() < self.time_limit
    }
}

/// 最大化問題としたときの確率(最小化のときはマイナスしとけばよい?)
#[inline]
fn probability(new_score: usize, old_score: usize, temperature: f64) -> f64 {
    if temperature == CLIMBING_TEMPERETURE {
        0.
    } else {
        f64::exp((new_score as f64 - old_score as f64) / temperature)
    }
}

/// 温度管理トレイト
trait TemperatureScheduler {
    fn get_temperature(&self, timekeeper: &TimeKeeper) -> f64;
}

/// 指数スケジューリング
#[derive(Debug, Clone)]
struct ExponentialTemperatureSchedule {
    initial_temperature: f64,
    end_temperature: f64,
}

impl ExponentialTemperatureSchedule {
    fn new(initial_temperature: f64, end_temperature: f64) -> Self {
        Self {
            initial_temperature,
            end_temperature,
        }
    }
}

impl TemperatureScheduler for ExponentialTemperatureSchedule {
    fn get_temperature(&self, timekeeper: &TimeKeeper) -> f64 {
        let t = timekeeper.instant.elapsed().as_secs_f64() / timekeeper.time_limit;
        self.initial_temperature.powf(1.0 - t) * self.end_temperature.powf(t)
    }
}

/// 山登り用温度管理
struct ClimbingTemperatureSchedule {}

impl TemperatureScheduler for ClimbingTemperatureSchedule {
    fn get_temperature(&self, _: &TimeKeeper) -> f64 {
        CLIMBING_TEMPERETURE
    }
}

trait AnnealingState {
    fn get_score(&self) -> usize;
    fn rollback(&mut self, diff: &DiffState);
}

#[derive(Debug, Clone)]
struct State {
    score: usize,
    powers: Vec<usize>,
    switches: Vec<bool>,
    coverd: Vec<bool>,
    use_station: Vec<bool>,
}

impl State {
    fn new(input: &Input) -> Self {
        Self {
            score: 0,
            powers: vec![0; N],
            switches: vec![false; input.M],
            coverd: vec![false; input.K],
            use_station: vec![false; N],
        }
    }

    fn clear(&mut self) {
        self.score = 0;
        self.powers = vec![0; N];
        self.switches = vec![false; self.switches.len()];
        self.coverd = vec![false; self.coverd.len()];
    }

    fn compute_score(&mut self, input: &Input) {
        if self.coverd.iter().all(|x| *x) {
            let mut S = 0;
            for &p in self.powers.iter() {
                if p > 5000 {
                    self.score = 0;
                    return;
                }
                S += p * p;
            }
            for i in 0..input.M {
                if self.switches[i] {
                    S += input.edges[i].cost;
                }
            }
            self.score =
                (1_000_000. * (1. + 100_000_000. / (S as f64 + 10_000_000.))).round() as usize;
        } else {
            let mut n = 0;
            for &c in self.coverd.iter() {
                if c {
                    n += 1;
                }
            }
            self.score = (1_000_000. * ((1. + n as f64) / input.K as f64)).round() as usize;
        }
    }
}

impl AnnealingState for State {
    #[inline]
    fn get_score(&self) -> usize {
        self.score
    }
    fn rollback(&mut self, diff: &DiffState) {
        *self = diff.state.clone();
    }
}

impl std::fmt::Display for State {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        writeln!(f, "{}", self.powers.iter().join(" "))?;
        write!(
            f,
            "{}",
            self.switches
                .iter()
                .map(|&b| if b { 1 } else { 0 })
                .join(" ")
        )
    }
}

struct DiffState {
    // TODO: その他復元に必要な情報を
    old_score: usize,
    state: State,
}

trait AnnealingTransition {
    fn transition(
        &self,
        state: &mut State,
        rng: &mut rand_pcg::Pcg64Mcg,
        input: &Input,
        dists_from_house_to_station: &Vec<Vec<usize>>,
        dists: &Vec<Vec<usize>>,
        path: &Vec<Vec<Vec<usize>>>,
    ) -> DiffState;
}

/// TODO: 名前変える。遷移毎に生成
struct OneRemoveTransition {}

impl AnnealingTransition for OneRemoveTransition {
    fn transition(
        &self,
        state: &mut State,
        rng: &mut rand_pcg::Pcg64Mcg,
        input: &Input,
        dists_from_house_to_station: &Vec<Vec<usize>>,
        dists: &Vec<Vec<usize>>,
        path: &Vec<Vec<Vec<usize>>>,
    ) -> DiffState {
        let old_score = state.get_score();
        let diff_state = DiffState {
            old_score,
            state: state.clone(),
        };
        let mut cand = vec![];
        for (i, used) in state.use_station.iter().enumerate() {
            if *used {
                cand.push(i);
            }
        }

        let remove_idx = cand[rng.gen_range(0, cand.len())];
        state.use_station[remove_idx] = false;

        choose_powers(&input, state, &dists_from_house_to_station, &dists, &path);

        state.compute_score(&input);
        diff_state
    }
}

struct AddAndRemoveTransition {}

impl AnnealingTransition for AddAndRemoveTransition {
    fn transition(
        &self,
        state: &mut State,
        rng: &mut rand_pcg::Pcg64Mcg,
        input: &Input,
        dists_from_house_to_station: &Vec<Vec<usize>>,
        dists: &Vec<Vec<usize>>,
        path: &Vec<Vec<Vec<usize>>>,
    ) -> DiffState {
        let old_score = state.get_score();
        let diff_state = DiffState {
            old_score,
            state: state.clone(),
        };
        let mut cand_remove = vec![];
        let mut cand_add = vec![];
        for (i, used) in state.use_station.iter().enumerate() {
            if *used {
                cand_remove.push(i);
            } else {
                cand_add.push(i);
            }
        }

        let remove_idx = cand_remove[rng.gen_range(0, cand_remove.len())];
        let add_idx = cand_add[rng.gen_range(0, cand_add.len())];
        state.use_station[remove_idx] = false;
        state.use_station[add_idx] = true;

        choose_powers(&input, state, &dists_from_house_to_station, &dists, &path);

        state.compute_score(&input);
        diff_state
    }
}

fn simulated_annealing<T: TemperatureScheduler>(
    state: &mut State,
    timekeeper: &TimeKeeper,
    temperature_scheduler: &T,
    input: &Input,
    dists_from_house_to_station: &Vec<Vec<usize>>,
    dists: &Vec<Vec<usize>>,
    path: &Vec<Vec<Vec<usize>>>,
) {
    let mut rng = rand_pcg::Pcg64Mcg::new(RNG_SEED);
    let mut best_state = state.clone();
    let mut temperature = temperature_scheduler.get_temperature(&timekeeper);
    let mut cnt = 0;
    let mut accepted_cnt = 0;
    let mut score_update_cnt = 0;
    let init_score = state.get_score();
    let update_per_cnt = 100;
    let neighbor_creater = OneRemoveTransition {};
    while timekeeper.intime() {
        cnt += 1;
        if cnt % update_per_cnt == 0 {
            temperature = temperature_scheduler.get_temperature(&timekeeper);
        }
        let old_score = state.get_score();
        let diff_state = neighbor_creater.transition(
            state,
            &mut rng,
            &input,
            &dists_from_house_to_station,
            &dists,
            &path,
        );
        let new_score = state.get_score();

        if new_score > old_score || rng.gen_bool(probability(new_score, old_score, temperature)) {
            if new_score > old_score {
                best_state = state.clone();
                score_update_cnt += 1;
            }
            accepted_cnt += 1
        } else {
            state.rollback(&diff_state);
        }
    }
    *state = best_state;
    eprintln!("-----------start Simulated Annealing--------------");
    eprintln!(
        "accepted / iter: {}/{}, {}%",
        accepted_cnt,
        cnt,
        (accepted_cnt * 100) as f64 / cnt as f64
    );
    eprintln!(
        "score update / iter: {}/{}, {}%",
        score_update_cnt,
        cnt,
        (score_update_cnt * 100) as f64 / cnt as f64
    );
    eprintln!("init score: {}", init_score);
    eprintln!("final score: {}", state.get_score());
    eprintln!("-----------end Simulated Annealing--------------");
}

#[derive(Debug, Clone)]
pub struct UnionFind {
    parent_or_size: Vec<i64>,
}

impl UnionFind {
    pub fn new(n: usize) -> Self {
        let parent_or_size = vec![-1; n];
        Self { parent_or_size }
    }

    pub fn root(&mut self, x: usize) -> usize {
        if self.parent_or_size[x] < 0 {
            x
        } else {
            self.parent_or_size[x] = self.root(self.parent_or_size[x] as usize) as i64;
            self.parent_or_size[x] as usize
        }
    }

    pub fn is_same(&mut self, x: usize, y: usize) -> bool {
        self.root(x) == self.root(y)
    }

    pub fn size(&mut self, x: usize) -> usize {
        let x = self.root(x);
        (-self.parent_or_size[x]) as usize
    }

    pub fn unite(&mut self, x: usize, y: usize) {
        let x = self.root(x);
        let y = self.root(y);
        if x == y {
            return;
        }
        // 大きい木の根に小さい木をくっつける
        if self.size(x) < self.size(y) {
            self.parent_or_size[y] += self.parent_or_size[x];
            self.parent_or_size[x] = y as i64;
        } else {
            self.parent_or_size[x] += self.parent_or_size[y];
            self.parent_or_size[y] = x as i64;
        }
    }
}

Submission Info

Submission Time
Task A - Broadcasting
User poka
Language Rust (1.42.0)
Score 486037099
Code Size 18237 Byte
Status AC
Exec Time 1907 ms
Memory 9144 KiB

Compile Error

warning: method is never used: `new`
   --> src/main.rs:362:5
    |
362 |     fn new(initial_temperature: f64, end_temperature: f64) -> Self {
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = note: `#[warn(dead_code)]` on by default

warning: field is never read: `old_score`
   --> src/main.rs:473:5
    |
473 |     old_score: usize,
    |     ^^^^^^^^^^^^^^^^

Judge Result

Set Name test_ALL
Score / Max Score 486037099 / 3300000000
Status
AC × 300
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 1907 ms 7296 KiB
test_0001.txt AC 1903 ms 8552 KiB
test_0002.txt AC 1902 ms 6436 KiB
test_0003.txt AC 1903 ms 8504 KiB
test_0004.txt AC 1903 ms 9144 KiB
test_0005.txt AC 1903 ms 8236 KiB
test_0006.txt AC 1902 ms 6188 KiB
test_0007.txt AC 1903 ms 8244 KiB
test_0008.txt AC 1902 ms 7808 KiB
test_0009.txt AC 1903 ms 8304 KiB
test_0010.txt AC 1902 ms 7680 KiB
test_0011.txt AC 1903 ms 8900 KiB
test_0012.txt AC 1902 ms 7092 KiB
test_0013.txt AC 1903 ms 6956 KiB
test_0014.txt AC 1903 ms 7828 KiB
test_0015.txt AC 1902 ms 6552 KiB
test_0016.txt AC 1903 ms 6760 KiB
test_0017.txt AC 1902 ms 6564 KiB
test_0018.txt AC 1903 ms 7968 KiB
test_0019.txt AC 1903 ms 7204 KiB
test_0020.txt AC 1903 ms 7468 KiB
test_0021.txt AC 1902 ms 6340 KiB
test_0022.txt AC 1903 ms 6704 KiB
test_0023.txt AC 1903 ms 8464 KiB
test_0024.txt AC 1903 ms 8720 KiB
test_0025.txt AC 1903 ms 8596 KiB
test_0026.txt AC 1903 ms 7856 KiB
test_0027.txt AC 1903 ms 6640 KiB
test_0028.txt AC 1903 ms 8724 KiB
test_0029.txt AC 1903 ms 6604 KiB
test_0030.txt AC 1903 ms 6904 KiB
test_0031.txt AC 1903 ms 7136 KiB
test_0032.txt AC 1902 ms 8184 KiB
test_0033.txt AC 1903 ms 8320 KiB
test_0034.txt AC 1902 ms 6192 KiB
test_0035.txt AC 1902 ms 6564 KiB
test_0036.txt AC 1902 ms 6552 KiB
test_0037.txt AC 1902 ms 6660 KiB
test_0038.txt AC 1903 ms 8316 KiB
test_0039.txt AC 1902 ms 6440 KiB
test_0040.txt AC 1902 ms 6328 KiB
test_0041.txt AC 1902 ms 6476 KiB
test_0042.txt AC 1902 ms 8744 KiB
test_0043.txt AC 1903 ms 7424 KiB
test_0044.txt AC 1903 ms 6996 KiB
test_0045.txt AC 1903 ms 8300 KiB
test_0046.txt AC 1903 ms 7244 KiB
test_0047.txt AC 1902 ms 7036 KiB
test_0048.txt AC 1903 ms 7980 KiB
test_0049.txt AC 1903 ms 8204 KiB
test_0050.txt AC 1902 ms 7428 KiB
test_0051.txt AC 1903 ms 6760 KiB
test_0052.txt AC 1903 ms 7476 KiB
test_0053.txt AC 1903 ms 8056 KiB
test_0054.txt AC 1903 ms 7652 KiB
test_0055.txt AC 1903 ms 7936 KiB
test_0056.txt AC 1903 ms 6896 KiB
test_0057.txt AC 1902 ms 6808 KiB
test_0058.txt AC 1903 ms 8328 KiB
test_0059.txt AC 1902 ms 8640 KiB
test_0060.txt AC 1902 ms 8296 KiB
test_0061.txt AC 1902 ms 6540 KiB
test_0062.txt AC 1902 ms 7132 KiB
test_0063.txt AC 1902 ms 8376 KiB
test_0064.txt AC 1903 ms 7392 KiB
test_0065.txt AC 1902 ms 7420 KiB
test_0066.txt AC 1903 ms 6712 KiB
test_0067.txt AC 1903 ms 7172 KiB
test_0068.txt AC 1903 ms 7352 KiB
test_0069.txt AC 1903 ms 7492 KiB
test_0070.txt AC 1903 ms 8432 KiB
test_0071.txt AC 1902 ms 6732 KiB
test_0072.txt AC 1903 ms 8360 KiB
test_0073.txt AC 1903 ms 7548 KiB
test_0074.txt AC 1902 ms 7888 KiB
test_0075.txt AC 1903 ms 8016 KiB
test_0076.txt AC 1903 ms 6860 KiB
test_0077.txt AC 1903 ms 6368 KiB
test_0078.txt AC 1902 ms 6496 KiB
test_0079.txt AC 1903 ms 7576 KiB
test_0080.txt AC 1903 ms 8208 KiB
test_0081.txt AC 1903 ms 6660 KiB
test_0082.txt AC 1902 ms 7560 KiB
test_0083.txt AC 1903 ms 8272 KiB
test_0084.txt AC 1902 ms 8408 KiB
test_0085.txt AC 1903 ms 8308 KiB
test_0086.txt AC 1903 ms 7764 KiB
test_0087.txt AC 1902 ms 7000 KiB
test_0088.txt AC 1903 ms 8716 KiB
test_0089.txt AC 1903 ms 6452 KiB
test_0090.txt AC 1902 ms 6932 KiB
test_0091.txt AC 1902 ms 6888 KiB
test_0092.txt AC 1903 ms 7572 KiB
test_0093.txt AC 1902 ms 7212 KiB
test_0094.txt AC 1903 ms 6328 KiB
test_0095.txt AC 1902 ms 6108 KiB
test_0096.txt AC 1902 ms 6672 KiB
test_0097.txt AC 1903 ms 8876 KiB
test_0098.txt AC 1902 ms 6260 KiB
test_0099.txt AC 1903 ms 8788 KiB
test_0100.txt AC 1902 ms 6360 KiB
test_0101.txt AC 1903 ms 7240 KiB
test_0102.txt AC 1903 ms 7048 KiB
test_0103.txt AC 1903 ms 8064 KiB
test_0104.txt AC 1903 ms 8900 KiB
test_0105.txt AC 1902 ms 6544 KiB
test_0106.txt AC 1903 ms 6712 KiB
test_0107.txt AC 1903 ms 8580 KiB
test_0108.txt AC 1903 ms 8632 KiB
test_0109.txt AC 1903 ms 8004 KiB
test_0110.txt AC 1903 ms 8084 KiB
test_0111.txt AC 1903 ms 8176 KiB
test_0112.txt AC 1902 ms 6396 KiB
test_0113.txt AC 1902 ms 8792 KiB
test_0114.txt AC 1903 ms 9000 KiB
test_0115.txt AC 1903 ms 8192 KiB
test_0116.txt AC 1902 ms 8392 KiB
test_0117.txt AC 1902 ms 6300 KiB
test_0118.txt AC 1903 ms 6340 KiB
test_0119.txt AC 1902 ms 7592 KiB
test_0120.txt AC 1903 ms 8476 KiB
test_0121.txt AC 1903 ms 8344 KiB
test_0122.txt AC 1902 ms 8960 KiB
test_0123.txt AC 1902 ms 6700 KiB
test_0124.txt AC 1903 ms 6876 KiB
test_0125.txt AC 1903 ms 7816 KiB
test_0126.txt AC 1903 ms 7752 KiB
test_0127.txt AC 1902 ms 7364 KiB
test_0128.txt AC 1903 ms 6668 KiB
test_0129.txt AC 1903 ms 7452 KiB
test_0130.txt AC 1903 ms 7788 KiB
test_0131.txt AC 1902 ms 8044 KiB
test_0132.txt AC 1903 ms 6812 KiB
test_0133.txt AC 1903 ms 6800 KiB
test_0134.txt AC 1903 ms 6656 KiB
test_0135.txt AC 1903 ms 6436 KiB
test_0136.txt AC 1903 ms 7092 KiB
test_0137.txt AC 1903 ms 7372 KiB
test_0138.txt AC 1903 ms 8288 KiB
test_0139.txt AC 1903 ms 6440 KiB
test_0140.txt AC 1903 ms 8080 KiB
test_0141.txt AC 1902 ms 7324 KiB
test_0142.txt AC 1903 ms 7828 KiB
test_0143.txt AC 1902 ms 8136 KiB
test_0144.txt AC 1903 ms 8700 KiB
test_0145.txt AC 1903 ms 6852 KiB
test_0146.txt AC 1903 ms 7636 KiB
test_0147.txt AC 1903 ms 7012 KiB
test_0148.txt AC 1903 ms 7428 KiB
test_0149.txt AC 1902 ms 7436 KiB
test_0150.txt AC 1903 ms 8268 KiB
test_0151.txt AC 1904 ms 8600 KiB
test_0152.txt AC 1904 ms 8656 KiB
test_0153.txt AC 1903 ms 7856 KiB
test_0154.txt AC 1903 ms 6476 KiB
test_0155.txt AC 1903 ms 8728 KiB
test_0156.txt AC 1903 ms 8480 KiB
test_0157.txt AC 1903 ms 7304 KiB
test_0158.txt AC 1903 ms 8548 KiB
test_0159.txt AC 1903 ms 7204 KiB
test_0160.txt AC 1903 ms 8404 KiB
test_0161.txt AC 1902 ms 6876 KiB
test_0162.txt AC 1902 ms 7024 KiB
test_0163.txt AC 1903 ms 8320 KiB
test_0164.txt AC 1903 ms 8944 KiB
test_0165.txt AC 1903 ms 7684 KiB
test_0166.txt AC 1903 ms 7336 KiB
test_0167.txt AC 1903 ms 7760 KiB
test_0168.txt AC 1903 ms 8280 KiB
test_0169.txt AC 1903 ms 9040 KiB
test_0170.txt AC 1903 ms 7480 KiB
test_0171.txt AC 1903 ms 8908 KiB
test_0172.txt AC 1903 ms 8568 KiB
test_0173.txt AC 1903 ms 8384 KiB
test_0174.txt AC 1902 ms 6152 KiB
test_0175.txt AC 1903 ms 6572 KiB
test_0176.txt AC 1903 ms 7844 KiB
test_0177.txt AC 1902 ms 7448 KiB
test_0178.txt AC 1903 ms 8164 KiB
test_0179.txt AC 1902 ms 6912 KiB
test_0180.txt AC 1903 ms 6916 KiB
test_0181.txt AC 1903 ms 8564 KiB
test_0182.txt AC 1902 ms 8128 KiB
test_0183.txt AC 1903 ms 7728 KiB
test_0184.txt AC 1903 ms 6912 KiB
test_0185.txt AC 1903 ms 7496 KiB
test_0186.txt AC 1903 ms 8984 KiB
test_0187.txt AC 1902 ms 6512 KiB
test_0188.txt AC 1903 ms 7428 KiB
test_0189.txt AC 1903 ms 8512 KiB
test_0190.txt AC 1903 ms 8204 KiB
test_0191.txt AC 1902 ms 6408 KiB
test_0192.txt AC 1902 ms 6396 KiB
test_0193.txt AC 1903 ms 8680 KiB
test_0194.txt AC 1903 ms 6404 KiB
test_0195.txt AC 1903 ms 7112 KiB
test_0196.txt AC 1902 ms 7852 KiB
test_0197.txt AC 1902 ms 7216 KiB
test_0198.txt AC 1903 ms 6972 KiB
test_0199.txt AC 1903 ms 7220 KiB
test_0200.txt AC 1903 ms 7648 KiB
test_0201.txt AC 1902 ms 6908 KiB
test_0202.txt AC 1902 ms 6636 KiB
test_0203.txt AC 1902 ms 6596 KiB
test_0204.txt AC 1902 ms 6776 KiB
test_0205.txt AC 1903 ms 8760 KiB
test_0206.txt AC 1902 ms 6868 KiB
test_0207.txt AC 1903 ms 8196 KiB
test_0208.txt AC 1903 ms 6720 KiB
test_0209.txt AC 1903 ms 7560 KiB
test_0210.txt AC 1903 ms 8844 KiB
test_0211.txt AC 1902 ms 6492 KiB
test_0212.txt AC 1903 ms 7764 KiB
test_0213.txt AC 1903 ms 8768 KiB
test_0214.txt AC 1903 ms 8260 KiB
test_0215.txt AC 1903 ms 8700 KiB
test_0216.txt AC 1903 ms 8372 KiB
test_0217.txt AC 1903 ms 7624 KiB
test_0218.txt AC 1903 ms 7024 KiB
test_0219.txt AC 1903 ms 8568 KiB
test_0220.txt AC 1903 ms 6624 KiB
test_0221.txt AC 1902 ms 6260 KiB
test_0222.txt AC 1903 ms 7084 KiB
test_0223.txt AC 1903 ms 8488 KiB
test_0224.txt AC 1903 ms 7608 KiB
test_0225.txt AC 1902 ms 7244 KiB
test_0226.txt AC 1903 ms 8880 KiB
test_0227.txt AC 1902 ms 6412 KiB
test_0228.txt AC 1902 ms 6696 KiB
test_0229.txt AC 1902 ms 6608 KiB
test_0230.txt AC 1902 ms 7852 KiB
test_0231.txt AC 1902 ms 6308 KiB
test_0232.txt AC 1903 ms 8596 KiB
test_0233.txt AC 1903 ms 7940 KiB
test_0234.txt AC 1903 ms 6456 KiB
test_0235.txt AC 1903 ms 6708 KiB
test_0236.txt AC 1906 ms 8728 KiB
test_0237.txt AC 1903 ms 6956 KiB
test_0238.txt AC 1902 ms 6480 KiB
test_0239.txt AC 1903 ms 7716 KiB
test_0240.txt AC 1902 ms 6432 KiB
test_0241.txt AC 1903 ms 8500 KiB
test_0242.txt AC 1903 ms 7816 KiB
test_0243.txt AC 1903 ms 7980 KiB
test_0244.txt AC 1903 ms 8200 KiB
test_0245.txt AC 1903 ms 7884 KiB
test_0246.txt AC 1903 ms 7988 KiB
test_0247.txt AC 1902 ms 7536 KiB
test_0248.txt AC 1903 ms 7872 KiB
test_0249.txt AC 1903 ms 6996 KiB
test_0250.txt AC 1903 ms 8196 KiB
test_0251.txt AC 1902 ms 7700 KiB
test_0252.txt AC 1903 ms 7232 KiB
test_0253.txt AC 1903 ms 8172 KiB
test_0254.txt AC 1902 ms 8892 KiB
test_0255.txt AC 1903 ms 7448 KiB
test_0256.txt AC 1903 ms 6380 KiB
test_0257.txt AC 1903 ms 8288 KiB
test_0258.txt AC 1903 ms 8304 KiB
test_0259.txt AC 1903 ms 7500 KiB
test_0260.txt AC 1902 ms 7628 KiB
test_0261.txt AC 1903 ms 8040 KiB
test_0262.txt AC 1902 ms 6816 KiB
test_0263.txt AC 1902 ms 7360 KiB
test_0264.txt AC 1902 ms 8500 KiB
test_0265.txt AC 1903 ms 8648 KiB
test_0266.txt AC 1903 ms 8780 KiB
test_0267.txt AC 1903 ms 6584 KiB
test_0268.txt AC 1902 ms 7004 KiB
test_0269.txt AC 1903 ms 7696 KiB
test_0270.txt AC 1903 ms 8380 KiB
test_0271.txt AC 1903 ms 7032 KiB
test_0272.txt AC 1902 ms 6196 KiB
test_0273.txt AC 1903 ms 8424 KiB
test_0274.txt AC 1903 ms 7432 KiB
test_0275.txt AC 1902 ms 6488 KiB
test_0276.txt AC 1903 ms 7984 KiB
test_0277.txt AC 1903 ms 8192 KiB
test_0278.txt AC 1903 ms 8040 KiB
test_0279.txt AC 1902 ms 8800 KiB
test_0280.txt AC 1903 ms 7732 KiB
test_0281.txt AC 1902 ms 7528 KiB
test_0282.txt AC 1902 ms 7112 KiB
test_0283.txt AC 1904 ms 8540 KiB
test_0284.txt AC 1903 ms 7024 KiB
test_0285.txt AC 1903 ms 8824 KiB
test_0286.txt AC 1903 ms 7572 KiB
test_0287.txt AC 1903 ms 6348 KiB
test_0288.txt AC 1902 ms 6916 KiB
test_0289.txt AC 1903 ms 6684 KiB
test_0290.txt AC 1903 ms 6440 KiB
test_0291.txt AC 1903 ms 7288 KiB
test_0292.txt AC 1903 ms 6924 KiB
test_0293.txt AC 1903 ms 7948 KiB
test_0294.txt AC 1903 ms 6552 KiB
test_0295.txt AC 1903 ms 6576 KiB
test_0296.txt AC 1903 ms 8976 KiB
test_0297.txt AC 1903 ms 7972 KiB
test_0298.txt AC 1903 ms 8916 KiB
test_0299.txt AC 1903 ms 8048 KiB