洛谷2709——莫队+分块
莫队裸题,上代码:
# include <iostream>
# include <algorithm>
# include <cmath>
# include <cstring>
using namespace std;
const int maxn = 50010;
int pos[maxn], a[maxn],c[maxn];
int ans[maxn], Ans;
struct node {
int l, r, id;
}q[maxn];
bool cmp(node a, node b) {
if (pos[a.l] == pos[b.l]) {
return a.r < b.r;
}
else {
return pos[a.l] < pos[b.l];
}
}
void add(int i){
Ans -= c[a[i]] * c[a[i]];
c[a[i]]++;
Ans += c[a[i]] * c[a[i]];
};
void del(int i){
Ans -= c[a[i]] * c[a[i]];
c[a[i]]--;
Ans += c[a[i]] * c[a[i]];
};
int main() {
int n, m, k;
int l = 1, r = 0;
Ans = 0;
memset(a, 0, sizeof(a));
memset(c, 0, sizeof(c));
cin >> n >> m >> k;
int block = (int)sqrt(n);
for (int i = 1; i <= n; i++) {
cin >> a[i];
pos[i] = i / block;
}
for (int i = 1; i <= m; i++) {
cin >> q[i]. l >> q[i].r;
q[i].id = i;
}
sort(q + 1, q + m + 1, cmp);
for (int i = 1; i <= m;i++) {
while (l < q[i].l) {
del(l);
l++;
}
while (l > q[i].l) {
l--;
add(l);
}
while (r < q[i].r) {
r++;
add(r);
}
while (r > q[i].r) {
del(r);
r--;
}
ans[q[i].id] = Ans;
}
for (int i = 1; i <= m; i++) {
cout<<ans[i]<<endl;
}
return 0;
}