UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#214011#2400. 椅子N50351ms42772kbC++114.2kb2024-11-14 22:32:012024-11-14 23:11:03

answer

//
//  na 2400-re.cpp
//  Competitive Programming
//
//  Created by m2 on 2024/11/14.
//

#include <stdio.h>
#include <iostream>
#include <vector>
#include <random>
#include <time.h>
using namespace std;
//#define RNDDATA
//#define BBBBIG
const int maxn = 2e5 + 5, maxm = 2e5 + 5;
#if defined(MAC_OS_VERSION_11_0) && !defined(BBBBIG)
const int maxv = 10 * 4, maxe = 10 * 8;
#else
const int maxv = maxm * 4, maxe = maxm * 8;
#endif
int dep[maxv], ec[maxe * 2], en, S, E, saved[maxe * 2];
vector<int> to[maxv], ei[maxv];
struct Edge{
    int u, v, w;
    Edge(int u, int v, int w): u(u), v(v), w(w) {}
    inline bool operator < (const Edge &other) const{
        return w > other.w;
    }
};
vector<Edge> es;
inline void real_edge(int u, int v, int w){
    to[u].push_back(v);
    to[v].push_back(u);
    ei[u].push_back(en);
    ei[v].push_back(en ^ 1);
    ec[en] = w;
    ec[en ^ 1] = 0;
    en += 2;
}
inline void edge(int u, int v, int w){
//    cerr << u << ' ' << v << ' ' << w << endl;
//    es.push_back(Edge(u, v, w));
    real_edge(u, v, w);
}
int que[maxv], qs, qe;
inline bool bfs(){
    for(int i = 0; i <= E; ++i)
        dep[i] = 0;
    dep[S] = 1;
    qs = 0;
    qe = 0;
    que[qe++] = S;
    int node, nn;
    while(qs < qe){
        node = que[qs++];
        for(int i = 0; i < to[node].size(); ++i){
            nn = to[node][i];
            if(!dep[nn] && ec[ei[node][i]] > 0){
                dep[nn] = dep[node] + 1;
                if(nn == E)
                    return true;
                que[qe++] = nn;
            }
        }
    }
    return false;
}
int dinic(int node, int flow){
    if(node == E)
        return flow;
    int unf = flow, nn, nw, nf;
    for(int i = 0; i < to[node].size(); ++i){
        nn = to[node][i];
        nw = ec[ei[node][i]];
        if(dep[nn] == dep[node] + 1 && nw > 0){
            nf = dinic(nn, min(nw, unf));
            if(!nf)
                dep[nn] = 0;
            unf -= nf;
            ec[ei[node][i]] -= nf;
            ec[ei[node][i] ^ 1] += nf;
            if(!unf)
                break;
        }
    }
    return flow - unf;
}
int n, m;
const int its_a_me = 4;
int main(){
    cin.tie(0)->sync_with_stdio(false);
    cin >> n >> m;
#ifdef MAC_OS_VERSION_11_0
    time_t st = clock();
#endif
    S = 0;
    E = m * 4 + 1;
    for(int i = 1; i <= m; ++i){
        edge(m * 3 + i, E, 1);
        edge(m * 2 + i, m * 3 + i, 1);
        if(i != 1)
            edge(m * 2 + i, m * 2 + i - 1, i - 1);
        edge(m + i, m * 3 + i, 1);
        if(i != m)
            edge(m + i, m + i + 1, m - i);
        edge(S, i, 1);
    }
#if defined(MAC_OS_VERSION_11_0) && defined(RNDDATA)
    mt19937 rnd(114514);
    uniform_int_distribution<> dist(1, m + 1);
//    if(its_a_me == 4)
//        cerr << "[ " << m / 3 << " " << m * 2 / 3 << " ]" << endl;
#endif
    for(int i = 1; i <= n; ++i){
        int l, r;
#if defined(MAC_OS_VERSION_11_0) && defined(RNDDATA)
        if(its_a_me == 1){
            l = dist(rnd);
            r = dist(rnd);
        }else if(its_a_me == 2){
            l = i;
            r = i;
        }else if(its_a_me == 3){
            l = i;
            r = n - i;
        }else if(its_a_me == 4){
            l = m / 3;
            r = m * 2 / 3;
        }
        if(l > r)
            swap(l, r);
#else
        cin >> l >> r;
#endif
        if(l != 0)
            edge(i, m * 2 + l, 1);
        if(r != m + 1)
            edge(i, m + r, 1);
    }
//    sort(es.begin(), es.end());
    int ans = 0;
    int ptr = 0;
//    for(int clim = (1 << 20); clim; clim >>= 1){
//        while(ptr < es.size() && es[ptr].w >= clim){
//            real_edge(es[ptr].u, es[ptr].v, es[ptr].w);
//            ++ptr;
//        }
        while(bfs()){
            ans += dinic(S, n);
//            for(int i = 0; i < en; ++i)
//                if(i & 1){
//                    saved[i] = ec[i];
//                    ec[i] = 0;
//                }
        }
//    }
    cout << n - ans << endl;
#ifdef MAC_OS_VERSION_11_0
    cerr << "time: " << double(clock() - st) / CLOCKS_PER_SEC * 1000 << " ms" << endl;
#endif
    return 0;
}

详细

小提示:点击横条可展开更详细的信息

Test #1:

score: 5
Accepted
time: 3ms
memory: 38776kb

input:

8 8
1 8
1 5
2 8
0 5
0 3
2 6
2 6
2 6

output:

1

result:

ok single line: '1'

Test #2:

score: 5
Accepted
time: 8ms
memory: 38780kb

input:

10 10
0 5
2 9
3 10
2 7
1 6
0 10
0 9
2 10
0 9
1 10

output:

2

result:

ok single line: '2'

Test #3:

score: 5
Accepted
time: 11ms
memory: 38788kb

input:

20 20
4 16
2 11
3 19
6 12
7 18
1 14
4 10
5 20
6 14
8 17
1 12
2 11
7 18
7 15
0 15
1 12
2 19
7 13
4 10...

output:

1

result:

ok single line: '1'

Test #4:

score: 5
Accepted
time: 4ms
memory: 38816kb

input:

96 93
2 67
5 61
4 74
15 68
3 63
40 91
14 58
6 66
9 57
18 85
13 63
40 85
17 89
16 73
10 72
15 74
15 6...

output:

7

result:

ok single line: '7'

Test #5:

score: 5
Accepted
time: 8ms
memory: 38824kb

input:

100 100
29 70
17 68
25 77
13 74
9 79
42 90
34 99
18 100
3 80
21 71
26 63
6 54
43 89
41 78
19 78
13 9...

output:

2

result:

ok single line: '2'

Test #6:

score: 5
Accepted
time: 9ms
memory: 39160kb

input:

952 954
182 871
114 769
110 694
91 741
22 509
53 841
124 858
16 465
160 789
24 720
96 939
56 689
313...

output:

64

result:

ok single line: '64'

Test #7:

score: 5
Accepted
time: 11ms
memory: 39184kb

input:

1000 1000
74 795
175 641
39 618
19 971
162 873
93 731
480 989
357 932
4 693
266 965
89 581
47 560
27...

output:

74

result:

ok single line: '74'

Test #8:

score: 5
Accepted
time: 51ms
memory: 40396kb

input:

4516 4690
665 4024
1062 3765
1573 4200
1035 4155
441 2678
31 3472
87 3450
146 2286
310 4267
1231 450...

output:

69

result:

ok single line: '69'

Test #9:

score: 5
Accepted
time: 63ms
memory: 40660kb

input:

5000 5000
62 4476
1146 3647
531 4569
1042 3464
2044 4817
2186 4584
2223 4892
1224 4761
1154 4943
147...

output:

250

result:

ok single line: '250'

Test #10:

score: 0
Wrong Answer
time: 55ms
memory: 41192kb

input:

10000 5000
1106 4454
1138 4746
926 4805
609 4507
259 4543
1435 4211
790 3399
528 3426
38 4665
87 404...

output:

5490

result:

wrong answer 1st lines differ - expected: '5347', found: '5490'

Test #11:

score: 5
Accepted
time: 128ms
memory: 42772kb

input:

10000 10000
2224 8599
3697 9779
1264 7760
266 8474
601 9386
5276 9907
4231 9619
2206 8589
3306 9731
...

output:

574

result:

ok single line: '574'

Test #12:

score: 0
Time Limit Exceeded

input:

93875 99655
0 25859
0 30798
0 89053
0 29230
0 93483
0 83280
0 47502
0 39669
0 69861
0 64184
0 35067
...

output:


result:


Test #13:

score: 0
Time Limit Exceeded

input:

100000 100000
0 50602
0 56129
0 65965
0 75241
0 71832
0 26413
0 79671
0 73842
0 78772
0 94149
0 3483...

output:


result:


Test #14:

score: 0
Time Limit Exceeded

input:

91057 96847
21419 89318
2406 89095
2941 51033
14888 77083
28023 74840
18260 62296
6297 51346
7735 88...

output:


result:


Test #15:

score: 0
Time Limit Exceeded

input:

100000 100000
16723 78322
7205 66894
9839 72285
7661 85725
38680 93140
6182 88375
30785 99006
38538 ...

output:


result:


Test #16:

score: 0
Time Limit Exceeded

input:

198495 197435
63738 165927
17757 117506
9207 170263
50748 141346
18132 120887
49285 188664
25304 190...

output:


result:


Test #17:

score: 0
Time Limit Exceeded

input:

199260 192470
22818 156104
9228 171776
43025 139453
39938 135662
18272 171006
68109 171295
28220 116...

output:


result:


Test #18:

score: 0
Time Limit Exceeded

input:

200000 200000
75002 167675
8656 181873
54606 156991
48075 167451
74414 194621
55633 180796
4565 1657...

output:


result:


Test #19:

score: 0
Time Limit Exceeded

input:

200000 200000
59298 170956
2760 194028
35447 153792
1945 163425
73195 176225
62065 185526
85886 1916...

output:


result:


Test #20:

score: 0
Time Limit Exceeded

input:

200000 200000
67496 171474
36806 170296
86759 193181
7951 171117
85324 184470
8949 171983
10465 1547...

output:


result: