acdream 小晴天老师系列——我有一个数列! (ST算法)
小晴天老师系列——我有一个数列!
Time Limit: 20000/10000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)
Submit Status
Problem Description
小晴天:“我有一个数列!”
小晴天:“我还要有很多很多的数列!”
于是小晴天就把这个数列的所有连续子数列写出来。
然后小晴天把每个连续子数列中的最大的数写出来。
那么,有多少个比K大呢?
Input
多组数据,首先是一个正整数t(t<=100),表示数据的组数
对于每组数据,首先是两个整数n(1<=n<=200000),K(0<=K<=10^9).,但所有数据中的n之和不超过1000000.
接下来是n个整数a[i](1<=a[i]<=10^9)
Output
对于每组数据,输出一个整数,表示最大元素大于K的连续子序列的个数。
Sample Input
2
3 2
1 2 3
3 1
1 2 3
Sample Output
3
5
Hint
对于样例一,共有6个连续子序列{1}{2}{3}{1,2}{2,3}{1,2,3}(注意{1,3}不满足题意,因为不连续),其中最大元素大于2的共有3个{3}{2,3}{1,2,3},对于样例二,大于1的连续子序列共有5个,{2}{3}{1,2}{2,3}{1,2,3}
思路:ST算法可以解决。用 O(n*n)枚举每个区间,用ST算法在O(1)找到每个区间的最大再与k比较。
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N=;
int a[N], cur;
int big[N][], small[N][]; void pre_cal(int n)
{
memset(big,,sizeof(big));
memset(small,,sizeof(small)); for(int i=; i<=n; i++)
{
big[i][]=a[i];
small[i][]=a[i];
} for(int i=,q=; i<=n; i<<=,q++) //以i为距离
{ for(int j=; j<=n; j++ )
{
if(j+i-<=n)
{
big[j][q]=max(big[j][q-],big[ j+i/ ][q-]);
small[j][q]=min(small[j][q-],small[ j+i/ ][q-]);
}
else break;
}
}
} unordered_map<int,int> mapp,mapp2;
void init() //获得二进制最高位,这个也可以先处理的。
{
for(int j=; j<=N; j++)
{
int tmp=, cnt=;
for(int i=; i<; i++)//找出二进制最高位的1
{
if(!(j>>i))
{
tmp=((j>>(i-))<<(i-));
break;
}
cnt++;
}
mapp2[j]=tmp;//记录j只剩最高位的值
mapp[j]=cnt;//记录tmp是2的几次幂
}
} bool iscor(int l, int r) //判断这个区间是否满足要求
{
int len=r-l+;
int da= max( big[l][ mapp[len] ], big[ r-mapp2[len]+ ][ mapp[len] ]);
int xiao=min( small[l][ mapp[len] ], small[ r-mapp2[len]+ ][ mapp[len] ]);
return da-xiao<cur? true :false; } int main(void)
{
freopen("e://input.txt", "r", stdin);
int t, n;
init();
cin>>t;
while(t--)
{
scanf("%d%d",&n,&cur);
for(int i=; i<=n; i++) scanf("%d",&a[i]);
pre_cal(n);
LL cnt=;
int l=, r=;
while(r<=n)
{
if( iscor(l,r) ) r++;
else
{
cnt+=r-l;
l++;
}
}
while(l<r) cnt+=r-l,l++;
printf("%lld\n",cnt);
}
return ;
}
AC代码
acdream 小晴天老师系列——我有一个数列! (ST算法)的更多相关文章
- E - 小晴天老师系列——我有一个数列!
E - 小晴天老师系列——我有一个数列! Time Limit: 20000/10000MS (Java/Others) Memory Limit: 128000/64000KB (Java/O ...
- acdream 小晴天老师系列——竖式乘法(简单穷举)
小晴天老师系列——竖式乘法 Time Limit: 4000/2000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) ...
- acdream 小晴天老师系列——苹果大丰收(DP)
小晴天老师系列——苹果大丰收 Problem Description 小晴天的后花园有好多好多的苹果树,某天,苹果大丰收~小晴天总共摘了M个苹果,我们假设苹果之间是不可分辨的. 为了保存苹果,小晴天买 ...
- acdream 小晴天老师系列——晴天的后花园 (暴力+剪枝)
小晴天老师系列——晴天的后花园 Time Limit: 10000/5000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) ...
- [ACdream]小晴天老师系列——竖式乘
题目链接:http://acdream.info/contest?cid=1269#problem-C Problem Description 小晴天是ACdream团队中最牛的老师之一,他最擅长数学 ...
- C -小晴天老师系列——竖式乘法
C - 小晴天老师系列——竖式乘法 Time Limit: 4000/2000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others ...
- G - 小晴天老师系列——可恶的墨水瓶
G - 小晴天老师系列——可恶的墨水瓶 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Othe ...
- D - 小晴天老师系列——晴天的后花园
D - 小晴天老师系列——晴天的后花园 Time Limit: 10000/5000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Oth ...
- F - 小晴天老师系列——苹果大丰收
F - 小晴天老师系列——苹果大丰收 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Other ...
随机推荐
- 01_SQlite数据库简介
- 《精通Spring4.X企业应用开发实战》读后感第四章(资源访问)
package com.smart.resource; import org.springframework.core.io.ClassPathResource; import org.springf ...
- prototype for '类名::函数名'does not match any in class'类名'
函数声明和定义参数类型必须相同. 前置声明一定要放到名称空间内,代表该名称空间内的类.
- JavaWeb_tomcat设置默认应用
在tomcat的server.xml文件中设置默认应用. 在tomcat文件目录里面的conf/server.xml文件中,在<Engine>...</Engine>中再增加一 ...
- poj3468(线段树区间更新&区间求和模板)
题目链接: http://poj.org/problem?id=3468 题意: 输入 n, m表初始有 n 个数, 接下来 m 行输入, Q x y 表示询问区间 [x, y]的和: C x y z ...
- AGC001 D - Arrays and Palindrome【构造】
把回文串的相等关系连一下,发现最后要求的是一笔画问题 注意到奇数长度的中间有一个单独没有连线的,所以a数组至多有两个奇数值 如果没有奇数,那么b在最前面放一个1,然后把a[1]~a[m-1]放上去,这 ...
- 在Mybatis中处理sql中的大于号小于号
因为xml格式中,不能随便出现"<".“>”等符号,所以在sql中这一类的符号要进行特殊处理 第一种方法:使用转义字符替换特殊的符号 例如 SELECT * FROM ...
- Linux服务器上的禅道迁移及升级方法(Linux to Linux)
由于阿里云服务器(Linux系统)到期停用,故需要将部署在该服务器上的禅道迁移到新的Linux服务器上.另外,借此机会,正好可以对旧版禅道进行一次升级.下面总结此次迁移和升级的具体操作方法. 一.禅道 ...
- 自动化测试 Cucumber
Cucumber是一个能够理解用普通语言描述的测试用例的支持行为驱动开发(BDD)的自动化测试工具,用Ruby编写,支持Java和.Net等多种开发语言. Cucumber 三大组成: Feature ...
- 黑马学习Ajax 跨域资源共享 jQuery+jsonp实现