Submission #1222869

#TimeUsernameProblemLanguageResultExecution timeMemory
1222869Tenis0206Lottery (CEOI18_lot)C++20
100 / 100
620 ms8548 KiB
#include <bits/stdc++.h>

using namespace std;

const int nmax = 1e4;
const int qmax = 100;

int n, l, q;
int v[nmax + 5], k[qmax + 5];

int pd[nmax + 5], md[nmax + 5];

int c[nmax + 5];

int cnt[nmax + 5][qmax + 5];

vector<int> a;

int get_val(int val)
{
    int st = 1;
    int dr = a.size();
    int poz = q + 1;
    while(st <= dr)
    {
        int mij = (st + dr) >> 1;
        if(a[mij - 1] >= val)
        {
            poz = mij;
            dr = mij - 1;
        }
        else
        {
            st = mij + 1;
        }
    }
    return poz;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    #ifdef home
    freopen("nr.in","r",stdin);
    freopen("nr.out","w",stdout);
    #endif // home
    cin>>n>>l;
    for(int i=1;i<=n;i++)
    {
        cin>>v[i];
    }
    cin>>q;
    for(int i=1;i<=q;i++)
    {
        cin>>k[i];
        a.push_back(k[i]);
    }
    sort(a.begin(), a.end());
    for(int i=n;i>=1;i--)
    {
        c[i] = get_val(i);
    }
    for(int d=1;d<n;d++)
    {
        for(int i=1;i+d<=n;i++)
        {
            if(v[i] == v[i + d])
            {
                continue;
            }
            int sta = 0, dra = 0, stb = 0, drb = 0;
            if(i >= l)
            {
                sta = i - l + 1;
                dra = i;
                stb = i + d - l + 1;
                drb = i + d;
            }
            else
            {
                sta = 1;
                dra = i;
                stb = d + 1;
                drb = i + d;
            }
            ++pd[sta];
            --pd[dra + 1];
            ++md[stb];
            --md[drb + 1];
        }
        for(int i=1;i<=n;i++)
        {
            pd[i] += pd[i - 1];
            md[i] += md[i - 1];
            if(i + d + l - 1 <= n)
            {
                ++cnt[i][c[pd[i]]];
            }
            if(i - d >= 1)
            {
                ++cnt[i][c[md[i]]];
            }
        }
        for(int i=1;i<=n;i++)
        {
            pd[i] = md[i] = 0;
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=q;j++)
        {
            cnt[i][j] += cnt[i][j - 1];
        }
    }
    for(int i=1;i<=q;i++)
    {
        for(int j=1;j<=n-l+1;j++)
        {
            cout<<cnt[j][get_val(k[i])]<<' ';
        }
        cout<<'\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...