CSES - Datatähti 2024 alku - Results
Submission details
Task:Käännöt
Sender:axka
Submission time:2023-11-07 21:03:23 +0200
Language:Rust
Status:READY
Result:0
Feedback
groupverdictscore
#10
#20
#30
#40
Test results
testverdicttimegroup
#10.00 s1details
#20.00 s1details
#30.88 s1details
#40.85 s1details
#50.85 s1details
#60.00 s2details
#70.00 s2details
#80.00 s2details
#90.88 s2details
#100.89 s2details
#110.83 s2details
#120.83 s2details
#130.83 s2details
#140.83 s2details
#150.82 s2details
#160.83 s2details
#170.00 s3details
#180.00 s3details
#190.83 s3details
#200.82 s3details
#210.83 s3details
#220.83 s3details
#230.82 s3details
#240.83 s3details
#250.82 s3details
#260.00 s4details
#270.00 s4details
#280.82 s4details
#290.83 s4details
#300.83 s4details
#310.83 s4details
#320.83 s4details
#330.83 s4details
#340.82 s4details

Compiler report

warning: variable `layer` is assigned to, but never used
  --> input/code.rs:75:13
   |
75 |     let mut layer = 0;
   |             ^^^^^
   |
   = note: consider using `_layer` instead
   = note: `#[warn(unused_variables)]` on by default

warning: unused variable: `prev_child_i`
  --> input/code.rs:82:14
   |
82 |         for (prev_child_i, (edelliset_operaatiot, lista)) in cur_layer_lists.iter().enumerate() {
   |              ^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_prev_child_i`

warning: 2 warnings emitted

Code

//! Input:
//! 5 3
//! 3 4 1 2 5
//! output:
//! YES
//! 2
//! 2 1

use std::io::stdin;

type IdxLen = usize;
type Value = isize;
type Operaatiot = Vec<IdxLen>;

fn suorita_operaatio(käännön_pituus: IdxLen, operaatio_i: IdxLen, lista: &[Value]) -> Vec<Value> {
    let a = lista.into_iter().take(operaatio_i);
    let b = lista
        .into_iter()
        .skip(operaatio_i)
        .take(käännön_pituus)
        .rev();
    let c = lista.into_iter().skip(operaatio_i + käännön_pituus);
    a.chain(b).chain(c).copied().collect()
}

#[cfg(test)]
#[test]
fn test_tee_operaatio() {
    fn f(käännön_pituus: IdxLen, operaatio_i: IdxLen, expected: &[Value]) {
        let lista = &[1, 2, 3, 4, 5];
        assert_eq!(suorita_operaatio(käännön_pituus, operaatio_i, lista), expected);
    }
    f(0, 0, &[1, 2, 3, 4, 5]);
    f(2, 0, &[2, 1, 3, 4, 5]);
    f(3, 0, &[3, 2, 1, 4, 5]);
    f(3, 1, &[1, 4, 3, 2, 5]);
    f(3, 2, &[1, 2, 5, 4, 3]);
}

/*fn cmp_sorted(sorted: &[Value], new: &[Value]) -> usize {
    let mut n = 0;
    assert_eq!(sorted.len(), new.len());
    for (i, sorted_el) in sorted.into_iter().enumerate() {
        if new[i] == *sorted_el {
            n += 1;
        } else {
            break;
        }
    }
    n
}

#[cfg(test)]
#[test]
fn test_cmp_sorted() {
    fn f(list: &[Value], n: usize) {
        let mut sorted = list.to_owned();
        sorted.sort();
        assert_eq!(cmp_sorted(&sorted, list), n);
    }
    f(&[2, 1, 3, 4, 5], 0);
    f(&[1, 3, 2, 4, 5], 1);
    f(&[1, 2, 3, 4, 5], 5);
}*/


#[allow(dead_code)]
fn käännä3(
    käännön_pituus: IdxLen,
    #[allow(unused_variables)]
    järjestetty_lista: &[Value],
    alkuperäinen_lista: &[Value],
) -> Option<Operaatiot> {
    //eprintln!("\x1b[32m==+ doing\x1b[34m");
    let mut layer = 0;
    let mut layer_lists: Vec<(Operaatiot, Vec<Value>)> = vec![
        (Vec::new(), alkuperäinen_lista.to_owned())
    ];
    loop {
        let cur_layer_lists = layer_lists.clone();
        layer_lists = Vec::new();
        for (prev_child_i, (edelliset_operaatiot, lista)) in cur_layer_lists.iter().enumerate() {
            //eprintln!("{}layer={layer}.{prev_child_i}", "  ".repeat(layer));
            for (i, _luku) in lista.iter().enumerate() {
                let mut operaatiot = edelliset_operaatiot.clone();
                operaatiot.push(i);
                let res = suorita_operaatio(käännön_pituus, i, &lista);
                //eprintln!("  {}operaatiot={operaatiot:?}", "  ".repeat(layer));
                if res == järjestetty_lista {
                    //eprintln!("\x1b[31m==- done\x1b[0m: {:?}", res);
                    return Some(operaatiot);
                }
                layer_lists.push((
                    operaatiot,
                    res
                ));
            }
        }
        layer += 1;
    }
}

/*fn käännä(
    käännön_pituus: IdxLen,
    järjestetty_lista: &[Value],
    alkuperäinen_lista: &[Value],
) -> Option<Operaatiot> {
    let mut lista = alkuperäinen_lista.to_owned();
    let mut operaatiot = Vec::new();
    let mut prev_cmp = 0;
    let max_iters = lista.len() - käännön_pituus + 1; // is +1 necessary?
    let to_visit: Vec<Operaatiot> = Vec::new();

    for iter in 0..max_iters {
        for operaatio_i in 0..(lista.len() - käännön_pituus) {
            println!("sub-iter {operaatio_i} of {iter}");
            let uusi_lista = suorita_operaatio(käännön_pituus, operaatio_i, &lista);
            if järjestetty_lista == uusi_lista {
                operaatiot.push(operaatio_i);
                return Some(operaatiot);
            }



            let cmp = cmp_sorted(järjestetty_lista, &uusi_lista);
            // FIXME: doesn't work for multi-step
            if cmp > prev_cmp {
                // better than previous, good to go for next iter
                lista = uusi_lista;
                prev_cmp = cmp;
                break;
            } else {
                println!("continuing at sub-iter {operaatio_i} of {iter}: {cmp} >= {prev_cmp}");
            }
        }
        eprintln!("= top-level iter {iter}: max_iters={max_iters}, operaatiot={operaatiot:?}");
    }
    None
}*/

#[cfg(test)]
#[test]
fn test_käännä() {
    fn f(käännön_pituus: IdxLen, lista: &[Value], expected: &[IdxLen]) {
        let mut järjestetty = lista.to_owned();
        järjestetty.sort();
        assert_eq!(käännä3(käännön_pituus, &järjestetty, lista).unwrap(), expected);
    }
    eprintln!("-=-=- one step");
    f(2, &[2, 1, 3, 4, 5], &[0]);
    f(2, &[1, 3, 2, 4, 5], &[1]);
    eprintln!("-=-=- two steps");
    f(2, &[2, 3, 1, 4, 5], &[1, 0]);
    f(3, &[3, 4, 1, 2, 5], &[0, 1]); // or 2, 1 for descending
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut lines = stdin().lines();
    let ensimmäinen_rivi = lines
        .next()
        .unwrap()?
        .split_ascii_whitespace()
        .map(str::parse)
        .collect::<Result<Vec<usize>, _>>()?;

    // n, k
    let (listan_pituus, käännön_pituus) = (ensimmäinen_rivi[0], ensimmäinen_rivi[1]);

    // Jokainen luku 1,2,\dots,n esiintyy listassa täsmälleen kerran.
    let lista = lines
        .next()
        .unwrap()?
        .split_ascii_whitespace()
        .map(str::parse)
        .collect::<Result<Vec<Value>, _>>()?;
    assert_eq!(listan_pituus, lista.len());

    let mut järjestetty_lista = lista.clone();
    järjestetty_lista.sort();

    if let Some(operaatiot) = käännä3(käännön_pituus, &järjestetty_lista, &lista) {
        println!("YES");
        println!("{}", operaatiot.len());
        let str_ops: Vec<_> = operaatiot.iter().map(ToString::to_string).collect();
        println!("{}", str_ops.join(" "));
    } else {
        println!("NO");
    }
    Ok(())
}

Test details

Test 1

Group: 1

Verdict:

input
5 2
1 2 3 4 5

correct output
YES
0

user output
YES
1
4

Test 2

Group: 1

Verdict:

input
5 2
2 1 3 4 5

correct output
YES
1
1

user output
YES
1
0

Test 3

Group: 1

Verdict:

input
20 2
6 20 18 2 16 13 19 17 8 14 11 ...

correct output
YES
366
2 3 4 5 6 7 8 9 10 11 12 13 14...

user output
(empty)

Test 4

Group: 1

Verdict:

input
100 2
100 92 62 88 12 7 43 31 19 72 ...

correct output
YES
2876
1 2 3 4 5 6 7 8 9 10 11 12 13 ...

user output
(empty)

Test 5

Group: 1

Verdict:

input
100 2
100 99 98 97 96 95 94 93 92 91...

correct output
YES
5248
1 2 3 4 5 6 7 8 9 10 11 12 13 ...

user output
(empty)

Test 6

Group: 2

Verdict:

input
5 3
1 2 3 4 5

correct output
YES
0

user output
YES
1
4

Test 7

Group: 2

Verdict:

input
5 3
3 5 4 1 2

correct output
NO

user output
YES
5
3 1 2 0 3

Test 8

Group: 2

Verdict:

input
5 3
5 2 1 4 3

correct output
YES
8
1 2 1 3 1 2 3 1

user output
YES
2
0 2

Test 9

Group: 2

Verdict:

input
20 3
19 14 1 18 3 4 11 20 13 6 17 8...

correct output
YES
52
8 10 12 14 16 18 1 3 5 7 9 11 ...

user output
(empty)

Test 10

Group: 2

Verdict:

input
20 3
9 6 13 18 5 10 3 2 7 20 1 4 19...

correct output
YES
50
10 12 14 16 18 13 15 17 4 6 8 ...

user output
(empty)

Test 11

Group: 2

Verdict:

input
500 3
53 52 21 76 25 142 5 4 83 176 ...

correct output
YES
15194
334 336 338 340 342 344 346 34...

user output
(empty)

Test 12

Group: 2

Verdict:

input
500 3
51 44 147 172 1 28 27 82 233 1...

correct output
YES
15565
366 368 370 372 374 376 378 38...

user output
(empty)

Test 13

Group: 2

Verdict:

input
500 3
75 46 179 62 221 14 67 154 89 ...

correct output
YES
15920
454 456 458 460 462 464 466 46...

user output
(empty)

Test 14

Group: 2

Verdict:

input
500 3
161 54 285 12 71 142 111 94 97...

correct output
YES
15931
408 410 412 414 416 418 420 42...

user output
(empty)

Test 15

Group: 2

Verdict:

input
500 3
122 260 455 113 315 276 433 43...

correct output
NO

user output
(empty)

Test 16

Group: 2

Verdict:

input
500 3
499 500 497 498 495 496 493 49...

correct output
YES
62264
2 4 6 8 10 12 14 16 18 20 22 2...

user output
(empty)

Test 17

Group: 3

Verdict:

input
5 4
1 2 3 4 5

correct output
YES
0

user output
YES
1
4

Test 18

Group: 3

Verdict:

input
5 4
5 1 2 3 4

correct output
YES
4
1 2 1 2

user output
YES
4
0 1 0 1

Test 19

Group: 3

Verdict:

input
500 4
58 14 107 124 4 113 24 290 56 ...

correct output
YES
15698
389 392 395 398 401 404 407 41...

user output
(empty)

Test 20

Group: 3

Verdict:

input
500 4
113 187 278 242 23 67 48 298 3...

correct output
YES
15004
480 481 480 482 485 488 491 49...

user output
(empty)

Test 21

Group: 3

Verdict:

input
500 4
5 233 199 35 213 354 11 134 30...

correct output
YES
16770
458 461 464 467 470 473 476 47...

user output
(empty)

Test 22

Group: 3

Verdict:

input
500 4
169 47 21 137 57 138 360 147 4...

correct output
YES
15889
497 371 372 371 373 376 379 38...

user output
(empty)

Test 23

Group: 3

Verdict:

input
500 4
493 409 291 313 156 443 496 40...

correct output
YES
22886
480 481 480 482 485 488 491 49...

user output
(empty)

Test 24

Group: 3

Verdict:

input
500 4
137 99 100 226 326 298 140 340...

correct output
NO

user output
(empty)

Test 25

Group: 3

Verdict:

input
500 4
500 499 498 497 496 495 494 49...

correct output
YES
41458
1 2 1 2 5 8 11 14 17 20 23 26 ...

user output
(empty)

Test 26

Group: 4

Verdict:

input
5 5
1 2 3 4 5

correct output
YES
0

user output
YES
1
4

Test 27

Group: 4

Verdict:

input
5 5
5 4 3 2 1

correct output
YES
1
1

user output
YES
1
0

Test 28

Group: 4

Verdict:

input
500 5
145 26 285 154 147 314 141 40 ...

correct output
YES
13786
216 220 224 228 232 236 240 24...

user output
(empty)

Test 29

Group: 4

Verdict:

input
500 5
137 22 399 292 249 6 51 224 42...

correct output
YES
13465
456 460 464 468 472 476 480 48...

user output
(empty)

Test 30

Group: 4

Verdict:

input
500 5
153 52 85 100 329 60 433 468 4...

correct output
YES
13642
377 378 377 380 384 388 392 39...

user output
(empty)

Test 31

Group: 4

Verdict:

input
500 5
267 326 95 108 189 32 291 366 ...

correct output
YES
14639
213 214 213 216 220 224 228 23...

user output
(empty)

Test 32

Group: 4

Verdict:

input
500 5
15 450 272 80 321 101 247 438 ...

correct output
NO

user output
(empty)

Test 33

Group: 4

Verdict:

input
499 5
497 498 499 496 495 494 493 49...

correct output
YES
30886
3 7 11 15 19 23 27 31 35 39 43...

user output
(empty)

Test 34

Group: 4

Verdict:

input
500 5
499 500 497 498 495 496 493 49...

correct output
YES
30919
1 4 8 12 16 20 24 28 32 36 40 ...

user output
(empty)