| Task: | Ruudukko | 
| Sender: | Arska123 | 
| Submission time: | 2022-10-31 18:17:32 +0200 | 
| Language: | Rust | 
| Status: | READY | 
| Result: | 28 | 
| group | verdict | score | 
|---|---|---|
| #1 | ACCEPTED | 28 | 
| #2 | WRONG ANSWER | 0 | 
| #3 | WRONG ANSWER | 0 | 
| test | verdict | time | group | |
|---|---|---|---|---|
| #1 | ACCEPTED | 0.00 s | 1, 2, 3 | details | 
| #2 | ACCEPTED | 0.00 s | 1, 2, 3 | details | 
| #3 | ACCEPTED | 0.00 s | 1, 2, 3 | details | 
| #4 | ACCEPTED | 0.00 s | 2, 3 | details | 
| #5 | WRONG ANSWER | 0.03 s | 2, 3 | details | 
| #6 | WRONG ANSWER | 0.04 s | 2, 3 | details | 
| #7 | ACCEPTED | 0.03 s | 3 | details | 
| #8 | TIME LIMIT EXCEEDED | -- | 3 | details | 
| #9 | TIME LIMIT EXCEEDED | -- | 3 | details | 
Code
use std::{io::stdin, collections::HashMap};
struct Grid {
    n: u32,
    data: Vec<u32>,
    path_cache: HashMap<u64, u64>,
}
impl Grid {
    fn get(&self, x: u32, y: u32) -> Option<u32> {
        self.data.get((x + self.n * y) as usize).copied()
    }
    fn possible_paths(&mut self, x: u32, y: u32) -> Option<u64> {
        let key = (x as u64) << 32 | y as u64;
        if let Some(&s) = self.path_cache.get(&key) {
            Some(s)
        } else {
            let this_value = self.get(x, y)?;
            if this_value == 1 {
                return Some(0);
            }
            let mut sum: u64 = 0;
            for check_y in 0..self.n {
                if self.get(x, check_y)? < this_value {
                    sum += self.possible_paths(x, check_y)? + 1;
                }
            }
            for check_x in 0..self.n {
                if self.get(check_x, y)? < this_value {
                    sum += self.possible_paths(check_x, y)? + 1;
                }
            }
            self.path_cache.insert(key, sum);
            Some(sum)
        }
    }
}
fn main() {
    let mut buf = String::new();
    stdin().read_line(&mut buf).unwrap();
    let n: u32 = buf.trim().parse().unwrap();
    let mut grid = Grid {
        n,
        data: Vec::with_capacity((n * n) as usize),
        path_cache: HashMap::new(),
    };
    for _ in 0..n {
        buf.clear();
        stdin().read_line(&mut buf).unwrap();
        for value in buf.split_whitespace() {
            let value: u32 = value.parse().unwrap();
            grid.data.push(value);
        }
    }
    let mut sum: u64 = 0;
    for x in 0..n {
        for y in 0..n {
            sum += grid.possible_paths(x, y).unwrap() + 1;
        }
    }
    println!("{}", sum % (10_u64.pow(10) + 7));
}Test details
Test 1
Group: 1, 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 3 1 1 1 1 1 1 1 1 1  | 
| correct output | 
|---|
| 9 | 
| user output | 
|---|
| 9 | 
Test 2
Group: 1, 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 3 1 2 3 6 5 4 7 8 9  | 
| correct output | 
|---|
| 135 | 
| user output | 
|---|
| 135 | 
Test 3
Group: 1, 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 3 7 8 1 4 5 4 3 9 6  | 
| correct output | 
|---|
| 57 | 
| user output | 
|---|
| 57 | 
Test 4
Group: 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...  | 
| correct output | 
|---|
| 10000 | 
| user output | 
|---|
| 10000 | 
Test 5
Group: 2, 3
Verdict: WRONG ANSWER
| input | 
|---|
| 100 1 2 3 4 5 6 7 8 9 10 11 12 13 ...  | 
| correct output | 
|---|
| 187458477 | 
| user output | 
|---|
| 6359035000 | 
Test 6
Group: 2, 3
Verdict: WRONG ANSWER
| input | 
|---|
| 100 2995 8734 1018 2513 7971 5063 ...  | 
| correct output | 
|---|
| 964692694 | 
| user output | 
|---|
| 8579272508 | 
Test 7
Group: 3
Verdict: ACCEPTED
| input | 
|---|
| 1000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...  | 
| correct output | 
|---|
| 1000000 | 
| user output | 
|---|
| 1000000 | 
Test 8
Group: 3
Verdict: TIME LIMIT EXCEEDED
| input | 
|---|
| 1000 1 2 3 4 5 6 7 8 9 10 11 12 13 ...  | 
| correct output | 
|---|
| 229147081 | 
| user output | 
|---|
| (empty) | 
Test 9
Group: 3
Verdict: TIME LIMIT EXCEEDED
| input | 
|---|
| 1000 520283 805991 492643 75254 527...  | 
| correct output | 
|---|
| 951147313 | 
| user output | 
|---|
| (empty) | 
