莫隊(codeforces 86D - Powerful array )

題目鏈接
通過這個題,感受到了莫隊的魔性。。。
在這裏插入圖片描述
限時5s的題,吸着氧,一路擦邊4秒9,愣是懟完了所有樣例,woc,nb。
這題莫起來很容易,雖然知道不是正解 ,從此愛上了莫隊。。。
下面是ac代碼:

#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <map>
#pragma GCC optimize(2)
#define ll long long
using namespace std;
const int N = 2e5+5;
ll c[N];
ll sum[N*5];
struct Node
{
    ll l, r, id;
}q[N];
ll anss[N];
ll block;
ll ans = 0;
int gg[N*10];
bool cmp(Node a, Node b)
{
    return (a.r / block == b.r /block) ? a.l < b.l:a.r < b.r;
}
void del (int x)
{
    sum[c[x]]--;
    ans += c[x] * (sum[c[x]]*sum[c[x]] - (sum[c[x]]+1)*(sum[c[x]]+1));
}
void add(int x)
{
    sum[c[x]]++;
    ans += c[x] * (sum[c[x]]*sum[c[x]] - (sum[c[x]]-1)*(sum[c[x]]-1));
}
int main()
{
    ll n, m, k;
    scanf("%lld%lld", &n, &m);
    block = sqrt(n);
    for (int i = 1; i <= n; i++)
        scanf("%lld", &c[i]);
    for (int i = 1; i <= m; i++)
    {
        scanf("%lld%lld", &q[i].l, &q[i].r);
        q[i].id = i;
    }
    sort(q+1, q+m+1, cmp);
    int l = 1, r = 0;
    for (int i = 1; i <= m; i++)
    {
        ll ql = q[i].l, qr = q[i].r;
        while(l < ql) del(l++);
        while(l > ql) add(--l);
        while(r < qr) add(++r);
        while(r > qr) del(r--);
        anss[q[i].id] = ans;
    }
    for (int i = 1; i <= m; i++)
        printf("%lld\n", anss[i]);
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章