CSES - Datatähti 2025 alku - Results
Submission details
Task:Niitty
Sender:Kivvil
Submission time:2024-10-30 18:38:32 +0200
Language:Rust (2021)
Status:READY
Result:0
Feedback
groupverdictscore
#10
#20
#30
#40
#50
#60
Test results
testverdicttimegroup
#10.00 s1, 2, 3, 4, 5, 6details
#20.00 s1, 2, 3, 4, 5, 6details
#30.00 s1, 2, 3, 4, 5, 6details
#40.00 s1, 2, 3, 4, 5, 6details
#5ACCEPTED0.00 s1, 2, 3, 4, 5, 6details
#60.00 s2, 3, 4, 5, 6details
#70.00 s2, 3, 4, 5, 6details
#80.00 s2, 3, 4, 5, 6details
#90.00 s2, 3, 4, 5, 6details
#100.00 s3, 4, 5, 6details
#110.00 s3, 4, 5, 6details
#120.00 s3, 4, 5, 6details
#130.00 s3, 4, 5, 6details
#140.01 s4, 5, 6details
#150.01 s4, 5, 6details
#160.01 s4, 5, 6details
#170.01 s4, 5, 6details
#180.07 s5, 6details
#190.08 s5, 6details
#200.08 s5, 6details
#210.08 s5, 6details
#22--6details
#23--6details
#24--6details
#25--6details

Compiler report

warning: unused import: `Read`
 --> input/code.rs:5:19
  |
5 |     io::{BufRead, Read},
  |                   ^^^^
  |
  = note: `#[warn(unused_imports)]` on by default

warning: unused variable: `y`
  --> input/code.rs:19:14
   |
19 |         for (y, line) in stdin_handle.take(n as usize).enumerate() {
   |              ^ help: if this is intentional, prefix it with an underscore: `_y`
   |
   = note: `#[warn(unused_variables)]` on by default

warning: unused variable: `harvinaisin_kukka`
  --> input/code.rs:33:9
   |
33 |     let harvinaisin_kukka = {
   |         ^^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_harvinaisin_kukka`

warning: unused variable: `min`
  --> input/code.rs:34:13
   |
34 |         let min = kukkien_maarat.values().min().unwrap();
   |             ^^^ help: if this is intentional, prefix it with an underscore: `_min`

warning: struct `Suorakulmio` is never constructed
  --> input/code.rs:55:12
   |
55 |     struct Suorakulmio {...

Code

use std::{
    cmp::max,
    cmp::min,
    collections::{HashMap, HashSet},
    io::{BufRead, Read},
};

fn main() {
    let mut stdin_handle = std::io::stdin().lock().lines();

    let n: u32 = stdin_handle.next().unwrap().unwrap().parse().unwrap();

    let mut kukkien_maarat: HashMap<char, u32> = HashMap::new();

    // Kerätään niitty yksiulotteiseen vektoriin, jossa kukat vasemmalta oikealle rivi kerrallaan
    // ylhäältä alas.
    let kukat: Vec<char> = {
        let mut kukat = Vec::with_capacity((n * n) as usize);
        for (y, line) in stdin_handle.take(n as usize).enumerate() {
            let line = line.unwrap();
            for kukka in line.chars() {
                kukkien_maarat
                    .entry(kukka)
                    .and_modify(|maara| *maara += 1)
                    .or_insert(1);
            }
            kukat.extend(line.chars());
        }
        kukat
    };

    // Etsitään vähiten esiintynyt kukkalaji
    let harvinaisin_kukka = {
        let min = kukkien_maarat.values().min().unwrap();
        *kukkien_maarat
            .iter()
            .min_by_key(|tuple| *tuple.1)
            .unwrap()
            .0
    };

    let esiintyyko_kaikki_kukat = |x_min: i32, x_max: i32, y_min: i32, y_max: i32| -> bool {
        let mut esiintyneet_kukat: HashSet<char> = HashSet::with_capacity(kukkien_maarat.len());
        for y in y_min..=y_max {
            for kukka in kukat[(y as usize * n as usize + x_min as usize)
                ..=(y as usize * n as usize + x_max as usize)]
                .iter()
            {
                esiintyneet_kukat.insert(*kukka);
            }
        }
        esiintyneet_kukat.len() == kukkien_maarat.len()
    };

    struct Suorakulmio {
        pinta_ala: u32,
        x_min: u32,
        x_max: u32,
        y_min: u32,
        y_max: u32,
    }
    let mut x_min = 0i32;
    let mut x_max = max(n as i32 - 1, 0);
    let mut y_min = 0i32;
    let mut y_max = max(n as i32 - 1, 0);
    loop {
        let mut pienennetty = false;
        // Ylälaita.
        {
            let new_y_min = min(y_min + 1, n as i32 - 1);
            if esiintyyko_kaikki_kukat(x_min, x_max, new_y_min, y_max) && new_y_min != y_min {
                pienennetty = true;
                y_min = new_y_min;
            }
        }
        // Alalaita
        {
            let new_y_max = max(y_max - 1, 0);
            if esiintyyko_kaikki_kukat(x_min, x_max, y_min, new_y_max) && new_y_max != y_max {
                pienennetty = true;
                y_max = new_y_max;
            }
        }
        // Vasen laita
        {
            let new_x_min = min(x_min + 1, n as i32 - 1);
            if esiintyyko_kaikki_kukat(new_x_min, x_max, y_min, y_max) && new_x_min != x_min {
                pienennetty = true;
                x_min = new_x_min
            }
        }
        // Oikea laita
        {
            let new_x_max = max(x_max - 1, 0);
            if esiintyyko_kaikki_kukat(x_min, new_x_max, y_min, y_max) && new_x_max != x_min {
                pienennetty = true;
                x_max = new_x_max;
            }
        }
        if !pienennetty {
            break;
        }
    }

    let aitausten_maara = {
        let x = x_max as u32 - x_min as u32 + 1;
        let y = y_max as u32 - y_min as u32 + 1;
        (n - y + 1) * (n - x + 1)
    };
    println!("{}", aitausten_maara);

    // let mut tulokset: Vec<Suorakulmio> = Vec::with_capacity(kukkien_maarat.len());
    // for (i, kukka) in kukat.iter().enumerate() {
    //     if *kukka != harvinaisin_kukka {
    //         continue;
    //     }

    //     let piste = Piste {
    //         x: i as u32 % n,
    //         y: i as u32 / n,
    //     };

    //     let mut x_min = piste.x as i32;
    //     let mut x_max = piste.x as i32;
    //     let mut y_min = piste.y as i32;
    //     let mut y_max = piste.y as i32;

    //     // Nyt laajennetaan joka suuntaan yksi blokki kerrallaan muodostaen neliö tämän kukan
    //     // ympärille, kunnes neliön sisällä on ainakin yksi esiintymä kaikista lajeista.
    //     loop {
    //         x_min = max(x_min - 1, 0);
    //         x_max = min(x_max + 1, n as i32 - 1);
    //         y_min = max(y_min - 1, 0);
    //         y_max = min(y_max + 1, n as i32 - 1);

    //         if esiintyyko_kaikki_kukat(x_min, x_max, y_min, y_max) {
    //             // Kaikki kukat ovat esiintyneet neliössä.
    //             println!(
    //                 "Kaikki kukat esiintyvät neliössä: x_min: {}, x_max: {}, y_min: {}, y_max: {}",
    //                 x_min, x_max, y_min, y_max
    //             );
    //             break;
    //         }
    //     }
    //     // Nyt on löydetty neliö, jossa on kaikkia lajeja. Seuraavaksi pienennetään tämän neliön
    //     // vasen-, oikea-, ala- ja ylälaitoja yksi kerrallaan, kunnes suorakulmiota ei voida enää
    //     // pienentää hävittämättä jotain lajia.

    //     loop {
    //         let mut pienennetty = false;
    //         // Ylälaita.
    //         {
    //             let new_y_min = min(y_min + 1, n as i32 - 1);
    //             if esiintyyko_kaikki_kukat(x_min, x_max, new_y_min, y_max) && new_y_min != y_min {
    //                 pienennetty = true;
    //                 y_min = new_y_min;
    //             }
    //         }
    //         // Alalaita
    //         {
    //             let new_y_max = max(y_max - 1, 0);
    //             if esiintyyko_kaikki_kukat(x_min, x_max, y_min, new_y_max) && new_y_max != y_max {
    //                 pienennetty = true;
    //                 y_max = new_y_max;
    //             }
    //         }
    //         // Vasen laita
    //         {
    //             let new_x_min = min(x_min + 1, n as i32 - 1);
    //             if esiintyyko_kaikki_kukat(new_x_min, x_max, y_min, y_max) && new_x_min != x_min {
    //                 pienennetty = true;
    //                 x_min = new_x_min
    //             }
    //         }
    //         // Oikea laita
    //         {
    //             let new_x_max = max(x_max - 1, 0);
    //             if esiintyyko_kaikki_kukat(x_min, new_x_max, y_min, y_max) && new_x_max != x_min {
    //                 pienennetty = true;
    //                 x_max = new_x_max;
    //             }
    //         }
    //         if !pienennetty {
    //             break;
    //         }
    //     }
    //     tulokset.push(Suorakulmio {
    //         pinta_ala: ((x_max - x_min + 1) * (y_max - y_min + 1)) as u32,
    //         x_min: x_min as u32,
    //         x_max: x_max as u32,
    //         y_min: y_min as u32,
    //         y_max: y_max as u32,
    //     });

    //     println!(
    //         "x_min: {}, x_max: {}, y_min: {}, y_max: {}",
    //         x_min, x_max, y_min, y_max
    //     );
    // }

    // let pienin = tulokset
    //     .iter()
    //     .min_by_key(|kulmio| kulmio.pinta_ala)
    //     .unwrap();
}

// Laskee indeksin kukkavektoriin kaksiulotteisesta pisteestä.
fn calc_idx(n: u32, x: u32, y: u32) -> usize {
    (y * n + x) as usize
}

struct Piste {
    x: u32,
    y: u32,
}

Test details

Test 1

Group: 1, 2, 3, 4, 5, 6

Verdict:

input
10
TNCTNPNTPC
NPPNTNTPTP
NTNTTCNTCT
NPCPNPPNTT
...

correct output
2035

user output
72

Test 2

Group: 1, 2, 3, 4, 5, 6

Verdict:

input
10
NFWQLWNWYS
DZOQJVXFPJ
CNHXPXMCQD
QRTBVNLTQC
...

correct output
9

user output
8

Test 3

Group: 1, 2, 3, 4, 5, 6

Verdict:

input
10
XXXXXXXXXX
XXXXXXXXXX
XXXXXXXXXX
XXXXXXXXXX
...

correct output
3025

user output
100

Test 4

Group: 1, 2, 3, 4, 5, 6

Verdict:

input
10
FFFFFFFFFF
FFFFFCFFFF
FFFFFFJFFF
FFFFFFFFFF
...

correct output
12

user output
9

Test 5

Group: 1, 2, 3, 4, 5, 6

Verdict: ACCEPTED

input
1
X

correct output
1

user output
1

Test 6

Group: 2, 3, 4, 5, 6

Verdict:

input
20
BBCBUBOUOBBCUUBBCOUO
BOUCOOCUBCOOOCOBOCUO
UCCUUUOBCOCBCBUBUCOO
BUOBUCUCUOOBCOOUBUOO
...

correct output
38724

user output
361

Test 7

Group: 2, 3, 4, 5, 6

Verdict:

input
20
CBGLSHGZHYZDWBNDBJUG
SMUXOJQYPXZDTMJUIWOJ
XIDSTNBGHKRKOVUVMINB
MTQGCFRUHQKALXRNCQGS
...

correct output
8334

user output
132

Test 8

Group: 2, 3, 4, 5, 6

Verdict:

input
20
KKKKKKKKKKKKKKKKKKKK
KKKKKKKKKKKKKKKKKKKK
KKKKKKKKKKKKKKKKKKKK
KKKKKKKKKKKKKKKKKKKK
...

correct output
44100

user output
400

Test 9

Group: 2, 3, 4, 5, 6

Verdict:

input
20
AAAAAAAAXAAAAAAAAAAA
AAAWAAAAAAAAAAAAAOAA
AAAAAAAAAAAAAAAAAPAA
AAAAAAAAKAAAAAAAAAAZ
...

correct output
18

user output
9

Test 10

Group: 3, 4, 5, 6

Verdict:

input
50
GRGREEEGREGXRXXEGXXREXGRRRGRRR...

correct output
1584665

user output
2401

Test 11

Group: 3, 4, 5, 6

Verdict:

input
50
AITIISJUHCCRZNKSDCNQKYSQRINFWJ...

correct output
1077746

user output
1848

Test 12

Group: 3, 4, 5, 6

Verdict:

input
50
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO...

correct output
1625625

user output
2500

Test 13

Group: 3, 4, 5, 6

Verdict:

input
50
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF...

correct output
1680

user output
140

Test 14

Group: 4, 5, 6

Verdict:

input
100
NNCMDCDDCCNNNDNCMMNCDCDCCDCDNM...

correct output
25325366

user output
9702

Test 15

Group: 4, 5, 6

Verdict:

input
100
LIMQQIHASECROEVILNVULGWZJPPKOG...

correct output
22342463

user output
8740

Test 16

Group: 4, 5, 6

Verdict:

input
100
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTT...

correct output
25502500

user output
10000

Test 17

Group: 4, 5, 6

Verdict:

input
100
QXQQQQQQQQQQQQQQQQQQQQQQQQQQQQ...

correct output
25650

user output
544

Test 18

Group: 5, 6

Verdict:

input
200
NAANANMMKNKKAKMKMAKNKMNKMMNNAA...

correct output
403292767

user output
39402

Test 19

Group: 5, 6

Verdict:

input
200
OMYWATTLURKQPTKEFMGGYAOONXWVSC...

correct output
388111321

user output
37249

Test 20

Group: 5, 6

Verdict:

input
200
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC...

correct output
404010000

user output
40000

Test 21

Group: 5, 6

Verdict:

input
200
LLLLLLLLLLLLLLLLLHLLLLLLLLLLLL...

correct output
14159445

user output
11172

Test 22

Group: 6

Verdict:

input
500
VVHWVUHVHUWWWVUUUWVUUHUUWHWUVW...

correct output
15683003812

user output
(empty)

Test 23

Group: 6

Verdict:

input
500
OIMZGEQSBMBDSDXSWRFNKSGFEBBTJE...

correct output
15575906951

user output
(empty)

Test 24

Group: 6

Verdict:

input
500
IIIIIIIIIIIIIIIIIIIIIIIIIIIIII...

correct output
15687562500

user output
(empty)

Test 25

Group: 6

Verdict:

input
500
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW...

correct output
3058970930

user output
(empty)