Submission #1205970

#TimeUsernameProblemLanguageResultExecution timeMemory
1205970PagodePaivaClosing Time (IOI23_closing)C++20
0 / 100
32 ms5188 KiB
#include "closing.h"
#include<bits/stdc++.h>

using namespace std;

const int N = 3010;
long long l[N], r[N];
int n;
long long v[N];
int x, y;
long long k;

int max_score(int NN, int X, int Y, long long K,
              std::vector<int> U, std::vector<int> V, std::vector<int> W){
    n = NN;
    x = X;
    y = Y;
    k = K;
    for(int i = x-1;i >= 0;i--){
        l[i] = l[i+1] + (long long) W[i];
    }
    for(int i = x+1;i < n;i++){
        l[i] = l[i-1] + (long long) W[i-1];
    }
    for(int i = y-1;i >= 0;i--){
        r[i] = r[i+1] + (long long) W[i];
    }
    for(int i = y+1;i < n;i++){
        r[i] = r[i-1] + (long long) W[i-1];
    }
    int ans = 0;
    for(int r2 = 0;r2 < n;r2++){
        int l1 = 0, r1 = n-1;
        long long sum = 0;
        for(int i = 0;i < n;i++){
            sum += l[i];
            v[i] = l[i];
        }
        while(sum > k){
            if(l1 == r1){
                sum = 0;
                l1++;
            }
            else{
                long long v1 = (l1 == x ? -1e16 : v[l1]);
                long long v2 = (r1 == x ? -1e16 : v[r1]);
                if(v1 <= v2){
                    r1--;
                    sum -= v2;
                }
                else{
                    l1++;
                    sum -= v1;
                }
            }
        }
        ans = max(ans, r1-l1+1);
        long long custo = k;
        for(int l2 = r2;l2 >= 0;l2--){
            custo -= r[l2];
            if(custo < 0)
                break;
            if(l1 <= l2 and l2 <= r1)
                sum -= v[l2];
            v[l2] = max(0LL, l[l2]-r[l2]);
            if(l1 <= l2 and l2 <= r1)
                sum += v[l2];
            while(sum > custo){
                if(l1 == r1){
                    sum = 0;
                    l1++;
                }
                else{
                    long long v1 = (l1 == x ? -1e16 : v[l1]);
                    long long v2 = (r1 == x ? -1e16 : v[r1]);
                    if(v1 <= v2){
                        r1--;
                        sum -= v2;
                    }
                    else{
                        l1++;
                        sum -= v1;
                    }
                }
            }
            if(ans < r1-l1+1 + r2-l2+1){
               /* cout << r1 << ' ' << l1 << ' ' << r2 << ' ' << l2 << '\n';
                for(int i = 0;i < n;i++)
                    cout << v[i] << ' ';
                cout << '\n';*/
            }
            ans = max(ans, r1-l1+1 + r2-l2+1);
        }
    }
    for(int i = 0;i <= n;i++){
        l[i] = r[i] = v[i] = 0;
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...