提出 #6238817


ソースコード 拡げる

#include <bits/stdc++.h>
using namespace std;

const int64_t INF = 1e18;

struct Dinic{
    struct edge {
        int64_t to, cap, rev;
        edge(int64_t to, int64_t cap, int64_t rev):to(to), cap(cap), rev(rev){}
    };

    int N, S, T;
    int64_t flow = 0;
    vector<int> level, iter;
    vector<vector<edge>> G;

    Dinic(int N, int S, int T):N(N), S(S), T(T){
        flow = 0;
        level.resize(N);
        iter.resize(N);
        G.resize(N);
    }

    void add_edge(int from, int to, int64_t cap){
        G[from].emplace_back(to, cap, G[to].size());
        G[to].emplace_back(from, 0, G[from].size()-1);
    }

    void bfs(int s){
        fill(level.begin(), level.end(), -1);
        queue<int> que;
        level[s] = 0;
        que.push(s);
        while(que.size()){
            int v = que.front(); que.pop();
            for(auto& e : G[v]){
                if(e.cap > 0 && level[e.to] < 0){
                    level[e.to] = level[v] + 1;
                    que.push(e.to);
                }
            }
        }
    }

    int64_t dfs(int v, int t, int64_t f){
        if(v == t) return f;
        for(int& i=iter[v]; i<G[v].size(); i++){
            auto& e = G[v][i];
            if(e.cap > 0 && level[v] < level[e.to]){
                int64_t d = dfs(e.to, t, min(f, e.cap));
                if(d > 0){
                    e.cap -= d;
                    G[e.to][e.rev].cap += d;
                    return d;
                }
            }
        }
        return 0;
    }

    int64_t max_flow(){
        while(true){
            bfs(S);
            if(level[T] < 0) return flow;
            fill(iter.begin(), iter.end(), 0);
            while(true){
                int64_t f = dfs(S, T, INF);
                if(f == 0) break;
                flow += f;
            }
        }
    }
};

int main(){
    int N, A[101];
    cin >> N;
    for(int i=1; i<=N; i++) cin >> A[i];

    int S = 101, T = 102;
    Dinic solver(T+1, S, T);

    int64_t pre_gain = 0;

    for(int i=1; i<=N; i++){
        if(A[i] >= 0){
            pre_gain += A[i];
            solver.add_edge(S, i, 0);
            solver.add_edge(i, T, A[i]);
        }else{
            solver.add_edge(S, i, -A[i]);
            solver.add_edge(i, T, 0);
        }
    }

    for(int i=1; i<=N; i++) for(int k=2; i*k<=N; k++){
        solver.add_edge(i, k*i, INF);
    }

    int64_t ans = pre_gain - solver.max_flow();
    cout << ans << endl;
}

提出情報

提出日時
問題 E - MUL
ユーザ betrue12
言語 C++14 (GCC 5.4.1)
得点 700
コード長 2549 Byte
結果 AC
実行時間 1 ms
メモリ 256 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 700 / 700
結果
AC × 4
AC × 49
セット名 テストケース
Sample example_0, example_1, example_2, example_3
All example_0, example_1, example_2, example_3, kimeuti_0, kimeuti_1, kimeuti_10, kimeuti_11, kimeuti_12, kimeuti_13, kimeuti_14, kimeuti_15, kimeuti_16, kimeuti_17, kimeuti_18, kimeuti_19, kimeuti_2, kimeuti_3, kimeuti_4, kimeuti_5, kimeuti_6, kimeuti_7, kimeuti_8, kimeuti_9, rand_0, rand_1, rand_10, rand_11, rand_12, rand_13, rand_14, rand_15, rand_16, rand_17, rand_18, rand_19, rand_2, rand_3, rand_4, rand_5, rand_6, rand_7, rand_8, rand_9, small_0, small_1, small_2, small_3, small_4
ケース名 結果 実行時間 メモリ
example_0 AC 1 ms 256 KiB
example_1 AC 1 ms 256 KiB
example_2 AC 1 ms 256 KiB
example_3 AC 1 ms 256 KiB
kimeuti_0 AC 1 ms 256 KiB
kimeuti_1 AC 1 ms 256 KiB
kimeuti_10 AC 1 ms 256 KiB
kimeuti_11 AC 1 ms 256 KiB
kimeuti_12 AC 1 ms 256 KiB
kimeuti_13 AC 1 ms 256 KiB
kimeuti_14 AC 1 ms 256 KiB
kimeuti_15 AC 1 ms 256 KiB
kimeuti_16 AC 1 ms 256 KiB
kimeuti_17 AC 1 ms 256 KiB
kimeuti_18 AC 1 ms 256 KiB
kimeuti_19 AC 1 ms 256 KiB
kimeuti_2 AC 1 ms 256 KiB
kimeuti_3 AC 1 ms 256 KiB
kimeuti_4 AC 1 ms 256 KiB
kimeuti_5 AC 1 ms 256 KiB
kimeuti_6 AC 1 ms 256 KiB
kimeuti_7 AC 1 ms 256 KiB
kimeuti_8 AC 1 ms 256 KiB
kimeuti_9 AC 1 ms 256 KiB
rand_0 AC 1 ms 256 KiB
rand_1 AC 1 ms 256 KiB
rand_10 AC 1 ms 256 KiB
rand_11 AC 1 ms 256 KiB
rand_12 AC 1 ms 256 KiB
rand_13 AC 1 ms 256 KiB
rand_14 AC 1 ms 256 KiB
rand_15 AC 1 ms 256 KiB
rand_16 AC 1 ms 256 KiB
rand_17 AC 1 ms 256 KiB
rand_18 AC 1 ms 256 KiB
rand_19 AC 1 ms 256 KiB
rand_2 AC 1 ms 256 KiB
rand_3 AC 1 ms 256 KiB
rand_4 AC 1 ms 256 KiB
rand_5 AC 1 ms 256 KiB
rand_6 AC 1 ms 256 KiB
rand_7 AC 1 ms 256 KiB
rand_8 AC 1 ms 256 KiB
rand_9 AC 1 ms 256 KiB
small_0 AC 1 ms 256 KiB
small_1 AC 1 ms 256 KiB
small_2 AC 1 ms 256 KiB
small_3 AC 1 ms 256 KiB
small_4 AC 1 ms 256 KiB