题目背景

在那遥远的西南有一所学校

/*被和谐部分*/

然后去参加该省省选虐场

然后某蒟蒻不会做,所以也出了一个字符串题:

题目描述

给你一个字符串a,每次询问一段区间的贡献

贡献定义:

每次从这个区间中随机拿出一个字符x,然后把x从这个区间中删除,你要维护一个集合S

如果S为空,你rp减1

如果S中有一个元素不小于x,则你rp减1,清空S

之后将x插入S

由于你是大爷,平时做过的题考试都会考到,所以每次询问你搞完这段区间的字符之后最多还有多少rp?rp初始为0

询问之间不互相影响~

输入输出格式

输入格式:

第一行两个数n,m,表示字符串长度与询问次数

之后一行n个数,表示字符串

由于你是大爷,所以字符集1e9

之后m行每行两个数,表示询问的左右区间

输出格式:

m行,每行一个数表示答案

输入输出样例

输入样例#1:

3 3
3 3 3
3 3
3 3
3 3
输出样例#1:

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

最新文章

  1. (原)3.1 Zookeeper应用 - Master选举
  2. max min 与 min max 的差别
  3. SQL Server 存储(5/8):理解IAM 页
  4. LeetCode127:Word Ladder II
  5. 去除Coding4Fun中MessagePrompt的边框(Border)
  6. JavaScript 类、构造函数、原型
  7. orm查询
  8. CF1097G Vladislav and a Great Legend
  9. Computer Study
  10. 计划任务crond服务
  11. Atitti 住房部建设指南
  12. 【机器学习】Softmax 和Logistic Regression回归Sigmod
  13. Object-c和Java中的代理
  14. day17(JDBC入门&jdbcUtils工具介绍)
  15. Codeforces Round #262 (Div. 2) E. Roland and Rose 暴力
  16. Web应用程序项目OxiteSite已配置为使用IIS.在本地计算机上找不到服务器
  17. Activiti 教程
  18. 不用jquery实现tab页切换,刷新,后退,前进状态自动维护 很好用
  19. 基于webSocket的聊天室
  20. SEO优化100条

热门文章

  1. 棋盘DP三连——洛谷 P1004 方格取数 &amp;&amp;洛谷 P1006 传纸条 &amp;&amp;Codevs 2853 方格游戏
  2. POJ 2823 Sliding Window &amp; Luogu P1886 滑动窗口
  3. uva-679 Dropping Balls UVA - 679
  4. MySQL数据库操作(一)
  5. ThinkPHP5 自定义异常
  6. selenium动作链
  7. 洛谷 1373 dp 小a和uim之大逃离 良心题解
  8. hdu 4975 最大流解决行列和求矩阵问题,用到矩阵dp优化
  9. fzu 2122
  10. Java端百度云推送消息Demo