题目

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;
}

P3709 大爷的字符串题(莫队+结论)的更多相关文章

  1. P3709 大爷的字符串题 (莫队)

    题目 P3709 大爷的字符串题 题意:求\([l,r]\)中众数的个数. 解析 维护两个数组: \(cnt[x]\),数\(x\)出现的次数. \(sum[x]\),出现次数为\(x\)的数的个数. ...

  2. luogu P3709 大爷的字符串题

    二次联通门 : luogu P3709 大爷的字符串题 /* luogu P3709 大爷的字符串题 莫队 看了半天题目 + 题解 才弄懂了要求什么... 维护两个数组 一个记录数字i出现了几次 一个 ...

  3. 洛谷P3709 大爷的字符串题(莫队)

    题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区 ...

  4. 【Luogu】P3709大爷的字符串题(莫队算法)

    题目链接 语文题啊…… 看题解发现是让求区间中最多的数的个数,于是果断理解了一会题解……莫队套上完事. sum[i]表示i这个数出现的次数,cnt[i]表示出现i次的数有几个,然后乱搞搞……就好了 # ...

  5. 洛谷 P3709 大爷的字符串题

    https://www.luogu.org/problem/show?pid=3709 题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个 ...

  6. P3709 大爷的字符串题(50分)

    题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区 ...

  7. P3709 大爷的字符串题

    题意 询问区间众数出现的次数 思路 唯有水题快人心 离散化+莫队 莫队一定要先加后减,有事会出错的 莫队维护区间众数: 维护两个数组,一个数组记录权值为x的出现次数,一个记录出现次数为x的数的个数 a ...

  8. 【题解】洛谷P3709大爷的字符串题

    最近想要练习一下莫队(实在是掌握的太不熟练了啊.)这题一开始看到有点懵(题面杀),后来发现是要求众数的个数.乍一看好像很难的样子. 但仔细分析一下:首先往序列当中加入一个数,这个是很简单的,只需要维护 ...

  9. 并不对劲的p3709:大爷的字符串题

    题目大意 区间众数 题解 莫队 代码 #include<algorithm> #include<cmath> #include<cstdio> #include&l ...

随机推荐

  1. 2019 房多多java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.房多多等公司offer,岗位是Java后端开发,因为发展原因最终选择去了房多多,入职一年时间了,也成为了面试官 ...

  2. Java之路---Day08

    2019-10-22-22:28:39 目录 1.Static静态类 2.Static内存图 3.Static静态代码块 4.Arrays类 5.Math类 Static静态类 一旦使用static修 ...

  3. python写文件无法换行的问题

    python写文件无法换行的问题,用'\n'  不行,直接打印的出来了. 网上查了查,都说是用  ‘\r\n’ ,但是这样打出来,不仅换行了,还加了一个空行. windows平台最后结果是    直接 ...

  4. InputStream和OutputStream及相关知识汇总

    https://www.jianshu.com/p/e5bc7ea5f948 最近帮学姐写爬虫的时候遇到奇怪的问题,同样的程序在Mac上可以正常运行而在Windows上返回结果错误,最后经排查发现是L ...

  5. JAVA9之后废弃newInstance()方法

    JAVA9之后废弃newInstance()方法 根据JAVA11的API 我们可以看见反射中的newInstance()方法不推荐使用了,用 clazz.getDeclaredConstructor ...

  6. 利用position absolute使div居中

    外层DIV{position:realtive}内层DIV{positon:absolute;top:50%;left:50%;margin-top:-100px;margin-left:-150px ...

  7. 网络监听工具 嗅探器 SpyNet

    配置网卡 注册 监听配置 开始捕获

  8. 知识扩展——(转)一篇文章彻底弄懂Base64编码原理

    在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇博文带领大家了解一下Base64的底层实现. 一.Base64的由来 目前Base64已经成 ...

  9. 关于服务器程序运行中收到SIGPIPE(转)

    (此文为原文删减版,原文地址:http://blog.sina.com.cn/s/blog_502d765f0100kopn.html) 我写了一个服务器程序,在Linux下测试,然后用C++写了客户 ...

  10. 【python】文件操作

    基本语法 open("文件名","访问方式") # 1. 打开文件 file = open("README.txt") # 2. 读取文件内 ...