NC17942J(莫队算法)
2021/7/15 20:08:13
本文主要是介绍NC17942J(莫队算法),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
给出一个序列,每次询问区间内出现次数恰好是k的元素个数。
//c[maxn]维护出现i次的数有多少 //cc[maxn]维护第i个数出现多少次 //然后莫队 #include<bits/stdc++.h> using namespace std; const int maxn=4e4+100; int c[maxn],cc[maxn]; int belong[maxn]; int sz,bnum; struct node { int l,r,k,id; bool operator < (const node &b) const { return (belong[l]^belong[b.l])?belong[l]<belong[b.l]:((belong[l]&1)?r<b.r:r>b.r); } }q[maxn]; int n,m,a[maxn],ans[maxn]; int main () { scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) scanf("%d",a+i),cc[a[i]]++; int l=1,r=n; sz=sqrt(n); bnum=n/sz+(n%sz>0); for (int i=1;i<=bnum;i++) { for (int j=(i-1)*sz+1;j<=i*sz;j++) { belong[j]=i; } } for (int i=0;i<=4e4;i++) { c[cc[i]]++; } for (int i=1;i<=m;i++) { scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].k); q[i].id=i; } sort(q+1,q+m+1); for (int i=1;i<=m;i++) { while (l<q[i].l) { c[cc[a[l]]]--; cc[a[l]]--; c[cc[a[l]]]++; l++; } while (l>q[i].l) { l--; c[cc[a[l]]]--; cc[a[l]]++; c[cc[a[l]]]++; } while (r<q[i].r) { r++; c[cc[a[r]]]--; cc[a[r]]++; c[cc[a[r]]]++; } while (r>q[i].r) { c[cc[a[r]]]--; cc[a[r]]--; c[cc[a[r]]]++; r--; } ans[q[i].id]=c[q[i].k]; } for (int i=1;i<=m;i++) printf("%d\n",ans[i]); }
这篇关于NC17942J(莫队算法)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-23DevExpress 怎么实现右键菜单(Context Menu)显示中文?-icode9专业技术文章分享
- 2024-12-22怎么通过控制台去看我的页面渲染的内容在哪个文件中呢-icode9专业技术文章分享
- 2024-12-22el-tabs 组件只被引用了一次,但有时会渲染两次是什么原因?-icode9专业技术文章分享
- 2024-12-22wordpress有哪些好的安全插件?-icode9专业技术文章分享
- 2024-12-22wordpress如何查看系统有哪些cron任务?-icode9专业技术文章分享
- 2024-12-21Svg Sprite Icon教程:轻松入门与应用指南
- 2024-12-20Excel数据导出实战:新手必学的简单教程
- 2024-12-20RBAC的权限实战:新手入门教程
- 2024-12-20Svg Sprite Icon实战:从入门到上手的全面指南
- 2024-12-20LCD1602显示模块详解