2065. 学数数

★★★☆   输入文件:jxthree.in   输出文件:jxthree.out   简单对比
时间限制:1 s   内存限制:256 MB

【题目描述】

从前有一只咩,还有一只叽,还有……嗯……一只毒。

毒是咩和叽的师父。

咩经常算不对像3+0.5这样的数,它总认为3+0.5=5。叽经常算不对60+20这样的数,它总认为60+20=100。

所以毒为了锻炼它们数数的能力,想出了下面这个游戏:

毒先在纸上写下n个数a1,a2,…,an,然后咩和叽会找出所有的连续子数组(共有n*(n+1)/2个),在自己的纸上记录下每个连续子数组的最大值,那之后毒会给

咩和叽Q个问题,每个问题形如下面三种之一:

1.记录的数中有多少个大于K?

2.记录的数中有多少个等于K?

3.记录的数中有多少个小于K?

然而这只咩太蠢了,总是答错毒的问题,咩很伤心,请你帮帮它吧!

【输入格式】

第一行两个整数n,Q。

第二行n个整数a1,a2,…,an。

下面Q行,每行有一个字符op和一个整数K。

如果op是“>”,说明是第一种问题。

如果op是“=”,说明是第二种问题。

如果op是“<",说明是第三种问题

【输出格式】

共有Q行,第i行表示第i个问题的答案。

【样例输入】

3  5

1  2  3

>  1

<  2

=  3

>  4

<  5

【样例输出】

5

1

3

0

6

【提示】

咩和叽的纸上应该写着1,2,2,3,3,3。

数据范围与约定

对于20%的数据,1≤n≤200,1≤Q≤200,1≤ai,K≤10^6。

对于40%的数据,1≤n≤5000,1≤Q≤5000,1≤ai,K≤10^6。

对于60%的数据,1≤n≤10^5,1≤Q≤10^5,1≤ai,K≤10^6,ai两两不同。

对于80%的数据,1≤n≤10^5,1≤Q≤10^5,1≤ai,K≤10^6。

对于100%的数据,1≤n≤10^5,1≤Q≤10^5,1≤ai,K≤10^9。

题解

我们大概可以注意到, 以某个数为最大值的最大连续子数组的左右端点都会延伸到比该数大的第一个数的右/左边, 而连续子数组的个数就等于它向右延伸的个数乘以向左延伸的个数. 所以我们可以预处理出这个左右端点(或者左/右边第一个比它大的数的位置), 然后对它求前缀和, 按需响应查询就可以了

而至于左右端点的预处理, 我们首先对它进行离散化, 然后使用树状数组( $O(nlog(n))$ )或者单调栈( $O(n)$ )分别从两个方向扫描一遍来处理.

然后就是注意区间要左闭右开防止重复计数

参考代码

这里是单调栈的版本

GitHub

 #include <stack>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> const int MAXN=; int n;
int q;
int* sed;
int a[MAXN];
int b[MAXN];
int s[MAXN];
int l[MAXN];
int r[MAXN];
long long cnt[MAXN]; void Initialize();
template<class T> void Clear(T&); int main(){
Initialize();
int tmp;
char buf[];
for(int i=;i<=n;i++){
tmp=std::lower_bound(s+,sed,a[i])-s;
cnt[tmp]+=1ll*(i-l[i]+)*(r[i]-i+);
}
for(int i=;i<=n;i++){
cnt[i]+=cnt[i-];
}
while(q--){
scanf("%s%d",buf,&tmp);
if(*buf=='>'){
int x=std::upper_bound(s+,sed,tmp)-s;
printf("%lld\n",cnt[sed-s-]-cnt[x-]);
}
else if(*buf=='='){
int x=std::lower_bound(s+,sed,tmp)-s;
printf("%lld\n",s[x]==tmp?(cnt[x]-cnt[x-]):);
}
else if(*buf=='<'){
int x=std::lower_bound(s+,sed,tmp)-s;
printf("%lld\n",cnt[x-]);
}
}
return ;
} void Initialize(){
freopen("jxthree.in","r",stdin);
freopen("jxthree.out","w",stdout);
scanf("%d%d",&n,&q);
for(int i=;i<=n;i++){
scanf("%d",a+i);
s[i]=a[i];
}
std::sort(s+,s+n+);
sed=std::unique(s+,s+n+);
std::stack<int> s;
for(int i=;i<=n;i++){
while(!s.empty()&&a[s.top()]<=a[i])
s.pop();
l[i]=s.empty()?:s.top()+;
s.push(i);
}
Clear(s);
for(int i=n;i>;i--){
while(!s.empty()&&a[s.top()]<a[i])
s.pop();
r[i]=s.empty()?n:s.top()-;
s.push(i);
}
} template<class T> void Clear(T& x){
T tmp;
std::swap(tmp,x);
}

Backup

[COGS 2065]学数数的更多相关文章

  1. 8.22 NOIP模拟测试29(B) 爬山+学数数+七十和十七

    T1 爬山 二分最高高度,$O(1)$判断是否可行. #include<iostream> #include<cstdio> #define ll long long usin ...

  2. NOIP模拟测试29「爬山·学数数·七十和十七」

    爬山题解不想写了 学数数 离散化然后找到以每一个值为最大值的连续子段有多少个,然后开个桶维护 那么怎么找以每一个值为最大值的连续子段个数 方法1(我的极笨的方法) 考试时我的丑陋思路, 定义极左值为左 ...

  3. wmz的数数(数状数组)

    wmz的数数(数状数组) 题目描述 \(wmz\)从小就显现出了过人的天赋,他出生的第三天就证明了哥德巴赫猜想,第五天就证明了质能方程,出生一星期之后,他觉得\(P\)是否等于\(NP\)这个问题比前 ...

  4. 【SDOI2014】数数(补)

    见 AC自动机(补坑了) [SDOI2014] 数数 简要题意:  我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为子串.例如当S={22,333,0233}时 ...

  5. 【BZOJ】【3530】【SDOI2014】数数

    AC自动机/数位DP orz zyf 好题啊= =同时加深了我对AC自动机(这个应该可以叫Trie图了吧……出边补全!)和数位DP的理解……不过不能自己写出来还真是弱…… /************* ...

  6. BZOJ3530: [Sdoi2014]数数

    3530: [Sdoi2014]数数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 322  Solved: 188[Submit][Status] ...

  7. 【HDU3530】 [Sdoi2014]数数 (AC自动机+数位DP)

    3530: [Sdoi2014]数数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 682  Solved: 364 Description 我们称一 ...

  8. COJ 0036 数数happy有多少个?

    数数happy有多少个? 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 图图是个爱动脑子.观察能力很强的好学生.近期他正学英语 ...

  9. BZOJ 3530: [Sdoi2014]数数 [AC自动机 数位DP]

    3530: [Sdoi2014]数数 题意:\(\le N\)的不含模式串的数字有多少个,\(n=|N| \le 1200\) 考虑数位DP 对于长度\(\le n\)的,普通套路DP\(g[i][j ...

随机推荐

  1. 安装caffe(opencv3+anaconda3)

    目录 仅安装CPU版本的caffe 1.下载相关的依赖包: 2.安装opencv3 3.安装caffe 参考文献: 仅安装CPU版本的caffe 1.下载相关的依赖包: sudo apt-get in ...

  2. 跟着Nisy一起学习C语言

    编辑器是使用环境turboc的IDE,使用dos窗口中的edit作为编辑器,有点类似于vim:使用的是xp-sp3的虚拟机上的系统. Nisy说要有两种语言,脚本语言以及一个底层语言,比如现在我的py ...

  3. [转]MONTHS_BETWEEN Function - Oracle to SQL Server Migration

    本文转自:http://www.sqlines.com/oracle-to-sql-server/months_between In Oracle, MONTHS_BETWEEN(date1, dat ...

  4. var、let、const的区别,以及作用范围。

    在es5中一般经常使用的变量有两个级别,一个是用var声明的全局级别的变量,另外一个是函数级别是用var生命在函数内的.本文中将详细讲解我对es6中的const和let的区别. let的使用以及作用范 ...

  5. SQL Serever学习4

    SQL Server系统中数据库相关概念 在SQLServer数据库系统中分为2大类,系统数据库和用户数据库. SQLServer安装后系统会自动生成4个系统数据库,他们是Master,Model,M ...

  6. guava快速入门(二)

    Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] .缓存 [caching] .原生类型支持 [primitives support] ...

  7. C#同步、异步编程

    同步编程public partial class Form1 : Form { public Form1() { InitializeComponent(); } //同步执行 private voi ...

  8. <深入理解JavaScript>学习笔记(5)_强大的原型和原型链

    前言 JavaScript 不包含传统的类继承模型,而是使用 prototypal 原型模型. (prototypal :原型.学好英语还是很重要的) 虽然这经常被当作是 JavaScript 的缺点 ...

  9. 多边形游戏(DP)

    Description 多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形.每个顶点被赋予一个整数值,每条边被赋予一个运算符 "+" 或 "*". ...

  10. centos 网络很慢且无法远程登陆的解决办法

    安装了centOS,但是发现网速实在是卡得几乎不能上网,连百度都打不开 后来想到偶然记得有一次看过一段话,说到关闭ipv6,测试来一下,果然有效,关闭来ipv6打开网速飞快. 关闭方法,在/etc/m ...