제출 #1328125

#제출 시각아이디문제언어결과실행 시간메모리
1328125model_codeCollecting Stamps 4 (JOI25_stamps4)C++20
100 / 100
607 ms83908 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> P;
typedef vector<P> vp;
typedef vector<ll> vi;
typedef vector<vi> vvi;
typedef vector<bool> vb;
#define rep(i,n) for(ll i=0; i<(ll)(n); i++)
#define REP(i,k,n) for(ll i=(ll)(k); i<(ll)(n); i++)
#define pb emplace_back
template<class T> bool chmax(T&a,T b){if(a<b){a=b;return true;}return false;}
template<class T> bool chmin(T&a,T b){if(a>b){a=b;return true;}return false;}
template<class T> void outv(T v){rep(i,v.size()){if(i)cout<<' ';cout<<v[i];}cout<<'\n';}
const ll inf=3001001001001001001;

struct BIT{
    vi bit;ll n;
    ll sum(ll i){
        ll res=0;
        for(;i>0;i-=i&-i)res+=bit[i];
        return res;
    }
    BIT(ll n_):n(n_){bit=vi(n+1);}
    void add(ll i,ll x){
        for(i++;i<=n;i+=i&-i)bit[i]+=x;
    }
    ll get(ll a,ll b){
        if(b<=a)return 0ll;
        return sum(b)-sum(a);
    }
};

int main(){
    cin.tie(0);ios::sync_with_stdio(false);
    ll n, X; cin >> n >> X;
    vi v(2*n), c(2*n), score(2*n), next(2*n);
    vi seen(n,-1);
    rep(i,2*n) {
        cin >> v[i]; v[i]--;
    }
    rep(i,2*n) cin >> c[i];
    BIT bit(4*n);
    ll cnt=0;
    rep(i,2*n){
        if(seen[v[i]]!=-1){
            next[seen[v[i]]]=i;
            next[i]=2*n+seen[v[i]];
            cnt++;
            bit.add(i,1);
        } else{
            seen[v[i]]=i;
            score[0]+=cnt;
        }
    }
    REP(i,1,2*n){
        bit.add(next[i-1],-1);
        bit.add(i-1+2*n,1);
        score[i]=score[i-1]+bit.get(i,next[i-1])-(i-1+2*n-next[i-1]-1-bit.get(next[i-1]+1,i-1+2*n));
    }
    rep(i,2*n)score[i]=n*n-score[i];
    vi srt(2*n);rep(i,2*n)srt[i]=i;
    sort(srt.begin(), srt.end(), [&](ll a,ll b){if(c[a]==c[b]){if(score[a]==score[b])return a<b;return score[a]>score[b];};return c[a]<c[b];});
    vp al;
    for(auto x:srt){
        if(al.size()==0||(score[x]-al.back().first)*X+al.back().second>c[x])al.pb(score[x],c[x]);
    }
    auto calc=[&](ll idx,ll K) {
        if(idx<0||idx>=al.size())return inf;
        if(K<=al[idx].first)return al[idx].second;
        return (K-al[idx].first)*X+al[idx].second;
    };
    ll q;cin>>q;
    rep(qq,q){
        ll K; cin >> K;
        ll l=lower_bound(al.begin(),al.end(),P(K,-1))-al.begin();
        cout << min(calc(l,K), calc(l-1,K)) << '\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...