P3709 大爷的字符串题(50分)
题目背景
在那遥远的西南有一所学校
/*被和谐部分*/
然后去参加该省省选虐场
然后某蒟蒻不会做,所以也出了一个字符串题:
题目描述
给你一个字符串a,每次询问一段区间的贡献
贡献定义:
每次从这个区间中随机拿出一个字符x,然后把x从这个区间中删除,你要维护一个集合S
如果S为空,你rp减1
如果S中有一个元素不小于x,则你rp减1,清空S
之后将x插入S
由于你是大爷,平时做过的题考试都会考到,所以每次询问你搞完这段区间的字符之后最多还有多少rp?rp初始为0
询问之间不互相影响~
输入输出格式
输入格式:
第一行两个数n,m,表示字符串长度与询问次数
之后一行n个数,表示字符串
由于你是大爷,所以字符集1e9
之后m行每行两个数,表示询问的左右区间
输出格式:
m行,每行一个数表示答案
输入输出样例
- 3 3
- 3 3 3
- 3 3
- 3 3
- 3 3
- -1
- -1
- -1
说明
前4个点1s,后面的点4s
对于10%的数据,是样例
对于另外10%的数据,n,m <= 100
对于另外10%的数据,n,m <= 1000
对于另外10%的数据,n,m <= 10000
对于另外10%的数据,n,m <= 100000
对于100%的数据,n,m <= 200000
保证数据向某省省选day1T2一样sb,大家尽情用暴力水过题吧!
没事,你只要在一个好学校,就算这题只能拿到10分,也可以进队了
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<cstdlib>
- #include<algorithm>
- #include<vector>
- #define hh 10
- using namespace std;
- const int MAXN=;
- void read(int & n)
- {
- char c='+';int x=;bool flag=;
- while(c<''||c>'')
- {c=getchar();if(c=='-')flag=;}
- while(c>=''&&c<='')
- {x=x*+(c-);c=getchar();}
- flag==?n=-x:n=x;
- }
- int n,m;
- int pos[MAXN];
- int base;
- int rp=;
- struct node
- {
- int l,r,id;
- }q[MAXN];
- struct dr
- {
- int a,p;
- }a[MAXN];
- int comp(const node & a,const node &b)
- {
- if(pos[a.l]==pos[b.l])
- return a.r<b.r;
- else
- return pos[a.l]<pos[b.l];
- }
- int cop(const dr &a,const dr &b)
- {
- return (a.a<b.a)||(a.a==b.a&&a.p<b.p);
- }
- int happen[MAXN];// 记录i出现了多少次
- int cnt[MAXN];// 记录出现次数为j的有多少
- int out[MAXN];
- void dele(int p)
- {
- if(rp==happen[p]&&cnt[happen[p]+hh]==)
- rp--;
- cnt[happen[p]+hh]--;
- cnt[happen[p]+hh-]++;
- happen[p]--;
- }
- void add(int p)
- {
- if(rp==happen[p])
- rp++;
- cnt[happen[p]+hh]--;
- cnt[happen[p]+hh+]++;
- happen[p]++;
- }
- int ls[MAXN];
- void modui()
- {
- int ll=,rr=;
- for(int i=;i<=m;i++)
- {
- for(;ll<q[i].l;ll++)
- dele(ls[ll]);
- for(;ll>q[i].l;ll--)
- add(ls[ll-]);
- for(;rr>q[i].r;rr--)
- dele(ls[rr]);
- for(;rr<q[i].r;rr++)
- add(ls[rr+]);
- out[q[i].id]=-rp;
- }
- for(int i=;i<=m;i++)
- printf("%d\n",out[i]);
- }
- int main()
- {
- read(n);read(m);
- base=sqrt(n);
- for(int i=;i<=n;i++)
- read(a[i].a),a[i].p=i;
- sort(a+,a+n+,cop);
- int j;
- for(int i=,j=;i<=n;i++)
- {
- if (i==||a[i].a!=a[i-].a) j++;
- ls[a[i].p]=j;
- }
- //for(int i=1;i<=n;i++)
- // pos[i]=(i-1)/base+1;
- int sqt=;
- for ( sqt=; sqt*sqt<=n; sqt++);
- for (int i=; i<=n; i++) pos[i]=i/sqt;
- cnt[]=j;
- for(int i=;i<=m;i++)
- {
- read(q[i].l);
- read(q[i].r);
- q[i].id=i;
- }
- sort(q+,q+m+,comp);
- modui();
- return ;
- }
P3709 大爷的字符串题(50分)的更多相关文章
- P3709 大爷的字符串题 (莫队)
题目 P3709 大爷的字符串题 题意:求\([l,r]\)中众数的个数. 解析 维护两个数组: \(cnt[x]\),数\(x\)出现的次数. \(sum[x]\),出现次数为\(x\)的数的个数. ...
- P3709 大爷的字符串题(莫队+结论)
题目 P3709 大爷的字符串题 做法 有一个显然的结论:一段区间里最小答案为众数的个数 用莫队来离线求众数 \(tmp_i\)表示出现\(i\)次的数的个数,\(num_i\)表示\(i\)出现的次 ...
- luogu P3709 大爷的字符串题
二次联通门 : luogu P3709 大爷的字符串题 /* luogu P3709 大爷的字符串题 莫队 看了半天题目 + 题解 才弄懂了要求什么... 维护两个数组 一个记录数字i出现了几次 一个 ...
- 洛谷 P3709 大爷的字符串题
https://www.luogu.org/problem/show?pid=3709 题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个 ...
- 洛谷P3709 大爷的字符串题(莫队)
题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区 ...
- P3709 大爷的字符串题
题意 询问区间众数出现的次数 思路 唯有水题快人心 离散化+莫队 莫队一定要先加后减,有事会出错的 莫队维护区间众数: 维护两个数组,一个数组记录权值为x的出现次数,一个记录出现次数为x的数的个数 a ...
- 【题解】洛谷P3709大爷的字符串题
最近想要练习一下莫队(实在是掌握的太不熟练了啊.)这题一开始看到有点懵(题面杀),后来发现是要求众数的个数.乍一看好像很难的样子. 但仔细分析一下:首先往序列当中加入一个数,这个是很简单的,只需要维护 ...
- 【luogu P3709 大爷的字符串题】 题解
题目链接:https://www.luogu.org/problemnew/show/P3709 离散化+区间众数..? #include <iostream> #include < ...
- 【Luogu】P3709大爷的字符串题(莫队算法)
题目链接 语文题啊…… 看题解发现是让求区间中最多的数的个数,于是果断理解了一会题解……莫队套上完事. sum[i]表示i这个数出现的次数,cnt[i]表示出现i次的数有几个,然后乱搞搞……就好了 # ...
随机推荐
- SSH远程执行命令环境变量问题
SSH命令格式 usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address: ...
- 用fallocate进行"文件预留"或"文件打洞"【转】
转自uestc-leon的博客 内容作了一些修改,查看原文请访问uestc-leon 1. 什么是空洞文件? "在UNIX文件操作中,文件位移量可以大于文件的当前长度,在这种情况下,对该文件 ...
- 【Codeforces 474D】Flowers
[链接] 我是链接,点我呀:) [题意] 让你吃东西 B食物一次必须要吃连续k个 但是对A食物没有要求 问你有多少种吃n个食物的方法(吃的序列) [题解] 设f[i]表示长度为i的吃的序列且符合要求的 ...
- [JZOJ4687]奇袭
[JZOJ4687]奇袭 题目 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上要迎来最终的压力测试——魔界入侵. 唯一一个神一般存在的Administrator被消灭 ...
- noip模拟赛 三部曲
分析:子树上操作,要用到线段树+dfs序,关键就是子树内k还要增加,这个就不是很好办.可以求出在根节点+0后每个点会加多少,记为d[i],如果要对点x进行A操作,实际上只需要对子树加k - d[i]再 ...
- CPU工作原理简图
- Clojure:将两个list合并成一个map
假设我们有两个list,分别是: (def a [“one” “two” “three”]) (def b [1 2 3]) 我们要把它们合为一个键值对应的map,做法很简单: 1. 先将a和b合为一 ...
- AngularJS:实现页面滚动到底自动加载数据的功能
要实现这个功能,可以通过https://github.com/sroze/ngInfiniteScroll这个第三方控件来实现.步骤如下: 1. 下载ng-infinite-scroll.js程序ht ...
- AspNet MVC4 教学-27:Asp.Net MVC4 自己定义helper及function的高速Demo
A.创建Basic类型项目. B.创建App_Code目录,在里面创建2个cshtml文件: MyHelper.cshtml: @helper MyTruncate(string input, int ...
- Ambari-部署常见问题
重新启动ambari-server端后调用install.start API后返回200 导致该问题的解决办法是server在启动后没有收到agent的心跳即没有与agent建立连接,在此时进行API ...