QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#834593#8818. Colorful Graph 3GPT-ofast#Compile Error//Rust3.9kb2024-12-27 20:48:142024-12-27 20:48:15

Judging History

你现在查看的是最新测评结果

  • [2024-12-27 20:48:15]
  • 评测
  • [2024-12-27 20:48:14]
  • 提交

answer

use std::cmp::min;
use std::io::{self, BufRead, Write};

fn main() {
    let stdin = io::stdin();
    let mut reader = stdin.lock().lines();
    let mut input = String::new();
    while let Some(line) = reader.next() {
        match line {
            Ok(l) => input.push_str(&l),
            Err(_) => break,
        }
    }
    let mut tokens = input.split_whitespace();
    let cas: usize = tokens.next().unwrap().parse().unwrap();
    let stdout = io::stdout();
    let mut writer = io::BufWriter::new(stdout.lock());
    for _ in 0..cas {
        let n: usize = tokens.next().unwrap().parse().unwrap();
        let k: usize = tokens.next().unwrap().parse().unwrap();
        let mut c = vec![0i32; k];
        let mut tp: i32 = -1;
        let mut op: i32 = -1;
        let mut cc = [0usize, 0usize];
        for i in 0..k {
            c[i] = tokens.next().unwrap().parse().unwrap();
            if c[i] >= 2 {
                tp = i as i32;
            } else {
                cc[c[i] as usize] += 1;
                if c[i] == 1 {
                    op = i as i32;
                }
            }
        }
        if tp != -1 {
            writeln!(writer, "{}", n - 1).unwrap();
            for i in 1..n {
                writeln!(writer, "1 {} {}", i + 1, tp + 1).unwrap();
            }
            continue;
        }
        let mut t: usize = 0;
        let mut sp: usize = 1;
        let mut psp: usize = 1;
        while t * (k - 1) + (sp - 1) * cc[1] < n - 1 {
            while t == sp * (sp - 1) / 2 {
                sp += 1;
            }
            psp = sp;
            t += 1;
        }
        let mut rq: usize = t * (k - 1) + (sp - 1) * cc[1] - (n - 1);
        if cc[1] == 0 {
            sp = 1;
        }
        let mut q = vec![Vec::new(); sp * (sp - 1) / 2 + 1];
        let mut rs = Vec::new();
        for i in 0..k {
            let mut qc = t;
            if c[i] > 0 {
                qc += sp - 1;
            }
            let mut rd = min(rq, min(1 + if psp != sp && c[i] == 1 { 1 } else { 0 }, qc));
            if op == i as i32 {
                rd = 0;
            }
            qc -= rd;
            rq -= rd;
            let start = if c[i] > 0 { 0 } else { sp - 1 };
            for j in start..(sp * (sp - 1) / 2) {
                if qc == 0 {
                    break;
                }
                q[j].push(i);
                qc -= 1;
            }
            rs.push((qc, i));
        }
        rs.sort();
        assert!((rs.last().unwrap().0 as isize - rs.first().unwrap().0 as isize).abs() <= 1);
        let mut ans = Vec::new();
        let mut ind = sp;
        let mut id = 0;
        for i in 0..sp {
            for j in (i + 1)..sp {
                if q[id].is_empty() {
                    continue;
                }
                let x = q[id].pop().unwrap();
                let mut lst = i;
                for &y in &q[id] {
                    ans.push((lst, ind, y));
                    lst = ind;
                    ind += 1;
                }
                ans.push((lst, j, x));
                id += 1;
            }
        }
        while rs.last().unwrap().0 > 0 {
            let mut fst: i32 = -1;
            let mut lst: usize = 0;
            for (cn, x) in &mut rs {
                if *cn > 0 {
                    *cn -= 1;
                    if fst == -1 {
                        fst = *x;
                    } else {
                        ans.push((lst, ind, *x));
                        lst = ind;
                        ind += 1;
                    }
                }
            }
            ans.push((lst, 0, fst));
        }
        assert!(ans.len() == n - 1 + t);
        writeln!(writer, "{}", ans.len()).unwrap();
        for (x, y, v) in ans {
            writeln!(writer, "{} {} {}", x + 1, y + 1, v + 1).unwrap();
        }
    }
}

Details

error[E0308]: mismatched types
   --> answer.code:108:31
    |
102 |             let mut fst: i32 = -1;
    |                          --- expected due to this type
...
108 |                         fst = *x;
    |                               ^^ expected `i32`, found `usize`

error[E0308]: mismatched types
   --> answer.code:116:31
    |
116 |             ans.push((lst, 0, fst));
    |                               ^^^ expected `usize`, found `i32`
    |
help: you can convert an `i32` to a `usize` and panic if the converted value doesn't fit
    |
116 |             ans.push((lst, 0, fst.try_into().unwrap()));
    |                                  ++++++++++++++++++++

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0308`.