Submission #1341506

#TimeUsernameProblemLanguageResultExecution timeMemory
1341506LittleCubeBitaro the Brave 3 (JOI25_brave3)C++20
100 / 100
550 ms179584 KiB
#include <bits/stdc++.h>
using namespace std;

int N;
long long L;
long long T;
long long S[6001], H[6001], P[6002];
long long M[1'000'001];
long long A[10'000'001], B[10'000'001];
int Q;

long long ceil(long long p, long long q)
{
    return (p - 1) / q + 1;
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    cin >> N >> L >> T;
    for (int i = 1; i <= N; i++)
        cin >> S[i] >> H[i] >> P[i];

    vector<int> ord(N + 2);
    iota(ord.begin(), ord.end(), 0);
    sort(ord.begin() + 1, ord.end() - 1, [&](int i, int j)
         { return P[i] > P[j]; });

    vector<pair<long long, long long>> monsters = {make_pair(T, 0LL)};
    for (int i = 1; i <= N; i++)
    {
        vector<array<long long, 3>> segments;
        pair<long long, long long> next_monster = make_pair(S[ord[i]], H[ord[i]]);
        monsters.insert(lower_bound(monsters.begin(), monsters.end(), next_monster), next_monster);
        assert(is_sorted(monsters.begin(), monsters.end()));

        for (int j = 0; j < i; j++)
        {
            long long cur = monsters[j].first;
            long long next = monsters[j + 1].first;
            long long weights = monsters[j].second;
            long long connect_diff = ceil(next - cur, weights);
            while (!segments.empty() && connect_diff >= segments.back()[0])
            {
                cur = segments.back()[1];
                weights += segments.back()[2];
                segments.pop_back();
                connect_diff = ceil(next - cur, weights);
            }
            segments.emplace_back(array{connect_diff, cur, weights});
        }
        reverse(segments.begin(), segments.end());
        long long last = T;
        for (auto [diff, cur, weights] : segments)
        {
            // cerr << i << ": " << diff << " starting from " << cur << " with sum " << acc_weights << '\n';
            if (diff <= L)
            {
                long long a = weights * (P[ord[i]] - P[ord[i + 1]]);
                long long b = (diff * weights - (last - cur)) * (P[ord[i]] - P[ord[i + 1]]) - diff * a;
                last = cur;
                A[diff] += a;
                B[diff] += b;
            }
        }
    }

    
    for (int l = 1; l <= L; l++)
        A[l] += A[l - 1];
    for (int l = 1; l <= L; l++)
        B[l] += B[l - 1];
    
    cin >> Q;
    for (int i = 1; i <= Q; i++)
    {
        cin >> M[i];
        int l = 0, r = L;
        while (l < r)
        {
            int mid = (l + r + 1) / 2;
            if (M[i] < A[mid] * mid + B[mid])
                r = mid - 1;
            else 
                l = mid;
        }
        cout << l << '\n';
    }
}
#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...