Submission #1330843


Source Code Expand

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)
using namespace std; void _main(); int main() { cin.tie(0); ios::sync_with_stdio(false); _main(); }
//---------------------------------------------------------------------------------------------------
template<int NV, class V> struct MinCostFlow {
    struct edge { int to, cap, rev; V cost;
        edge(int a, int b, V c, int d) { to = a; cap = b; cost = c; rev = d; } };
    vector <edge> g[NV]; V h[NV], dist[NV]; int prevv[NV], preve[NV];
    void add_edge(int from, int to, int cap, V cost) {
        g[from].push_back(edge(to, cap, cost, g[to].size() ));
        g[to].push_back(edge(from, 0, -cost, g[from].size() - 1 )); }
    V mincost(int s, int t, int f) { V res = 0, i; for (i = 0; i < NV; i++) h[i] = 0;
        while (f > 0) { int d = f; deque <pair<int, int> > q;
        for (i = 0; i < NV; i++) dist[i] = 1e9; dist[s] = 0; q.push_back(make_pair(0, s));
        while (!q.empty()) { int c = q.front().first; int v = q.front().second; q.pop_front();
        if (dist[v] < c) continue; for (i = 0; i < g[v].size(); i++) { edge &e = g[v][i];
        if (e.cap > 0 && dist[e.to] > dist[v] + e.cost + h[v] - h[e.to]) {
            dist[e.to] = dist[v] + e.cost + h[v] - h[e.to]; prevv[e.to] = v; preve[e.to] = i;
        if (dist[e.to] == dist[v] + 1) { q.push_back(make_pair(dist[e.to], e.to)); } else {
        q.push_front(make_pair(dist[e.to], e.to)); } } } }
        if (dist[t] == 1e9) return -1; for (i = 0; i < NV; i++) h[i] += dist[i];
        for (i = t; i != s; i = prevv[i]) d = min(d, g[prevv[i]][preve[i]].cap); f -= d; 
        res += d * h[t]; for (i = t; i != s; i = prevv[i]) { edge &e = g[prevv[i]][preve[i]];
        e.cap -= d; g[i][e.rev].cap += d; } } return res; } };
/*---------------------------------------------------------------------------------------------------
            ∧_∧  
      ∧_∧  (´<_` )  Welcome to My Coding Space!
     ( ´_ゝ`) /  ⌒i     
    /   \     | |     
    /   / ̄ ̄ ̄ ̄/  |  
  __(__ニつ/     _/ .| .|____  
     \/____/ (u ⊃  
---------------------------------------------------------------------------------------------------*/



int N, M;
pair<int, int> A[50], B[50];
int D[50];
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N >> M;
    rep(i, 0, N) {
        string s; int x, y;
        cin >> s >> x >> y;
        A[i] = { x, y };
    }
    map<int, vector<int>> dic;
    rep(i, 0, M) {
        string s; int m, x, y;
        cin >> s >> m >> x >> y;
        B[i] = { x, y };
        D[i] = m;
        dic[m].push_back(i);
    }

    int K = min(N, M);
    int cnt = 0;

    MinCostFlow<110, int> mcf;
    int s = N + M, t = N + M + 1, tt = N + M + 2;

    for (auto ite = dic.rbegin(); ite != dic.rend(); ite++) {
        int ma = ite->first;
        auto v = ite->second;


        if (cnt + v.size() < K) {
            for (int i : v) mcf.add_edge(i + N, t, 1, 0);
            cnt += v.size();
        }
        else if (cnt < K) {
            for (int i : v) mcf.add_edge(i + N, tt, 1, 0);
            mcf.add_edge(tt, t, K - cnt, 0);
            cnt += v.size();
        }
    }

    rep(i, 0, N) mcf.add_edge(s, i, 1, 0);
    rep(i, 0, N) rep(j, 0, M) {
        int d = abs(A[i].first - B[j].first) + abs(A[i].second - B[j].second);
        if (D[j] == 0) d = 0;
        mcf.add_edge(i, j + N, 1, d);
    }

    cout << mcf.mincost(s, t, K) << endl;
}

Submission Info

Submission Time
Task F - 3人の騎士と1匹の犬
User hamayanhamayan
Language C++14 (GCC 5.4.1)
Score 100
Code Size 3725 Byte
Status AC
Exec Time 6 ms
Memory 384 KB

Judge Result

Set Name All
Score / Max Score 100 / 100
Status
AC × 23
Set Name Test Cases
All 00-sample, 01-minimum, 02-maximum, 50-random-00, 50-random-01, 50-random-02, 50-random-03, 50-random-04, 50-random-05, 50-random-06, 50-random-07, 50-random-08, 50-random-09, 50-random-10, 50-random-11, 50-random-12, 50-random-13, 50-random-14, 50-random-15, 50-random-16, 50-random-17, 50-random-18, 50-random-19
Case Name Status Exec Time Memory
00-sample AC 1 ms 256 KB
01-minimum AC 1 ms 256 KB
02-maximum AC 6 ms 384 KB
50-random-00 AC 2 ms 384 KB
50-random-01 AC 2 ms 256 KB
50-random-02 AC 2 ms 384 KB
50-random-03 AC 2 ms 256 KB
50-random-04 AC 3 ms 384 KB
50-random-05 AC 1 ms 256 KB
50-random-06 AC 2 ms 256 KB
50-random-07 AC 1 ms 256 KB
50-random-08 AC 1 ms 256 KB
50-random-09 AC 1 ms 256 KB
50-random-10 AC 1 ms 256 KB
50-random-11 AC 2 ms 384 KB
50-random-12 AC 2 ms 384 KB
50-random-13 AC 1 ms 256 KB
50-random-14 AC 1 ms 256 KB
50-random-15 AC 1 ms 256 KB
50-random-16 AC 1 ms 256 KB
50-random-17 AC 1 ms 256 KB
50-random-18 AC 1 ms 256 KB
50-random-19 AC 4 ms 384 KB