Submission #1339970

#TimeUsernameProblemLanguageResultExecution timeMemory
1339970AndreyCollecting Stamps 4 (JOI25_stamps4)C++20
100 / 100
778 ms108300 KiB
#include<bits/stdc++.h>
using namespace std;

vector<long long> pos[500001];
vector<long long> idk(1000001);

void upd(long long a) {
    while(a < idk.size()) {
        idk[a]++;
        a+=(a&(-a));
    }
}

long long calc(long long a) {
    long long c = 0,sb = 0;
    for(long long i = 20; i >= 0; i--) {
        if(c+(1 << i) <= a) {
            c+=(1 << i);
            sb+=idk[c];
        }
    }
    return sb;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    long long n,x,sb = 0,z = 0;
    cin >> n >> x;
    sb = n*(n+1)/2;
    vector<long long> haha(2*n+1);
    vector<long long> cos(2*n+1);
    vector<long long> br(n+1);
    vector<long long> br2(n+1);
    vector<long long> bruh(2*n+1);
    for(long long i = 1; i <= 2*n; i++) {
        cin >> haha[i];
        pos[haha[i]].push_back(i);
    }
    for(long long i = 1; i <= 2*n; i++) {
        cin >> cos[i];
    }
    for(long long i = 1; i <= 2*n; i++) {
        long long a = haha[i];
        if(pos[a][1] == i) {
            br[a] = calc(i)-calc(pos[a][0]);
            sb+=br[a];
            long long c = pos[a][1]-pos[a][0]-1-br[a]*2;
            z+=c;
            br2[a] = n-1-br[a]-c;
            upd(pos[a][0]);
        }
    }
    sb+=z/2;
    bruh[1] = sb;
    for(long long i = 1; i < 2*n; i++) {
        long long a = haha[i];
        if(pos[a][0] == i) {
            sb+=br2[a]-br[a];
        }
        else {
            sb+=br[a]-br2[a];
        }
        bruh[i+1] = sb;
    }
    vector<pair<long long,long long>> banana(0);
    for(long long i = 1; i <= 2*n; i++) {
        banana.push_back({bruh[i],cos[i]});
    }
    sort(banana.begin(),banana.end());
    vector<long long> pr(banana.size()+1,LLONG_MAX);
    vector<long long> su(banana.size()+1,LLONG_MAX);
    for(long long i = 0; i < banana.size(); i++) {
        pr[i+1] = min(pr[i],banana[i].second-banana[i].first*x);
    }
    for(long long i = banana.size()-1; i >= 0; i--) {
        su[i] = min(su[i+1],banana[i].second);
    }
    long long q;
    cin >> q;
    for(long long i = 0; i < q; i++) {
        long long y,l = 0,r = banana.size()-1;
        cin >> y;
        if(y <= banana[0].first) {
            cout << su[0] << "\n";
        }
        else {
            while(l < r) {
                long long mid = (l+r+1)/2;
                if(banana[mid].first <= y) {
                    l = mid;
                }
                else {
                    r = mid-1;
                }
            }
            cout << min(pr[l+1]+y*x,su[l+1]) << "\n";
        }
    }
    return 0;
}
#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...