제출 #1217999

#제출 시각아이디문제언어결과실행 시간메모리
1217999qwushaClosing Time (IOI23_closing)C++17
21 / 100
1096 ms9796 KiB
#include <bits/stdc++.h>
#include "closing.h"
using namespace std;
#define fi first
#define se second
typedef long long ll;
typedef long double ld;
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
ll inf = 1e18;

ll n, x, y;



int max_score(int N, int X, int Y, ll K, vector<int> U, vector<int> V, vector<int> W) {
    n = N;
    x = X;
    y = Y;
    vector<ll> dx(n), dy(n);
    dx[x] = 0;
    for (ll i = x - 1; i >= 0; i--) {
        dx[i] = dx[i + 1] + W[i];
    }
    for (ll i = x + 1; i < n; i++) {
        dx[i] = dx[i - 1] + W[i - 1];
    }
    dy[y] = 0;
    for (ll i = y - 1; i >= 0; i--) {
        dy[i] = dy[i + 1] + W[i];
    }
    for (ll i = y + 1; i < n; i++) {
        dy[i] = dy[i - 1] + W[i - 1];
    }
    int res = 0;
    for (ll rx = x; rx < n; rx++) {
        for (ll ly = y; ly >= 0; ly--) {
            vector<ll> d(n, -1);
            ll cur = 0;
            ll k = K;
            int cnt = 0;
            for (ll i = x; i <= rx; i++) {
                d[i] = max(d[i], dx[i]);
            }
            for (ll i = y; i >= ly; i--) {
                d[i] = max(d[i], dy[i]);
            }
            for (int i = 0; i < n; i++) {
                if (d[i] != -1) {
                    cur += d[i];
                    if (d[i] >= dy[i] && (i > y || (ly <= i && i <= y)))
                        cnt++;
                    if (d[i] >= dx[i] && (i < x || (x <= i && i <= rx)))
                        cnt++;
                }
            }
            if (cur > k) {
                continue;
            }
            k -= cur;
            ll lx = min(x - 1, ly - 1);
            ll ry = max(y + 1, rx + 1);
            while (lx >= 0 && ry < n) {
                if (dx[lx] < dy[ry]) {
                    if (k >= dx[lx]) {
                        cnt++;
                        k -= dx[lx];
                    }
                    lx--;
                } else {
                    if (k >= dy[ry]) {
                        cnt++;
                        k -= dy[ry];
                    }
                    ry++;
                }
            }
            while (lx >= 0) {
                if (k >= dx[lx]) {
                    cnt++;
                    k -= dx[lx];
                }
                lx--;
            }
            while (ry < n) {
                if (k >= dy[ry]) {
                    cnt++;
                    k -= dy[ry];
                }
                ry++;
            }
            res = max(res, cnt);
        }
    }
    return res;
}
#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...