[BZOJ3781][小B的询问][莫队]
2017-02-27 11:21
267 查看
[BZOJ3781][小B的询问][莫队]
[b]题目:[/b]有一个序列,包含N个1~K之间的整数。他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数。
思路:
裸的莫队吧。。直接开数组C暴力维护每个数出现的次数,区间转移的时候如果假如加入一个数k,维护平方和就是:
ans=ans−C[k]2+(++C[k])2
反之减去一个数就是:
ans=ans−C[k]2+(−−C[k])2
代码:
#include <bits/stdc++.h> using namespace std; const int Maxn = 50005; typedef long long ll; inline ll sqr(const ll &x) { return x * x; } inline char get(void) { static char buf[1000000], *p1 = buf, *p2 = buf; if (p1 == p2) { p2 = (p1 = buf) + fread(buf, 1, 1000000, stdin); if (p1 == p2) return EOF; } return *p1++; } inline void read(int &x) { x = 0; static char c; for (; !(c >= '0' && c <= '9'); c = get()); for (; c >= '0' && c <= '9'; x = x * 10 + c - '0', c = get()); } int belong[Maxn]; ll ans[Maxn]; struct Cmd { int l, r, id; friend bool operator < (const Cmd &a, const Cmd &b) { if (belong[a.l] == belong[b.l]) return a.r < b.r; else return belong[a.l] < belong[b.l]; } } cmd[Maxn]; int n, m, k, c[Maxn], sum[Maxn]; inline void upd(ll &now, int p, int v) { now -= sqr(sum[c[p]]); sum[c[p]] += v; now += sqr(sum[c[p]]); } inline void solve(void) { int L = 1, R = 0; ll now = 0, g; for (int i = 1; i <= m; i++) { for (; L < cmd[i].l; L++) upd(now, L, -1); for (; R > cmd[i].r; R--) upd(now, R, -1); for (; L > cmd[i].l; L--) upd(now, L - 1, 1); for (; R < cmd[i].r; R++) upd(now, R + 1, 1); ans[cmd[i].id] = now; } } int main(void) { //freopen("in.txt", "r", stdin); read(n), read(m), read(k); int s = sqrt(n); for (int i = 1; i <= n; i++) { read(c[i]); belong[i] = (i - 1) / s + 1; } for (int i = 1; i <= m; i++) { read(cmd[i].l), read(cmd[i].r); cmd[i].id = i; } sort(cmd + 1, cmd + m + 1); solve(); for (int i = 1; i <= m; i++) { printf("%lld\n", ans[i]); } return 0; }
完。
By g1n0st
相关文章推荐
- 【模板】BZOJ 3781: 小B的询问 莫队算法
- BZOJ 3781 小B的询问 序列莫队算法
- BZOJ - 3781 小B的询问 莫队算法
- BZOJ 3781: 小B的询问 [莫队]
- BZOJ 3781: 小B的询问 | 莫队
- 【P2709】【BZOJ3781】 小B的询问 莫队算法
- [bzoj3781]小B的询问【莫队】
- bzoj 3781 小B的询问(莫队算法)
- 【bzoj3781】小B的询问 莫队
- bzoj3781 小B的询问【莫队】
- [BZOJ3781]小B的询问(莫队)
- [bzoj3781]小B的询问 智障莫队
- 【莫队算法】bzoj3781 小B的询问
- bzoj3781 小B的询问(莫队)
- BZOJ 3781 小B的询问 莫队
- BZOJ 3781: 小B的询问 莫队算法
- BZOJ3781 小B的询问 题解&代码 【附莫队总结】
- BZOJ[3781]小B的询问 莫队
- 【bzoj3781】小B的询问 莫队算法
- [bzoj] 3781 小B的询问 || 莫队