Submission #72330934


Source Code Expand

use std::io::{self, BufRead};
use std::time::Instant;

// Global constant N
const N: usize = 20;

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
struct Pos {
    r: usize,
    c: usize,
}

impl Pos {
    fn dist(&self, other: &Pos) -> i32 {
        (self.r as i32 - other.r as i32).abs() + (self.c as i32 - other.c as i32).abs()
    }
}

// Weights for board positions: Center -> Small, Edge -> Large
// Used in Phase 3
fn get_weight(p: Pos) -> i32 {
    let center = (N as f64 - 1.0) / 2.0;
    let dr = (p.r as f64 - center).abs();
    let dc = (p.c as f64 - center).abs();
    let max_dist = dr.max(dc);
    (max_dist * 100.0) as i32
}

struct Game {
    board: Vec<Vec<Option<usize>>>,
    stack: Vec<usize>,
    pos: Pos,
    moves: Vec<char>,
}

impl Game {
    fn new(board_input: Vec<Vec<usize>>) -> Self {
        let mut board = vec![vec![None; N]; N];
        for r in 0..N {
            for c in 0..N {
                board[r][c] = Some(board_input[r][c]);
            }
        }

        Game {
            board,
            stack: Vec::new(),
            pos: Pos { r: 0, c: 0 },
            moves: Vec::new(),
        }
    }

    // Operation 1: Move
    fn move_to_dir(&mut self, dir: char) {
        self.moves.push(dir);
        match dir {
            'U' => self.pos.r -= 1,
            'D' => self.pos.r += 1,
            'L' => self.pos.c -= 1,
            'R' => self.pos.c += 1,
            _ => panic!("Invalid move"),
        }
    }

    // Move to specific target coordinate (Basic Manhattan path)
    fn go_to(&mut self, target: Pos) {
        while self.pos != target {
            let dr = target.r as i32 - self.pos.r as i32;
            let dc = target.c as i32 - self.pos.c as i32;

            if dr < 0 { self.move_to_dir('U'); }
            else if dr > 0 { self.move_to_dir('D'); }
            else if dc < 0 { self.move_to_dir('L'); }
            else if dc > 0 { self.move_to_dir('R'); }
        }
    }

    // Operation 2: Pick (Z)
    fn pick(&mut self) {
        self.moves.push('Z');
        if let Some(val) = self.board[self.pos.r][self.pos.c] {
            self.board[self.pos.r][self.pos.c] = None;
            
            if let Some(&top) = self.stack.last() {
                if top == val {
                    self.stack.pop(); // Match!
                } else {
                    self.stack.push(val);
                }
            } else {
                self.stack.push(val);
            }
        }
    }

    // Operation 3: Place (X)
    fn place(&mut self) {
        // Can only place if stack is not empty and current pos is empty
        if self.stack.is_empty() { return; }
        if self.board[self.pos.r][self.pos.c].is_some() { return; }

        self.moves.push('X');
        let val = self.stack.pop().unwrap();
        self.board[self.pos.r][self.pos.c] = Some(val);
    }

    // Scan board for a specific value
    fn find_val_on_board(&self, val: usize) -> Option<Pos> {
        for r in 0..N {
            for c in 0..N {
                if self.board[r][c] == Some(val) {
                    return Some(Pos { r, c });
                }
            }
        }
        None
    }
    
    // Find pair logic for Greedy Phase (Phase 3)
    fn find_pair_on_board_exclude_current(&self, val: usize) -> Option<Pos> {
        for r in 0..N {
            for c in 0..N {
                if self.board[r][c] == Some(val) {
                     if r != self.pos.r || c != self.pos.c {
                        return Some(Pos { r, c });
                     }
                }
            }
        }
        None
    }

    // Phase 3 Helper: Max cards on path
    fn max_cards_on_path(&self, start: Pos, end: Pos) -> i32 {
        let dr = (end.r as i32 - start.r as i32).signum();
        let dc = (end.c as i32 - start.c as i32).signum();
        
        let rows = (start.r as i32 - end.r as i32).abs() as usize + 1;
        let cols = (start.c as i32 - end.c as i32).abs() as usize + 1;
        
        let mut dp = vec![vec![-1; cols]; rows];
        
        for i in 0..rows {
            for j in 0..cols {
                let r = (start.r as i32 + i as i32 * dr) as usize;
                let c = (start.c as i32 + j as i32 * dc) as usize;
                
                let has_card = if (r == start.r && c == start.c) { 0 } 
                               else if self.board[r][c].is_some() { 1 } 
                               else { 0 };
                
                let from_top = if i > 0 { dp[i-1][j] } else { -1 };
                let from_left = if j > 0 { dp[i][j-1] } else { -1 };
                
                if i == 0 && j == 0 {
                    dp[i][j] = 0;
                } else {
                    let prev = from_top.max(from_left);
                    if prev != -1 {
                        dp[i][j] = prev + has_card;
                    }
                }
            }
        }
        dp[rows-1][cols-1]
    }
}

// Xorshift random number generator
struct Xorshift {
    seed: u64,
}

impl Xorshift {
    fn new(seed: u64) -> Self {
        Self { seed }
    }
    
    fn next(&mut self) -> u64 {
        let mut x = self.seed;
        x ^= x << 13;
        x ^= x >> 7;
        x ^= x << 17;
        self.seed = x;
        x
    }
    
    // Generate random number in [start, end)
    fn gen_range(&mut self, start: usize, end: usize) -> usize {
        if start >= end { return start; }
        (self.next() as usize % (end - start)) + start
    }
}

// Run full simulation with given pick flags for the spiral phase
// Returns (move_count, output_string_moves)
fn run_simulation(input_grid: &Vec<Vec<usize>>, spiral_targets: &Vec<Pos>, pick_flags: &Vec<bool>) -> (usize, Vec<char>) {
    let mut game = Game::new(input_grid.clone());

    // ==========================================
    // Phase 1: Spiral Collection
    // Use flags to determine whether to pick or skip
    // ==========================================
    for (i, target) in spiral_targets.iter().enumerate() {
        game.go_to(*target);
        if game.board[game.pos.r][game.pos.c].is_some() {
            if pick_flags[i] {
                game.pick();
            }
        }
    }

    // ==========================================
    // Phase 2: Stack Unloading
    // Match if possible, otherwise place at optimal empty spot
    // ==========================================
    let center_r = (N as f64 - 1.0) / 2.0;
    let center_c = (N as f64 - 1.0) / 2.0;

    while !game.stack.is_empty() {
        let top_val = *game.stack.last().unwrap();
        
        if let Some(target) = game.find_val_on_board(top_val) {
            game.go_to(target);
            game.pick();
        } else {
            let mut best_spot: Option<Pos> = None;
            let mut min_travel_dist = i32::MAX;
            let mut min_center_dist = f64::MAX;

            for r in 0..N {
                for c in 0..N {
                    if game.board[r][c].is_none() {
                        let p = Pos { r, c };
                        let travel = game.pos.dist(&p);
                        let d_center = ((r as f64 - center_r).powi(2) + (c as f64 - center_c).powi(2)).sqrt();

                        if travel < min_travel_dist {
                            min_travel_dist = travel;
                            min_center_dist = d_center;
                            best_spot = Some(p);
                        } else if travel == min_travel_dist {
                            if d_center < min_center_dist {
                                min_center_dist = d_center;
                                best_spot = Some(p);
                            }
                        }
                    }
                }
            }

            if let Some(target) = best_spot {
                game.go_to(target);
                game.place();
            } else {
                break;
            }
        }
    }

    // ==========================================
    // Phase 3: Greedy Cleanup
    // ==========================================
    loop {
        let mut remaining = 0;
        for r in 0..N {
            for c in 0..N {
                if game.board[r][c].is_some() { remaining += 1; }
            }
        }
        if remaining == 0 && game.stack.is_empty() {
            break;
        }

        if game.stack.is_empty() {
            let mut best_target: Option<Pos> = None;
            let mut best_dist = i32::MAX;
            let mut best_weight = -1;

            for r in 0..N {
                for c in 0..N {
                    if game.board[r][c].is_some() {
                        let p = Pos { r, c };
                        let d = game.pos.dist(&p);
                        let w = get_weight(p);
                        
                        if d < best_dist {
                            best_dist = d;
                            best_weight = w;
                            best_target = Some(p);
                        } else if d == best_dist {
                            if w > best_weight {
                                best_weight = w;
                                best_target = Some(p);
                            }
                        }
                    }
                }
            }
            
            if let Some(target) = best_target {
                while game.pos != target {
                    let curr = game.pos;
                    let dr = target.r as i32 - curr.r as i32;
                    let dc = target.c as i32 - curr.c as i32;
                    
                    let mut moves = Vec::new();
                    if dr < 0 { moves.push(('U', Pos{r: curr.r-1, c: curr.c})); }
                    if dr > 0 { moves.push(('D', Pos{r: curr.r+1, c: curr.c})); }
                    if dc < 0 { moves.push(('L', Pos{r: curr.r, c: curr.c-1})); }
                    if dc > 0 { moves.push(('R', Pos{r: curr.r, c: curr.c+1})); }
                    
                    let mut best_move = moves[0];
                    let mut max_cards = -1;
                    
                    for m in moves {
                        let count = game.max_cards_on_path(m.1, target);
                        if count > max_cards {
                            max_cards = count;
                            best_move = m;
                        }
                    }
                    game.move_to_dir(best_move.0);
                }
                game.pick();
            }

        } else {
            let top_val = *game.stack.last().unwrap();
            
            loop {
                if game.stack.is_empty() || *game.stack.last().unwrap() != top_val {
                    break;
                }
                
                let target_opt = game.find_pair_on_board_exclude_current(top_val);
                
                if target_opt.is_none() { break; }
                let target = target_opt.unwrap();
                
                if game.pos == target {
                    game.pick();
                    break;
                }
                
                let curr = game.pos;
                let dr = target.r as i32 - curr.r as i32;
                let dc = target.c as i32 - curr.c as i32;
                
                let mut moves = Vec::new();
                if dr < 0 { moves.push(('U', Pos{r: curr.r-1, c: curr.c})); }
                if dr > 0 { moves.push(('D', Pos{r: curr.r+1, c: curr.c})); }
                if dc < 0 { moves.push(('L', Pos{r: curr.r, c: curr.c-1})); }
                if dc > 0 { moves.push(('R', Pos{r: curr.r, c: curr.c+1})); }
                
                let mut best_move = moves[0];
                let mut max_cards = -1;
                
                for m in moves {
                    let count = game.max_cards_on_path(m.1, target);
                    if count > max_cards {
                        max_cards = count;
                        best_move = m;
                    }
                }
                
                game.move_to_dir(best_move.0);
                
                if let Some(card_here) = game.board[game.pos.r][game.pos.c] {
                    if card_here != top_val {
                        let dist_to_current_target = game.pos.dist(&target);
                        if let Some(pair_pos) = game.find_pair_on_board_exclude_current(card_here) {
                            let dist_to_new_target = game.pos.dist(&pair_pos);
                            if dist_to_new_target < dist_to_current_target {
                                game.pick(); 
                                break; 
                            }
                        }
                    } else {
                        game.pick();
                        break;
                    }
                }
            }
        }
    }

    let move_count = game.moves.iter().filter(|&&c| c == 'U' || c == 'D' || c == 'L' || c == 'R').count();
    (move_count, game.moves)
}

fn solve() {
    let start_time = Instant::now();
    let stdin = io::stdin();
    let mut lines = stdin.lock().lines();
    
    // Read N (20)
    let _n_str = lines.next().unwrap().unwrap();
    
    // Read Grid
    let mut input_grid = vec![vec![0; N]; N];
    for r in 0..N {
        let line = lines.next().unwrap().unwrap();
        let nums: Vec<usize> = line.split_whitespace()
            .map(|s| s.parse().unwrap())
            .collect();
        for c in 0..N {
            input_grid[r][c] = nums[c];
        }
    }

    // Generate spiral coordinates for outer rings
    let mut spiral_targets = Vec::new();
    for layer in 0..7 {
        // Top edge (Left to Right)
        for c in layer..(N - layer - 1) { spiral_targets.push(Pos{r: layer, c}); }
        // Right edge (Top to Bottom)
        for r in layer..(N - layer - 1) { spiral_targets.push(Pos{r, c: N - 1 - layer}); }
        // Bottom edge (Right to Left)
        for c in (layer + 1..=(N - 1 - layer)).rev() { spiral_targets.push(Pos{r: N - 1 - layer, c}); }
        // Left edge (Bottom to Top)
        for r in (layer + 1..=(N - 1 - layer)).rev() { spiral_targets.push(Pos{r, c: layer}); }
    }

    // Hill Climbing Initialization
    let mut rng = Xorshift::new(123456789);
    let mut current_flags = vec![true; spiral_targets.len()];
    
    // Initial solution
    let (mut best_score, mut best_moves) = run_simulation(&input_grid, &spiral_targets, &current_flags);

    // Hill Climbing Loop (1.95s limit)
    while start_time.elapsed().as_secs_f64() < 1.95 {
        // Pick 1 to 3 indices to flip
        let num_changes = rng.gen_range(1, 4);
        let mut changed_indices = Vec::with_capacity(num_changes);
        
        // Apply changes
        for _ in 0..num_changes {
            let idx = rng.gen_range(0, spiral_targets.len());
            current_flags[idx] = !current_flags[idx];
            changed_indices.push(idx);
        }
        
        // Evaluate
        let (score, moves) = run_simulation(&input_grid, &spiral_targets, &current_flags);
        
        if score < best_score {
            // Adopt new state
            best_score = score;
            best_moves = moves;
        } else {
            // Revert changes
            for idx in changed_indices {
                current_flags[idx] = !current_flags[idx];
            }
        }
    }

    // Output best moves found
    for c in best_moves {
        println!("{}", c);
    }
}

fn main() {
    solve();
}

Submission Info

Submission Time
Task A - Stack to Match Pairs
User inujimono
Language Rust (rustc 1.89.0)
Score 2216341
Code Size 15954 Byte
Status AC
Exec Time 1952 ms
Memory 2228 KiB

Compile Error

warning: unnecessary parentheses around `if` condition
   --> src/main.rs:148:35
    |
148 |                 let has_card = if (r == start.r && c == start.c) { 0 } 
    |                                   ^                            ^
    |
    = note: `#[warn(unused_parens)]` on by default
help: remove these parentheses
    |
148 -                 let has_card = if (r == start.r && c == start.c) { 0 } 
148 +                 let has_card = if r == start.r && c == start.c { 0 } 
    |

Judge Result

Set Name test_ALL
Score / Max Score 2216341 / 2460000
Status
AC × 150
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
Case Name Status Exec Time Memory
test_0000.txt AC 1952 ms 2136 KiB
test_0001.txt AC 1951 ms 2084 KiB
test_0002.txt AC 1952 ms 2076 KiB
test_0003.txt AC 1952 ms 2028 KiB
test_0004.txt AC 1951 ms 2028 KiB
test_0005.txt AC 1951 ms 1980 KiB
test_0006.txt AC 1952 ms 2048 KiB
test_0007.txt AC 1951 ms 2072 KiB
test_0008.txt AC 1952 ms 2164 KiB
test_0009.txt AC 1952 ms 2084 KiB
test_0010.txt AC 1952 ms 2124 KiB
test_0011.txt AC 1952 ms 2084 KiB
test_0012.txt AC 1952 ms 2036 KiB
test_0013.txt AC 1952 ms 1984 KiB
test_0014.txt AC 1952 ms 2016 KiB
test_0015.txt AC 1952 ms 2104 KiB
test_0016.txt AC 1952 ms 1972 KiB
test_0017.txt AC 1952 ms 1992 KiB
test_0018.txt AC 1952 ms 2004 KiB
test_0019.txt AC 1952 ms 1988 KiB
test_0020.txt AC 1952 ms 1964 KiB
test_0021.txt AC 1952 ms 2076 KiB
test_0022.txt AC 1952 ms 2032 KiB
test_0023.txt AC 1952 ms 2132 KiB
test_0024.txt AC 1952 ms 1956 KiB
test_0025.txt AC 1952 ms 1964 KiB
test_0026.txt AC 1952 ms 2028 KiB
test_0027.txt AC 1952 ms 2120 KiB
test_0028.txt AC 1952 ms 2084 KiB
test_0029.txt AC 1952 ms 2064 KiB
test_0030.txt AC 1952 ms 2036 KiB
test_0031.txt AC 1952 ms 2152 KiB
test_0032.txt AC 1952 ms 2188 KiB
test_0033.txt AC 1952 ms 1956 KiB
test_0034.txt AC 1952 ms 2204 KiB
test_0035.txt AC 1952 ms 2228 KiB
test_0036.txt AC 1952 ms 2092 KiB
test_0037.txt AC 1952 ms 2188 KiB
test_0038.txt AC 1952 ms 1984 KiB
test_0039.txt AC 1952 ms 2144 KiB
test_0040.txt AC 1952 ms 2112 KiB
test_0041.txt AC 1952 ms 2108 KiB
test_0042.txt AC 1951 ms 2036 KiB
test_0043.txt AC 1952 ms 2152 KiB
test_0044.txt AC 1952 ms 2036 KiB
test_0045.txt AC 1952 ms 2056 KiB
test_0046.txt AC 1952 ms 2028 KiB
test_0047.txt AC 1952 ms 2032 KiB
test_0048.txt AC 1952 ms 2164 KiB
test_0049.txt AC 1952 ms 2136 KiB
test_0050.txt AC 1952 ms 2072 KiB
test_0051.txt AC 1952 ms 2112 KiB
test_0052.txt AC 1952 ms 2036 KiB
test_0053.txt AC 1952 ms 2136 KiB
test_0054.txt AC 1952 ms 2040 KiB
test_0055.txt AC 1952 ms 2028 KiB
test_0056.txt AC 1952 ms 2072 KiB
test_0057.txt AC 1952 ms 2216 KiB
test_0058.txt AC 1952 ms 1932 KiB
test_0059.txt AC 1952 ms 2048 KiB
test_0060.txt AC 1952 ms 2104 KiB
test_0061.txt AC 1952 ms 2080 KiB
test_0062.txt AC 1951 ms 1960 KiB
test_0063.txt AC 1952 ms 2028 KiB
test_0064.txt AC 1952 ms 2228 KiB
test_0065.txt AC 1952 ms 2116 KiB
test_0066.txt AC 1952 ms 2028 KiB
test_0067.txt AC 1952 ms 2036 KiB
test_0068.txt AC 1952 ms 1972 KiB
test_0069.txt AC 1952 ms 1952 KiB
test_0070.txt AC 1952 ms 2068 KiB
test_0071.txt AC 1952 ms 1964 KiB
test_0072.txt AC 1952 ms 2196 KiB
test_0073.txt AC 1952 ms 2008 KiB
test_0074.txt AC 1952 ms 2072 KiB
test_0075.txt AC 1952 ms 1996 KiB
test_0076.txt AC 1952 ms 1972 KiB
test_0077.txt AC 1952 ms 2076 KiB
test_0078.txt AC 1952 ms 2136 KiB
test_0079.txt AC 1952 ms 2080 KiB
test_0080.txt AC 1952 ms 1936 KiB
test_0081.txt AC 1952 ms 2048 KiB
test_0082.txt AC 1952 ms 2032 KiB
test_0083.txt AC 1952 ms 2056 KiB
test_0084.txt AC 1952 ms 2084 KiB
test_0085.txt AC 1952 ms 2084 KiB
test_0086.txt AC 1952 ms 2028 KiB
test_0087.txt AC 1952 ms 2084 KiB
test_0088.txt AC 1952 ms 2104 KiB
test_0089.txt AC 1952 ms 2024 KiB
test_0090.txt AC 1952 ms 2076 KiB
test_0091.txt AC 1952 ms 2136 KiB
test_0092.txt AC 1952 ms 2064 KiB
test_0093.txt AC 1952 ms 2072 KiB
test_0094.txt AC 1952 ms 2116 KiB
test_0095.txt AC 1952 ms 2204 KiB
test_0096.txt AC 1952 ms 2020 KiB
test_0097.txt AC 1952 ms 2028 KiB
test_0098.txt AC 1952 ms 1964 KiB
test_0099.txt AC 1952 ms 2072 KiB
test_0100.txt AC 1952 ms 2032 KiB
test_0101.txt AC 1952 ms 1992 KiB
test_0102.txt AC 1952 ms 2036 KiB
test_0103.txt AC 1952 ms 2024 KiB
test_0104.txt AC 1952 ms 2172 KiB
test_0105.txt AC 1952 ms 2048 KiB
test_0106.txt AC 1952 ms 2152 KiB
test_0107.txt AC 1952 ms 2084 KiB
test_0108.txt AC 1952 ms 2080 KiB
test_0109.txt AC 1952 ms 1976 KiB
test_0110.txt AC 1952 ms 2060 KiB
test_0111.txt AC 1952 ms 1996 KiB
test_0112.txt AC 1952 ms 2032 KiB
test_0113.txt AC 1952 ms 2104 KiB
test_0114.txt AC 1952 ms 2188 KiB
test_0115.txt AC 1952 ms 1964 KiB
test_0116.txt AC 1952 ms 2188 KiB
test_0117.txt AC 1952 ms 2012 KiB
test_0118.txt AC 1952 ms 2056 KiB
test_0119.txt AC 1952 ms 2188 KiB
test_0120.txt AC 1952 ms 2028 KiB
test_0121.txt AC 1952 ms 2076 KiB
test_0122.txt AC 1952 ms 2128 KiB
test_0123.txt AC 1952 ms 2144 KiB
test_0124.txt AC 1952 ms 2144 KiB
test_0125.txt AC 1952 ms 2028 KiB
test_0126.txt AC 1952 ms 2112 KiB
test_0127.txt AC 1952 ms 2060 KiB
test_0128.txt AC 1952 ms 2048 KiB
test_0129.txt AC 1952 ms 2048 KiB
test_0130.txt AC 1952 ms 2036 KiB
test_0131.txt AC 1952 ms 2096 KiB
test_0132.txt AC 1952 ms 2028 KiB
test_0133.txt AC 1952 ms 2060 KiB
test_0134.txt AC 1952 ms 2108 KiB
test_0135.txt AC 1952 ms 2076 KiB
test_0136.txt AC 1952 ms 1956 KiB
test_0137.txt AC 1952 ms 2096 KiB
test_0138.txt AC 1952 ms 2136 KiB
test_0139.txt AC 1952 ms 2120 KiB
test_0140.txt AC 1952 ms 2068 KiB
test_0141.txt AC 1952 ms 1972 KiB
test_0142.txt AC 1952 ms 2048 KiB
test_0143.txt AC 1952 ms 2164 KiB
test_0144.txt AC 1952 ms 2096 KiB
test_0145.txt AC 1952 ms 2032 KiB
test_0146.txt AC 1952 ms 2124 KiB
test_0147.txt AC 1952 ms 2124 KiB
test_0148.txt AC 1952 ms 2068 KiB
test_0149.txt AC 1952 ms 2164 KiB