基础莫队模板
这是一篇不带修改的莫队
原来莫队是利用分块的思想优化一个路径(曼哈顿距离)-- 几何解释
int n, m, a[N];
struct Q{
int l, r, id;
}q[N];
int pos[N], cnt[N], ans[N];
ll ANS;
bool mo_cmp(Q x, Q y){
if(pos[x.l] != pos[y.l]){
return pos[x.l] < pos[y.l];
}
if(pos[x.l] & 1) return x.r > y.r; // 奇偶性优化
else return x.r < y.r;
}
void add(int x){
ANS -= cnt[a[x]]*cnt[a[x]];
cnt[a[x]]++;
ANS += cnt[a[x]]*cnt[a[x]];
}
void del(int x){
ANS -= cnt[a[x]]*cnt[a[x]];
cnt[a[x]]--;
ANS += cnt[a[x]]*cnt[a[x]];
}
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
void write(int x)
{
if(x<0)
putchar('-'),x=-x;
if(x>9)
write(x/10);
putchar(x%10+'0');
return;
}
void solve() {
int k;
n = read(); m = read(); k = read();
int block = sqrt(n);
for(int i = 1; i <= n; i++){
a[i] = read();
pos[i] = (i - 1)/block + 1;
}
for(int i = 1; i <= m; i++){
q[i].l = read();
q[i].r = read();
q[i].id = i;
}
sort(q + 1, q + 1 + m, mo_cmp);
int L = 1, R = 0;
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++) write(ans[i]), putchar('\n');
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)