Submission #44826299


Source Code Expand

use proconio::input;

fn add_edge(edges: &mut [Vec<(usize, i64, i64, usize)>], u: usize, v: usize, cap: i64, cost: i64) {
    let index_u = edges[u].len();
    let index_v = edges[v].len();
    edges[u].push((v, cap, cost, index_v));
    edges[v].push((u, 0, -cost, index_u));
}

fn bellman_ford(
    edges: &[Vec<(usize, i64, i64, usize)>],
    s: usize,
) -> (Vec<i64>, Vec<usize>, Vec<usize>) {
    let inf = 1_i64 << 60;
    let mut dist = vec![inf; edges.len()];
    dist[s] = 0;
    let mut prev_vert = vec![0_usize; edges.len()];
    let mut prev_edge = vec![0_usize; edges.len()];
    loop {
        let mut update = false;
        for v in 0..edges.len() {
            if dist[v] == inf {
                continue;
            }
            for (i, (u, cap, cost, _)) in edges[v].iter().copied().enumerate() {
                if cap > 0 && dist[u] > dist[v] + cost {
                    dist[u] = dist[v] + cost;
                    prev_vert[u] = v;
                    prev_edge[u] = i;
                    update = true;
                }
            }
        }
        if !update {
            break;
        }
    }
    (dist, prev_vert, prev_edge)
}

fn calc_min_cost_flow(
    edges: &mut [Vec<(usize, i64, i64, usize)>],
    s: usize,
    t: usize,
    mut capital_f: i64,
) -> i64 {
    let inf = 1_i64 << 60;
    let mut min_cost = 0_i64;
    while capital_f > 0 {
        let (dist, prev_vert, prev_edge) = bellman_ford(edges, s);
        if dist[t] == inf {
            return inf;
        }

        let mut v = t;
        let mut f = capital_f;
        while v != s {
            let u = prev_vert[v];
            let i = prev_edge[v];
            let c = edges[u][i].1;
            f = f.min(c);
            v = u;
        }

        v = t;
        while v != s {
            let u = prev_vert[v];
            let i = prev_edge[v];
            let j = edges[u][i].3;
            edges[u][i].1 -= f;
            edges[v][j].1 += f;
            v = u;
        }

        min_cost += f * dist[t];
        capital_f -= f;
    }
    min_cost
}

fn main() {
    input! {
        n: usize,
        m: i64,
        a: [i64; n],
        b: [i64; n],
        r: [i64; 3],
    }

    let count_v = 3 * (n + 1) + n + 2;
    let rounds = vec![0, n, 2 * n];
    let penalty = rounds[2] + n;
    let starts = vec![penalty + n, penalty + n + 1, penalty + n + 2];
    let start = starts[2] + 1;
    let end = start + 1;

    let mut edges = vec![vec![]; count_v];
    for i in 0..3 {
        add_edge(&mut edges, start, starts[i], m, 0);
    }
    for i in 0..3 {
        for j in 0..n {
            let p_j = a[j] * (b[j].pow((i + 1) as u32)) % r[i];
            add_edge(&mut edges, starts[i], rounds[i] + j, 1, -p_j);
            add_edge(&mut edges, rounds[i] + j, penalty + j, 1, 0);
        }
    }
    for j in 0..n {
        let q_0 = a[j] * b[j];
        let q_1 = a[j] * b[j].pow(2) - q_0;
        let q_2 = a[j] * b[j].pow(3) - q_0 - q_1;

        add_edge(&mut edges, penalty + j, end, 1, q_0);
        add_edge(&mut edges, penalty + j, end, 1, q_1);
        add_edge(&mut edges, penalty + j, end, 1, q_2);
    }

    let ans = -calc_min_cost_flow(&mut edges, start, end, m * 3);
    println!("{}", ans);
}

Submission Info

Submission Time
Task O - Quoits
User bouzuya
Language Rust (1.42.0)
Score 6
Code Size 3227 Byte
Status AC
Exec Time 105 ms
Memory 2604 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 6 / 6
Status
AC × 3
AC × 39
Set Name Test Cases
Sample sample0.txt, sample1.txt, sample2.txt
All hand0.txt, hand1.txt, hand2.txt, large1.txt, large10.txt, large11.txt, large12.txt, large17.txt, large18.txt, large19.txt, large2.txt, large20.txt, large3.txt, large4.txt, large5.txt, large6.txt, large7.txt, large8.txt, large9.txt, large_13.txt, large_14.txt, large_15.txt, large_16.txt, same1.txt, same2.txt, same3.txt, sample0.txt, sample1.txt, sample2.txt, small0.txt, small1.txt, small2.txt, small3.txt, small4.txt, small5.txt, small6.txt, small7.txt, small8.txt, small9.txt
Case Name Status Exec Time Memory
hand0.txt AC 5 ms 2136 KiB
hand1.txt AC 1 ms 2164 KiB
hand2.txt AC 1 ms 2112 KiB
large1.txt AC 2 ms 2580 KiB
large10.txt AC 88 ms 2556 KiB
large11.txt AC 86 ms 2432 KiB
large12.txt AC 37 ms 2480 KiB
large17.txt AC 30 ms 2512 KiB
large18.txt AC 84 ms 2604 KiB
large19.txt AC 56 ms 2560 KiB
large2.txt AC 3 ms 2548 KiB
large20.txt AC 75 ms 2536 KiB
large3.txt AC 72 ms 2528 KiB
large4.txt AC 81 ms 2556 KiB
large5.txt AC 100 ms 2528 KiB
large6.txt AC 14 ms 2532 KiB
large7.txt AC 97 ms 2472 KiB
large8.txt AC 96 ms 2548 KiB
large9.txt AC 105 ms 2512 KiB
large_13.txt AC 66 ms 2416 KiB
large_14.txt AC 74 ms 2484 KiB
large_15.txt AC 77 ms 2572 KiB
large_16.txt AC 78 ms 2436 KiB
same1.txt AC 45 ms 2476 KiB
same2.txt AC 47 ms 2508 KiB
same3.txt AC 1 ms 2092 KiB
sample0.txt AC 1 ms 2060 KiB
sample1.txt AC 1 ms 1952 KiB
sample2.txt AC 1 ms 2184 KiB
small0.txt AC 90 ms 2496 KiB
small1.txt AC 1 ms 2072 KiB
small2.txt AC 1 ms 2044 KiB
small3.txt AC 2 ms 2096 KiB
small4.txt AC 2 ms 2108 KiB
small5.txt AC 2 ms 2060 KiB
small6.txt AC 2 ms 2024 KiB
small7.txt AC 1 ms 2060 KiB
small8.txt AC 1 ms 1980 KiB
small9.txt AC 2 ms 2176 KiB