题目

P3709 大爷的字符串题

做法

有一个显然的结论:一段区间里最小答案为众数的个数

用莫队来离线求众数

\(tmp_i\)表示出现\(i\)次的数的个数,\(num_i\)表示\(i\)出现的次数

缩小区间:答案可能减小,看答案所在的\(tmp\)是否不唯一

扩大区间:答案增大

Code

#include<bits/stdc++.h>
typedef int LL;
const LL maxn=1e6+9;
inline LL Read(){
LL x(0),f(1); char c=getchar();
while(c<'0' || c>'9'){
if(c=='-') f=-1; c=getchar();
}
while(c>='0' && c<='9'){
x=(x<<3ll)+(x<<1ll)+c-'0'; c=getchar();
}return x*f;
}
struct node{
LL l,r,id;
}qy[maxn];
LL n,m,ret;
LL ans[maxn],num[maxn],tmp[maxn],a[maxn],b[maxn],bel[maxn];
inline bool cmp(node xx,node yy){
return bel[xx.l]<bel[yy.l] || (bel[xx.l]==bel[yy.l] && (bel[xx.l]&1?xx.r<yy.r:xx.r>yy.r));
}
inline void Modify(LL val,LL op){
if(!op){
if(ret==num[val] && tmp[ret]==1) --ret;
--tmp[num[val]]; ++tmp[--num[val]];
}else{
if(ret==num[val]) ++ret;
--tmp[num[val]]; ++tmp[++num[val]];
}
}
int main(){
n=Read(); m=Read();
for(LL i=1;i<=n;++i) a[i]=b[i]=Read();
std::sort(b+1,b+1+n);
for(LL i=1;i<=n;++i) a[i]=std::lower_bound(b+1,b+1+n,a[i])-b;//,printf("%d ",a[i]);puts("");
for(LL i=1;i<=m;++i) qy[i]=(node){Read(),Read(),i};
LL pieces(sqrt(n)),size(n/pieces);
for(LL i=1;i<=pieces;++i){
for(LL j=(i-1)*size+1;j<=i*size;++j)
bel[j]=i;
}
for(LL i=pieces*size+1;i<=n;++i)
bel[i]=pieces+1;
std::sort(qy+1,qy+1+m,cmp);
tmp[0]=n;
LL nl(1),nr(0);
for(LL i=1;i<=m;++i){
LL ql(qy[i].l),qr(qy[i].r);
while(nl<ql) Modify(a[nl++],0);
while(nl>ql) Modify(a[--nl],1);
while(nr<qr) Modify(a[++nr],1);
while(nr>qr) Modify(a[nr--],0);
ans[qy[i].id]=ret;
}
for(LL i=1;i<=m;++i) printf("-%d\n",ans[i]);
return 0;
}

最新文章

  1. Spring(一)
  2. Kanzi编程基础3 - 图片读取与显示
  3. 使用动态类型dynamic让你的省了很多临时类
  4. 编写高性能Web应用程序的10个技巧
  5. &quot;npm ERR! Error: EPERM: operation not permitted&quot;问题解决
  6. 联系博主(推介联系QQ)
  7. 【Android】 PopupWindow使用小结
  8. 214. Shortest Palindrome
  9. 《Java4Android视频教程》学习笔记(二)
  10. Java读书笔记三(字符串)
  11. 支持Angular 2的表格控件
  12. 【Linux笔记(001) 】-- centos7 系统目录结构与文件
  13. DevOps实例
  14. OO的奇妙冒险2
  15. [cf1038E][欧拉路]
  16. bzoj4008: [HNOI2015]亚瑟王 dp
  17. Http 缓存机制
  18. OpenCV——HOG特征检测
  19. Redis实战(五)
  20. export导出.xls时,在火狐的情况下出现表名乱码的情况的解决方案

热门文章

  1. 特征选择之FeatureSelector工具
  2. js数据类型及变量知识(一)
  3. springCloud学习5(Spring-Cloud-Stream事件驱动)
  4. wokerman随笔
  5. 超详细的纯净windows系统重装示例
  6. package-lock.json的作用(转载)
  7. C#-NLog记录日志
  8. uuid简述
  9. 进程间通信之数据传输--FIFO
  10. 18.centos7基础学习与积累-004-分区理论