Submission #872369

#TimeUsernameProblemLanguageResultExecution timeMemory
872369Darren0724Lottery (CEOI18_lot)C++17
100 / 100
550 ms12484 KiB
#include <bits/stdc++.h>
using namespace std;
#define LCBorz                        \
    ios_base::sync_with_stdio(false); \
    cin.tie(0);
#define int long long
#define all(x) x.begin(), x.end()
#define x first
#define y second
//#define endl '\n'
const int N=100005;
const int INF=1e18;

int32_t main() {
    LCBorz;
    int n,k;cin>>n>>k;
    vector<int> v(n);
    for(int i=0;i<n;i++){
        cin>>v[i];
    }
    
    int q;cin>>q;
    int ans[n+1][q+2]{};
    vector<pair<int,int>> ask(q+2);
    for(int i=1;i<=q;i++){
        cin>>ask[i].first;
        ask[i].second=i;
    }
    ask[0]={0,0};
    ask[q+1]={n,n};
    sort(all(ask));
    int idx=1;
    for(int i=1;i<n;i++){
        vector<int> a;
        //a.push_back(0);
        for(int j=0;j+i<n;j++){
            a.push_back(v[j]!=v[i+j]);
        }
        int sz=a.size();
        if(sz<k){
            continue;
        }
        int cnt=0;
        for(int j=0;j<k;j++){
            cnt+=a[j];
        }
        //cout<<0<<' '<<i<<' '<<cnt<<endl;
        while(idx&&ask[idx-1].first>=cnt){
            //cout<<"flag1"<<endl;
            idx--;
        }
        while(ask[idx].first<cnt){
            //cout<<"flag2"<<endl;
            idx++;
        }
        ans[0][idx]++;
        ans[i][idx]++;
        for(int j=k;j<sz;j++){
            cnt-=a[j-k];
            cnt+=a[j];
            while(idx&&ask[idx-1].first>=cnt){
                //cout<<"flag1"<<endl;
                idx--;
            }
            while(ask[idx].first<cnt){
                //cout<<"flag2"<<endl;
                idx++;
            }
            ans[j+1-k][idx]++;
            ans[i+j+1-k][idx]++;
            //cout<<j+1-k<<' '<<i+j+1-k<<' '<<cnt<<endl;
        }
    }
    for(int i=0;i<n;i++){
        for(int j=1;j<=q;j++){
            ans[i][j]+=ans[i][j-1];
        }
    }
    vector<int> ans1(q+2);
    for(int i=1;i<=q;i++){
        int now=0;
        for(int j=1;j<=q;j++){
            if(ask[j].second==i){
                now=j;
                break;
            }
        }
        for(int j=0;j<n-k+1;j++){
            cout<<ans[j][now]<<' ';
        }
        cout<<endl;
    }
    

    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...