답안 #171833

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
171833 2019-12-30T13:14:09 Z VEGAnn 결혼 문제 (IZhO14_marriage) C++14
64 / 100
1500 ms 3568 KB
#include <bits/stdc++.h>
#define sz(x) ((us)x.size())
#define PB push_back
#define MP make_pair
#define ft first
#define sd second
#define pii pair<us, us>
#define pi3 pair<pii, us>
#define MP3(a,b,c) MP(MP(a, b), c)
using namespace std;
typedef unsigned short us;
const us oo = 32000;
const us N = 32100;
const us K = 110;
const us PW = 20;

struct edge{
    us y;
    bool psh;

    edge(us _y, bool _p): y(_y), psh(_p) {}
};

vector<edge> edges;
queue<us> q;
vector<int> g[N];
us ans = 0, s, t, n, m, k, dst[N], ptr[N];

void add_edge(us x, us y){

    g[x].PB(sz(edges));
    edges.PB(edge(y, 0));

    g[y].PB(sz(edges));
    edges.PB(edge(x, 1));

}

bool bad(us l, us r, us v){
    if (v == s || v == t || v < m) return 0;
    return !(m + l <= v && v <= m + r);
}

bool bfs(us l, us r){
    fill(dst, dst + t + 1, oo);

    dst[s] = 0;
    while (sz(q)) q.pop();
    q.push(s);

    while (sz(q)){
        us v = q.front(); q.pop();

        for (int nm : g[v]){
            edge u = edges[nm];
            if (!bad(l, r, u.y) && !u.psh && dst[u.y] > dst[v] + 1){
                dst[u.y] = dst[v] + 1;
                q.push(u.y);
            }
        }
    }

    return (dst[t] < oo);
}

bool dfs(us v, bool pshd){
    if (pshd == 0) return 0;
    if (v == t) return pshd;
    for (; ptr[v] < sz(g[v]); ptr[v]++){
        int nm = g[v][ptr[v]];
        edge u = edges[nm];
        if (dst[u.y] != dst[v] + 1) continue;
        us nw = dfs(u.y, min(pshd, !u.psh));
        if (nw){
            edges[nm].psh = 1;
            edges[nm ^ 1].psh = 0;
            return nw;
        }
    }
    return 0;
}

bool ok(us l, us r){

    if (r - l + 1 < m) return 0;

    us flow = 0;

    for (us i = 0; i < m; i++) {
        int nm = g[s][i];
        flow += edges[nm].psh;
    }

    while (bfs(l, r)){
        fill(ptr, ptr + t + 1, 0);
        bool pshd = dfs(s, oo);
        while (pshd > 0){
            flow += pshd;
            pshd = dfs(s, oo);
        }
    }

    return (flow == m);
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);

    cin >> n >> m >> k;

    for (us i = 0; i < k; i++){
        us x, y; cin >> y >> x;
        x--; y--;
        add_edge(x, m + y);
    }

    s = n + m;
    t = n + m + 1;

    for (us i = 0; i < m; i++)
        add_edge(s, i);

    for (us i = 0; i < n; i++)
        add_edge(i + m, t);

    for (us l = 0, r = 0; l < n; l++){

        if (l + m - 1 >= n) break;

        while (r < n && !ok(l, r))
            r++;
        if (r >= n) break;
        ans += n - r;

        int nm = g[t][l];

        if (edges[nm].psh) continue;

        us pr = -1, cr = m + l;
        for (us it = 0; it < sz(g[cr]); it++){
            nm = g[cr][it];
            edge ed = edges[nm];

            if (ed.y != t && !ed.psh){
                pr = ed.y;
                break;
            }
        }

        nm = g[s][pr];
        edges[nm].psh = 0;
        edges[nm ^ 1].psh = 1;
    }

    cout << ans;

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 1016 KB Output is correct
2 Correct 3 ms 1016 KB Output is correct
3 Correct 3 ms 1144 KB Output is correct
4 Correct 3 ms 1144 KB Output is correct
5 Correct 3 ms 1016 KB Output is correct
6 Correct 3 ms 1144 KB Output is correct
7 Correct 3 ms 1144 KB Output is correct
8 Correct 3 ms 1016 KB Output is correct
9 Correct 3 ms 1144 KB Output is correct
10 Correct 3 ms 1144 KB Output is correct
11 Correct 3 ms 1144 KB Output is correct
12 Correct 3 ms 1016 KB Output is correct
13 Correct 3 ms 1168 KB Output is correct
14 Correct 3 ms 1144 KB Output is correct
15 Correct 3 ms 1144 KB Output is correct
16 Correct 3 ms 1140 KB Output is correct
17 Correct 3 ms 1020 KB Output is correct
18 Correct 3 ms 1152 KB Output is correct
19 Correct 5 ms 1144 KB Output is correct
20 Correct 4 ms 1144 KB Output is correct
21 Correct 3 ms 1144 KB Output is correct
22 Correct 3 ms 1148 KB Output is correct
23 Correct 3 ms 1144 KB Output is correct
24 Correct 3 ms 1144 KB Output is correct
25 Incorrect 71 ms 1528 KB Output isn't correct
26 Incorrect 20 ms 1272 KB Output isn't correct
27 Correct 4 ms 1144 KB Output is correct
28 Correct 4 ms 1144 KB Output is correct
29 Correct 21 ms 1400 KB Output is correct
30 Correct 17 ms 1400 KB Output is correct
31 Incorrect 73 ms 2544 KB Output isn't correct
32 Correct 25 ms 1272 KB Output is correct
33 Correct 11 ms 1144 KB Output is correct
34 Correct 17 ms 1272 KB Output is correct
35 Runtime error 6 ms 2296 KB Execution killed with signal 11 (could be triggered by violating memory limits)
36 Runtime error 7 ms 2168 KB Execution killed with signal 11 (could be triggered by violating memory limits)
37 Incorrect 238 ms 2672 KB Output isn't correct
38 Runtime error 8 ms 2244 KB Execution killed with signal 11 (could be triggered by violating memory limits)
39 Incorrect 692 ms 2040 KB Output isn't correct
40 Correct 651 ms 1912 KB Output is correct
41 Execution timed out 1554 ms 2240 KB Time limit exceeded
42 Incorrect 1036 ms 2512 KB Output isn't correct
43 Incorrect 291 ms 3568 KB Output isn't correct
44 Runtime error 6 ms 2296 KB Execution killed with signal 11 (could be triggered by violating memory limits)
45 Execution timed out 1580 ms 3508 KB Time limit exceeded
46 Runtime error 6 ms 2296 KB Execution killed with signal 11 (could be triggered by violating memory limits)
47 Runtime error 6 ms 2268 KB Execution killed with signal 11 (could be triggered by violating memory limits)
48 Runtime error 6 ms 2168 KB Execution killed with signal 11 (could be triggered by violating memory limits)
49 Runtime error 7 ms 2140 KB Execution killed with signal 11 (could be triggered by violating memory limits)
50 Execution timed out 1580 ms 3160 KB Time limit exceeded