제출 #1337952

#제출 시각아이디문제언어결과실행 시간메모리
1337952alexddCollecting Stamps 4 (JOI25_stamps4)C++20
66 / 100
3096 ms94340 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 2e18;
const int MAXV = 2e6 + 5;

struct AIB
{
    int v[MAXV];
    void init()
    {
        for(int i=0;i<MAXV;i++)
            v[i] = 0;
    }
    int qry(int poz)
    {
        int aux = 0;
        for(int i=poz;i>0;i-=(i&(-i)))
            aux += v[i];
        return aux;
    }
    void upd(int poz, int newv)
    {
        for(int i=poz;i<MAXV;i+=(i&(-i)))
            v[i] += newv;
    }
};

int n, x;
int a[MAXV], c[MAXV];

int base[MAXV];
void precalc()
{
    AIB ris, les;
    ris.init();
    les.init();

    base[1] = n * (n+1) / 2;
    vector<int> le(MAXV, 0), ri(MAXV, 0);
    for(int i=1;i<=2*n;i++)
    {
        if(!le[a[i]])
        {
            le[a[i]] = i;
            les.upd(i, +1);
        }
        else
        {
            ri[a[i]] = i;
            base[1] += ris.qry(i) - ris.qry(le[a[i]]);
            ris.upd(i, +1);
        }
    }

    for(int start=1;start<2*n;start++)
    {
        base[start + 1] = base[start];

        les.upd(le[a[start]], -1);
        ris.upd(ri[a[start]], -1);

        /*cout<<le[a[start]]<<" "<<ri[a[start]]<<" le & ri\n";
        cout<<" -= "<<les.qry(ri[a[start]])<<"\n";
        cout<<" += "<<ris.qry(start + 2*n) - ris.qry(ri[a[start]])<<"\n\n";*/
        base[start + 1] -= les.qry(ri[a[start]]);
        base[start + 1] += ris.qry(start + 2*n) - ris.qry(ri[a[start]]);

        le[a[start]] = ri[a[start]];
        ri[a[start]] = start + 2*n;

        les.upd(le[a[start]], +1);
        ris.upd(ri[a[start]], +1);
    }

    //for(int start=1;start<=2*n;start++)
      //  cout<<start<<" "<<base[start]<<" base\n";
}

int sol[MAXV];
signed main()
{

    ios_base::sync_with_stdio(0);cin.tie(0);
    cin>>n>>x;
    for(int i=1;i<=2*n;i++)
    {
        cin>>a[i];
        a[2*n + i] = a[i];
    }
    for(int i=1;i<=2*n;i++)
    {
        cin>>c[i];
    }
    precalc();

    vector<pair<int,int>> qrys;
    int q;
    cin>>q;
    for(int i=1;i<=q;i++)
    {
        int k;
        cin>>k;
        qrys.push_back({k, i});
        sol[i] = INF;
    }

    sort(qrys.begin(), qrys.end());
    for(auto [k,qid]:qrys)
    {
        for(int start=1;start<=2*n;start++)
        {
            sol[qid] = min(sol[qid], c[start] + x * max(0LL, k - base[start]));
        }
    }

    for(int i=1;i<=q;i++)
    {
        assert(sol[i] != INF);
        cout<<sol[i]<<"\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...