제출 #209774

#제출 시각아이디문제언어결과실행 시간메모리
209774Alexa2001Pilot (NOI19_pilot)C++17
89 / 100
1096 ms107648 KiB
#include <bits/stdc++.h>

using namespace std;

/// 16:02

typedef long long ll;
const int Nmax = 1e6 + 5;

ll act = 0;

vector<int> v[Nmax], w[Nmax];
int n, q;
ll ans[Nmax];


int t[Nmax], sz[Nmax];


ll take2(int x)
{
    return (ll)x*(x+1)/2;
}

int boss(int x)
{
    if(x == t[x]) return x;
    return t[x] = boss(t[x]);
}

void unite(int x, int y)
{
    x = boss(x); y = boss(y);

    act -= take2(sz[y]) + take2(sz[x]);

    if(sz[x] > sz[y]) swap(x, y);
    t[x] = y;
    sz[y] += sz[x];

    act += take2(sz[y]);
}

void add(int x)
{
    sz[x] = 1; t[x] = x;
    ++act;

    if(sz[x-1]) unite(x, x-1);
    if(sz[x+1]) unite(x, x+1);
}

int main()
{
   // freopen("input", "r", stdin);
    cin.sync_with_stdio(false); cin.tie(0);

    cin >> n >> q;
    int i;
    for(i=1; i<=n; ++i)
    {
        int x;
        cin >> x;
        w[x].push_back(i);
    }

    for(i=1; i<=q; ++i)
    {
        int x;
        cin >> x;
        v[x].push_back(i);
    }

    for(i=1; i<=Nmax-5; ++i)
    {
        for(auto it : w[i]) add(it);
        for(auto it : v[i]) ans[it] = act;
    }

    for(i=1; i<=q; ++i) cout << ans[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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...