当前位置: 首页 > news >正文

莫队 n的序列,多次查询一段区间内的数字的个数

莫队 n的序列,多次查询一段区间内的数字的个数

'''
// 普通莫队 O(n*sqrt(n))

include

include

include

include

using namespace std;

const int N=50005;
int n,m,k,B,a[N];
int sum,c[N],ans[N];
struct Q{
int l,r,id;
//按l所在块的编号l/B和r排序
bool operator<(Q &b){
if(l/B!=b.l/B) return l<b.l;
if((l/B)&1) return r<b.r;
return r>b.r;
}
}q[N];

void add(int x){ //扩展一个数
sum-=c[x]c[x];
c[x]++;
sum+=c[x]
c[x];
}
void del(int x){ //删除一个数
sum-=c[x]c[x];
c[x]--;
sum+=c[x]
c[x];
}
int main(){
scanf("%d%d%d",&n,&m,&k);
B=sqrt(n); //块的大小
for(int i=1;i<=n;++i)scanf("%d",&a[i]);
for(int i=1;i<=m;++i)
scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
sort(q+1,q+1+m); //按l/B和r排序
for(int i=1,l=1,r=0;i<=m;++i){
while(l>q[i].l) add(a[--l]);//左扩展
while(r<q[i].r) add(a[++r]);//右扩展
while(l<q[i].l) del(a[l++]);//左删除
while(r>q[i].r) del(a[r--]);//右删除
ans[q[i].id]=sum;
}
for(int i=1;i<=m;++i)printf("%d\n",ans[i]);
}
'''

http://www.hskmm.com/?act=detail&tid=13753

相关文章:

  • 【mysql】mysql客户端中文显示乱码
  • 揭秘“牛牛透视”
  • k8s系列--控制器yml(15)
  • 学生管理系统案例初步分析报告
  • 【mysql】mysql5.6 版本修改用户的登录
  • AT_abc200_e [ABC200E] Patisserie ABC 2 题解
  • 日总结 5
  • Linux驱动开发(1)概念、环境与代码框架 - 实践
  • Diffutoon下载介绍:真人视频转动漫工具,轻松获得上千点赞
  • 9月22号
  • 0.5*8 边形 != 式
  • 题解:AT_agc052_c [AGC052C] Nondivisible Prefix Sums
  • 寻路算法
  • 2025年9月22日 - 20243867孙堃2405
  • day 1
  • [Paper Reading] METAGPT: META PROGRAMMING FOR A MULTI-AGENT COLLABORATIVE FRAMEWORK
  • 二进制 - 20243867孙堃2405
  • 学习问题日记-1
  • 记一次生产环境内存溢出记录
  • 四舍六入五成双
  • 借助 Apache Phoenix,使用标准 SQL 和 JDBC 接口来操作 HBase
  • 学生信息管理系统
  • 如何让AI生成多页面APP原型图?AI原型设计实用指南
  • 代码随想录算法训练营第五天 | leetcode 242 349 202 1
  • CF2146 Codeforces Round 1052 (Div. 2) 游记
  • 原码补码反码与位操作
  • 接口
  • 特殊句式
  • 9月22日
  • 20250922