UOJ Logo

NOI.AC

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#212720#3830. Deam25392076ms3028kbC++112.4kb2024-10-20 10:04:052024-10-20 12:39:35

answer

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

typedef long long ll;


bool check_k0(int x, int n, int m, const vector<int> &a) {
    ll operations_needed = 0;
    vector<ll> diff(n + 2, 0);
    ll current = 0;
    for(int j=1; j<=n; ++j){
        current += diff[j];
        if(current < a[j-1]){
            ll need = a[j-1] - current;
            operations_needed += need;
            if(operations_needed > m) return false;
            int s = min(j + x, n);
            diff[j] += need;
            diff[s +1] -= need;
            current += need;
        }
    }
    return operations_needed <= m;
}


bool check_k1(int x, int n, int m, const vector<int> &a){
    ll max_required_x = 0;
    for(int j=1; j<=n; ++j){
        
        ll required = ( (ll)a[j-1] + m -1 ) / m + j -1;
        if(x < required){
            return false;
        }
    }
    return true;
}


bool check_k2(int x, int n, int m, const vector<int> &a){
    ll operations_needed = 0;
    
    vector<ll> add(n + 2, 0);
    vector<ll> dec(n + 2, 0);
    ll current_sum = 0;
    for(int j=1; j<=n; ++j){
        current_sum += add[j];
        if(j > x){
            current_sum -= dec[j];
        }
        if(current_sum < a[j-1]){
            ll need = a[j-1] - current_sum;
            operations_needed += need;
            if(operations_needed > m) return false;
            
            add[j] += need * (ll)x;
            if(j + x <= n){
                dec[j + x] += need;
            }
            current_sum += need * (ll)x;
        }
    }
    return operations_needed <= m;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    int n, m, k;
    cin >> n >> m >> k;
    vector<int> a(n);
    for(auto &x : a) cin >> x;
    
    
    int left = 0, right = 200000; 
    int answer = -1;
    while(left <= right){
        int mid = left + (right - left)/2;
        bool feasible = false;
        if(k ==0){
            feasible = check_k0(mid, n, m, a);
        }
        else if(k ==1){
            feasible = check_k1(mid, n, m, a);
        }
        else if(k ==2){
            feasible = check_k2(mid, n, m, a);
        }
        if(feasible){
            answer = mid;
            right = mid -1;
        }
        else{
            left = mid +1;
        }
    }
    cout << answer;
}

Details

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

Subtask #1:

score: 5
Accepted

Test #1:

score: 5
Accepted
time: 0ms
memory: 1252kb

input:

5 2 0
1 4 2 4 2

output:

-1

result:

ok 1 number(s): "-1"

Test #2:

score: 0
Accepted
time: 0ms
memory: 1244kb

input:

5 4 0
3 3 3 2 4

output:

4

result:

ok 1 number(s): "4"

Test #3:

score: 0
Accepted
time: 1ms
memory: 1248kb

input:

5 3 0
5 2 2 4 2

output:

-1

result:

ok 1 number(s): "-1"

Test #4:

score: 0
Accepted
time: 0ms
memory: 1248kb

input:

5 5 0
5 4 1 3 2

output:

4

result:

ok 1 number(s): "4"

Test #5:

score: 0
Accepted
time: 0ms
memory: 1248kb

input:

5 2 0
5 4 2 4 4

output:

-1

result:

ok 1 number(s): "-1"

Subtask #2:

score: 15
Accepted

Test #6:

score: 15
Accepted
time: 8ms
memory: 2364kb

input:

100000 3 0
55571 62024 7086 67802 12577 42004 72323 45260 40287 39641 64847 42428 20318 80027 1675 1...

output:

-1

result:

ok 1 number(s): "-1"

Test #7:

score: 0
Accepted
time: 9ms
memory: 2368kb

input:

100000 8 0
36036 57465 41887 17317 60373 61269 46492 67963 2549 76969 65274 49046 45876 28759 90924 ...

output:

-1

result:

ok 1 number(s): "-1"

Test #8:

score: 0
Accepted
time: 8ms
memory: 2368kb

input:

100000 345779 0
77937 16610 76642 46218 97870 25174 72710 41405 46404 77129 58889 92261 62956 90112 ...

output:

33331

result:

ok 1 number(s): "33331"

Test #9:

score: 0
Accepted
time: 10ms
memory: 2368kb

input:

100000 130400 0
20765 84750 25569 4034 50808 69305 81243 22986 10531 40222 39994 26549 22297 82520 6...

output:

99997

result:

ok 1 number(s): "99997"

Test #10:

score: 0
Accepted
time: 3ms
memory: 2368kb

input:

100000 912222 0
8745 38207 60092 71722 52971 57093 95705 81528 46159 5367 17799 81004 56400 92268 70...

output:

11107

result:

ok 1 number(s): "11107"

Subtask #3:

score: 0
Wrong Answer

Test #11:

score: 10
Accepted
time: 0ms
memory: 1252kb

input:

1000 1 1
993 705 891 648 406 9 983 913 370 408 607 47 85 199 767 448 723 255 253 302 754 135 641 726...

output:

1991

result:

ok 1 number(s): "1991"

Test #12:

score: -10
Wrong Answer
time: 0ms
memory: 1256kb

input:

1000 529 1
321 273 256 430 151 307 590 682 756 267 100 169 963 681 121 604 781 631 573 463 50 114 36...

output:

1001

result:

wrong answer 1st numbers differ - expected: '56', found: '1001'

Subtask #4:

score: 0
Wrong Answer

Test #16:

score: 0
Wrong Answer
time: 26ms
memory: 1588kb

input:

100000 4 1
10156 27005 39480 62054 63362 28009 65831 14391 93683 7991 17027 26313 1403 15929 30567 1...

output:

124742

result:

wrong answer 1st numbers differ - expected: '91939', found: '124742'

Subtask #5:

score: 0
Wrong Answer

Test #21:

score: 0
Wrong Answer
time: 0ms
memory: 1268kb

input:

1000 169 2
853 394 985 195 859 84 227 50 641 365 409 407 845 112 7 582 920 965 590 869 550 781 40 44...

output:

-1

result:

wrong answer 1st numbers differ - expected: '26', found: '-1'

Subtask #6:

score: 0
Wrong Answer

Test #26:

score: 0
Wrong Answer
time: 11ms
memory: 3028kb

input:

100000 31778 2
9482 16920 65207 41338 19891 97532 56865 946 56851 5908 19270 8065 53369 97241 69805 ...

output:

5

result:

wrong answer 1st numbers differ - expected: '93', found: '5'