QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#703721#1078. Job PostingsTheZoneAC ✓505ms4040kbC++206.4kb2024-11-02 18:19:152024-11-02 18:19:42

Judging History

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

  • [2024-11-02 18:19:42]
  • 评测
  • 测评结果:AC
  • 用时:505ms
  • 内存:4040kb
  • [2024-11-02 18:19:15]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//#define int ll
#define rep(i,a,b) for(int i = a; i < (b); i++)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define PB push_back
#define FS first
#define SD second
typedef pair<int, int> pii;
typedef vector<int> vi;
template<class X, class Y> X cmx(X &a, Y b) { a = max<X>(a, b); }
#define ary(k) array<int, k>

pair<int, vi> hungarian(const vector<vi> &a) {
    if (a.empty()) return {0, {}};
    int n = sz(a) + 1, m = sz(a[0]) + 1;
    vi u(n), v(m), p(m), ans(n-1);
    rep(i,1,n) {
        p[0] = i;
        int j0 = 0;
        vi dist(m, INT_MAX), pre(m, -1);
        vector<bool> done(m+1);
        do {
            done[j0] = true;
            int i0 = p[j0], j1, delta = INT_MAX;
            rep(j,1,m) if (!done[j]) {
                    auto cur = a[i0 - 1][j-1] - u[i0] - v[j];
                    if (cur < dist[j]) dist[j] = cur, pre[j] = j0;
                    if (dist[j] < delta) delta = dist[j], j1 = j;
                }
            rep(j, 0, m) {
                if (done[j]) u[p[j]] += delta, v[j] -= delta;
                else dist[j] -= delta;
            }
            j0 = j1;
        } while (p[j0]);
        while (j0) {
            int j1 = pre[j0];
            p[j0] = p[j1], j0 = j1;
        }
    }
    rep(j,1,m) if (p[j]) ans[p[j] - 1] = j - 1;
    return {-v[0], ans};
}

int pocz[1002], kon[1002];

signed main() {
	cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit);
    while (true) {
        int n, m;
        cin >> m >> n;
        if (n == 0 && m == 0)
            break;
        int aktu = 0;
        for (int i = 0; i < m; i++) {
            int p;
            cin >> p;
            pocz[i] = aktu;
            kon[i] = aktu+p-1;
            aktu += p;
        }
        vector<vi> cost(n, vi(aktu, 100000));
        for (int i = 0; i < n; i++) {
            int y;
            cin >> y;
            for (int j = 0; j < 4; j++) {
                int c;
                cin >> c;
                for (int ii = pocz[c]; ii <= kon[c]; ii++) {
                    cost[i][ii] = -(y*4-j);
                }
            }
        }
        int res = hungarian(cost).FS;
        cout << -res << "\n";
    }
}
/*#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//#define int ll
#define rep(i,a,b) for(int i = a; i < (b); i++)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define PB push_back
#define FS first
#define SD second
typedef pair<int, int> pii;
typedef vector<int> vi;
template<class X, class Y> X cmx(X &a, Y b) { a = max<X>(a, b); }
#define ary(k) array<int, k>

pair<int, vi> hungarian(const vector<vi> &a) {
    if (a.empty()) return {0, {}};
    int n = sz(a) + 1, m = sz(a[0]) + 1;
    vi u(n), v(m), p(m), ans(n-1);
    rep(i,1,n) {
        p[0] = i;
        int j0 = 0;
        vi dist(m, INT_MAX), pre(m, -1);
        vector<bool> done(m+1);
        do {
            done[j0] = true;
            int i0 = p[j0], j1, delta = INT_MAX;
            rep(j,1,m) if (!done[j]) {
                    auto cur = a[i0 - 1][j-1] - u[i0] - v[j];
                    if (cur < dist[j]) dist[j] = cur, pre[j] = j0;
                    if (dist[j] < delta) delta = dist[j], j1 = j;
                }
            rep(j, 0, m) {
                if (done[j]) u[p[j]] += delta, v[j] -= delta;
                else dist[j] -= delta;
            }
            j0 = j1;
        } while (p[j0]);
        while (j0) {
            int j1 = pre[j0];
            p[j0] = p[j1], j0 = j1;
        }
    }
    rep(j,1,m) if (p[j]) ans[p[j] - 1] = j - 1;
    return {-v[0], ans};
}

int pocz[1002], kon[1002];

signed main() {
	cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit);
    while (true) {
        int n, m;
        cin >> m >> n;
        if (n == 0 && m == 0)
            break;
        int aktu = 0;
        for (int i = 0; i < m; i++) {
            int p;
            cin >> p;
            pocz[i] = aktu;
            kon[i] = aktu+p-1;
            aktu += p;
        }
        vector<vi> cost(n, vi(aktu, 100000));
        for (int i = 0; i < n; i++) {
            int y;
            cin >> y;
            for (int j = 0; j < 4; j++) {
                int c;
                cin >> c;
                for (int ii = pocz[c]; ii <= kon[c]; ii++) {
                    cost[i][ii] = -(y*4-j);
                }
            }
        }
        int res = hungarian(cost).FS;
        cout << -res << "\n";
    }
}#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//#define int ll
#define rep(i,a,b) for(int i = a; i < (b); i++)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define PB push_back
#define FS first
#define SD second
typedef pair<int, int> pii;
typedef vector<int> vi;
template<class X, class Y> X cmx(X &a, Y b) { a = max<X>(a, b); }
#define ary(k) array<int, k>

pair<int, vi> hungarian(const vector<vi> &a) {
    if (a.empty()) return {0, {}};
    int n = sz(a) + 1, m = sz(a[0]) + 1;
    vi u(n), v(m), p(m), ans(n-1);
    rep(i,1,n) {
        p[0] = i;
        int j0 = 0;
        vi dist(m, INT_MAX), pre(m, -1);
        vector<bool> done(m+1);
        do {
            done[j0] = true;
            int i0 = p[j0], j1, delta = INT_MAX;
            rep(j,1,m) if (!done[j]) {
                    auto cur = a[i0 - 1][j-1] - u[i0] - v[j];
                    if (cur < dist[j]) dist[j] = cur, pre[j] = j0;
                    if (dist[j] < delta) delta = dist[j], j1 = j;
                }
            rep(j, 0, m) {
        cin >> m >> n;
        if (n == 0 && m == 0)
            break;
        int aktu = 0;
        for (int i = 0; i < m; i++) {
            int p;
            cin >> p;
            pocz[i] = aktu;
            kon[i] = aktu+p-1;
            aktu += p;
        }
        vector<vi> cost(n, vi(aktu, 100000));
        for (int i = 0; i < n; i++) {
            int y;
            cin >> y;
            for (int j = 0; j < 4; j++) {
                int c;
                cin >> c;
                for (int ii = pocz[c]; ii <= kon[c]; ii++) {
                    cost[i][ii] = -(y*4-j);
                }
            }
        }
        int res = hungarian(cost).FS;
        cout << -res << "\n";
    }
}k
k
k
k
k
k
k
k
k
l
k
k





















j*/

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 505ms
memory: 4040kb

input:

4 4
1
1
1
1
1 0 1 2 3
2 0 1 2 3
3 0 1 2 3
3 0 1 2 3
4 4
4
4
4
4
1 0 1 2 3
2 0 1 2 3
3 0 1 2 3
3 0 1 2 3
4 4
1
1
1
1
3 0 1 2 3
3 3 0 1 2
3 2 3 0 1
3 1 2 3 0
4 5
1
1
1
10
3 1 2 3 0
3 2 3 0 1
3 3 0 1 2
3 0 1 2 3
3 1 2 3 0
70 70
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
...

output:

30
36
48
58
840
208
536
24
236
272
404
460
540
112
244
336
136
104
536
572
464
400
392
56
104
360
236
320
476
584
88
224
388
460
352
272
108
216
632
596
572
368
12
20
516
88
108
12
452
152
236
108
284
224
420
236
48
164
220
416
384
500
252
548
160
20
136
304
64
452
172
264
568
488
584
400
80
40
332
...

result:

ok 5009 lines