답안 #779027

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
779027 2023-07-11T06:36:35 Z 이동현(#10002) Bodyguards (CEOI10_bodyguards) C++17
0 / 100
101 ms 15924 KB
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#define int long long
using namespace std;

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

    int r, c;
    cin >> r;
    vector<vector<int>> a(r, vector<int>(2));
    for(int i = 0; i < r; ++i){
        cin >> a[i][0] >> a[i][1];
    }
    cin >> c;
    vector<vector<int>> b(c, vector<int>(2));
    for(int i = 0; i < c; ++i){
        cin >> b[i][0] >> b[i][1];
    }

    sort(a.begin(), a.end());
    sort(b.begin(), b.end());
    reverse(b.begin(), b.end());
    vector<vector<int>> vc = {{b[0][0] * b[0][1], b[0][1], b[0][1]}};
    int j = 1;
    auto upd = [&](int minus, int cnt){
        while((int)vc.size() > 1){
            int sz = (int)vc.size();
            // if(vc[sz - 2][0] - minus * vc[sz - 2][1] < 0 || vc[sz - 1][0] - minus * (cnt - vc[sz - 2][2]) < 0){
            //     break;
            // }
            int v1 = (vc[sz - 2][0] - minus * vc[sz - 2][1]) / vc[sz - 2][1];
            int v2 = (vc[sz - 1][0] - minus * (cnt - vc[sz - 2][2])) / vc[sz - 1][1];
            if(v1 > v2){
                break;
            }
            vc[sz - 2][0] += vc[sz - 1][0];
            vc[sz - 2][1] += vc[sz - 1][1];
            vc[sz - 2][2] += vc[sz - 1][1];
            vc.pop_back();
        }
    };
    for(int i = 0; i < r; ++i){
        upd(a[i][1], a[i][0]);
        while(j < c){
            if(vc.back()[2] >= a[i][0]){
                break;
            }
            vc.push_back({b[j][0] * b[j][1], b[j][1], vc.back()[2] + b[j][1]});
            ++j;
            upd(a[i][1], a[i][0]);
        }
        if(vc.back()[2] < a[i][0]){
            cout << "0\n";
            return 0;
        }
        while(j < c){
            int sz = (int)vc.size();
            int psz = (sz >= 2 ? vc[sz - 2][2] : 0);
            int v1 = (vc[sz - 1][0] - a[i][1] * (a[i][0] - psz)) / vc[sz - 1][1];
            // cout << "MJ " << j << ' ' << v1 << ' ' << b[j][0] << endl;
            if(v1 > b[j][0]){
                break;
            }
            vc[sz - 1][0] += b[j][0] * b[j][1];
            vc[sz - 1][1] += b[j][1];
            vc[sz - 1][2] += b[j][1];
            ++j;
            upd(a[i][1], a[i][0]);
        }

        int sz = (int)vc.size();
        for(int k = 0; k < sz - 1; ++k){
            vc[k][0] -= vc[k][1] * a[i][1];
        }
        int psz = (sz >= 2 ? vc[sz - 2][2] : 0);
        vc[sz - 1][0] -= a[i][1] * (a[i][0] - psz);

        for(auto&k:vc){
            if(k[0] < 0){
                cout << "0\n";
                return 0;
            }
        }
        
        // for(auto&k:vc){
        //     cout << k[0] << ' ' << k[1] << ' ' << k[2] << endl;
        // }
        // cout << endl;
    }

    assert(j == c);
    for(auto&k:vc){
        assert(k[0] == 0);
    }
    cout << "1\n";
    
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
9 Correct 1 ms 212 KB Output is correct
10 Correct 0 ms 212 KB Output is correct
11 Correct 1 ms 212 KB Output is correct
12 Correct 0 ms 212 KB Output is correct
13 Incorrect 1 ms 212 KB Output isn't correct
14 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Incorrect 0 ms 212 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 212 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 0 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Incorrect 1 ms 340 KB Output isn't correct
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Incorrect 1 ms 340 KB Output isn't correct
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Incorrect 0 ms 212 KB Output isn't correct
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 852 KB Output is correct
2 Incorrect 2 ms 596 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 4140 KB Output is correct
2 Incorrect 17 ms 3100 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 71 ms 8804 KB Output is correct
2 Incorrect 46 ms 7404 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 101 ms 15924 KB Output is correct
2 Correct 93 ms 15664 KB Output is correct
3 Incorrect 98 ms 13780 KB Output isn't correct
4 Halted 0 ms 0 KB -