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次的数有几个,然后乱搞搞……就好了 # ...
随机推荐
- 2018.03.04 晚上Atcoder比赛
C - March Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statement There are N ...
- GlobalSign 企业型SSL 证书
GlobalSign 企业型SSL 证书 GlobalSign 企业型 SSL 证书属于OV SSL,进行严格的网站所有权的验证,企业真实身份验证,证书标识企业组织机构名称,增加信任度.提供40位 ...
- ansible plugins 列表
[action plugins] [cache plugins]jsonfilememcachedmemorymongodbpickleredisyaml [callback plugins]acti ...
- ReatEasy+用户指南----第9章@MatrixParam
转载说明出处:http://blog.csdn.net/nndtdx/article/details/6870391 原文地址 http://docs.jboss.org/resteasy/docs/ ...
- 如何实现在scrapy调试爬虫
# -*- coding:utf-8 -*- from scrapy.cmdline import execute import sys import os '''在爬虫文件夹下面自定义一个main. ...
- 单词接龙(codevs 1018)
2000年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 单词接龙是一个与我们经 ...
- poj 1837 Balance (0 1 背包)
Balance Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10326 Accepted: 6393 题意:给你n个挂 ...
- 迅为4412开发板Linux驱动教程/硬件知识及原理图的使用
视频教程下载地址:http://pan.baidu.com/s/1pJwxUfL 嵌入式研发流程介绍 • PCB研发流程介绍 – 方案,原理图(网表) – layoutproject师(gerber文 ...
- Android实战之 万能的接口回调
转载请标明原地址:http://blog.csdn.net/gaolei1201/article/details/47084111 前言:本人也算是自学"成才",呵呵,大学时尽管学 ...
- 详略。。设计模式1——单例。。。。studying
设计模式1--单例 解决:保证了一个类在内存中仅仅能有一个对象. 怎么做才干保证这个对象是唯一的呢? 思路: 1.假设其它程序可以任意用new创建该类对象,那么就无法控制个数.因此,不让其它程序用ne ...