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
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 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