Sequence query 好题啊
Sequence query
Problem Description
Given a sequence of N positive numbers,and M queries
A query maybe :
1 x,find the Maximun "weight" of the consecutive subsequence whose length >= x
2 x, find the Minimum length of the consecutive subsequence whose weight >= x
the weight of a consecutive subsequence Seq:weight(Seq) = length of Seq * minimum number in Seq.
Input
The first line is an integer T(1<=T<=100) ,the number of test cases;
For each test case,
the first line contains two integer N,M(1<=N,M<=100000)
the second line contains N positive integers(all between [1,2^31-1])
The following M lines contains queries as descripted above, all number is within signed ilong long
any subsequences should not be empty(length >= 1)
Output
for each query,output a line contains an answer you find,if the answer doesn't exist,output -1
Sample Input
1
2 2
1 2
1 2
2 1
Sample Output
2
1
用单调栈预处理出当以 a[i]为最小值的时候,最左向左延伸到哪里,最右向右延伸到哪里
不妨设为 lt[i],rt[i].
伪代码: a[0] = a[n + 1] = -1;
for(int i = 1; i <= n; i ++) {
lt[i] = i;
while(a[i] <= a[lt[i] - 1]) lt[i] = lt[lt[i] - 1];
}
rt[i]同样处理。当然,有很多种处理方法。
用 max_len[i]表示,当长度为 i 的时候,延伸长度不小于 i 的 ai 的最大值, for(int i = 1; i <= n; i ++) max_len[rt[i] - lt[i] + 1] = max(max_len[rt[i] - lt[i] + 1],a[i]);
max_len[i] = max(max_len[i],max_len[i + 1])
对于第一问,处理一个后缀,dp[i] = max(dp[i + 1],max_len[i] * i)
输入一个 x,判掉不合法的之后,直接输出 dp[x]
对于第二问,和第一问类似,处理一个前缀,然后需要二分。
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <queue>
using namespace std;
#define ll long long
ll a[],lt[],rt[],n;
ll dp[],dp1[],maxlen[];
void fun(ll x)
{
int l,r,ans,m;
l=,r=n,ans=-;
while(l<=r)
{
m=(l+r)>>;
if(x>dp1[m])
{
l=m+;
}
else
{
r=m-;
ans=m;
}
}
printf("%d\n",ans);
}
int main()
{
//freopen("in.txt","r",stdin);
int t,i,m;
ll x,y;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
a[n+]=a[]=-;
for(i=; i<=n; i++)
scanf("%lld",&a[i]);
for(i=; i<=n; i++)
{
lt[i]=i;
while(a[i]<=a[lt[i]-])lt[i]=lt[lt[i]-];
}
for(i=n; i>=; i--)
{
rt[i]=i;
while(a[i]<=a[rt[i]+])rt[i]=rt[rt[i]+];
}
memset(maxlen,,sizeof(maxlen));
for(i=; i<=n; i++)
maxlen[rt[i]-lt[i]+]=max(maxlen[rt[i]-lt[i]+],a[i]);
for(i=n-; i>=; i--)
maxlen[i]=max(maxlen[i],maxlen[i+]);
memset(dp,,sizeof(dp));
memset(dp1,,sizeof(dp1));
for(i=n; i>=; i--)
dp[i]=max(dp[i+],maxlen[i]*i);
for(i=; i<=n; i++)
dp1[i]=max(dp1[i-],maxlen[i]*i); for(i=; i<m; i++)
{
scanf("%lld%lld",&x,&y);
if(x==)
{
if(y>n)
printf("-1\n");
else
{
if(y<=)
y=;
printf("%lld\n",dp[y]);
} }
else
{
fun(y);
}
}
}
}
Sequence query 好题啊的更多相关文章
- hdu 1005:Number Sequence(水题)
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- HDU 1711 Number Sequence(KMP裸题,板子题,有坑点)
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- BZOJ1345 Baltic2007 序列问题Sequence 【思维题】*
BZOJ1345 Baltic2007 序列问题Sequence Description 对于一个给定的序列a1,…,an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用 ...
- HDU——1005Number Sequence(模版题 二维矩阵快速幂+操作符重载)
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- hdoj--1005--Number Sequence(规律题)
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- Codeforces Round #384 (Div. 2) B. Chloe and the sequence(规律题)
传送门 Description Chloe, the same as Vladik, is a competitive programmer. She didn't have any problems ...
- 5805 NanoApe Loves Sequence(想法题)
传送门 NanoApe Loves Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/131072 K ( ...
- HDU 5783 Divide the Sequence (训练题002 B)
Description Alice has a sequence A, She wants to split A into as much as possible continuous subsequ ...
- HDU 1711 - Number Sequence - [KMP模板题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Time Limit: 10000/5000 MS (Java/Others) Memory L ...
随机推荐
- JS函数参数
1.js不是面向对象,不可以重载函数.如果两个函数方法名相同,参数不同,那么js加载时后面的函数会覆盖前面的函数. 所以调用函数时只会调用后面的方法. 2.js设置可变参数时,可以用arguments ...
- 关于Java的发展前景
各位看官觉得Java还能火几年?未来的发展方向是什么?
- html5shiv.js和respond.min.js
做页面常用的东西,写这里用的时候省点去找了... html5shiv:解决ie9以下浏览器对html5新增标签的不识别,并导致CSS不起作用的问题. respond.min:让不支持css3 Medi ...
- 闭锁——CountDownLatch
一.概念 闭锁是一个同步工具类,主要用于等待其他线程活动结束后,再执行后续的操作.例如:在王者荣耀游戏中,需要10名玩家都准备就绪后,游戏才能开始. CountDownLatch是concurrent ...
- Python 进程与线程小随笔
Process 涉及模块:multiprocessing Process p = Process() p.start() p.join() from multiprocessing import Pr ...
- make: Nothing to be done for 'all' 解决方法
make: Nothing to be done for 'all' 解决方法 1.这句提示是说明你已经编译好了,而且没有对代码进行任何改动. 若想重新编译,可以先删除以前编译产生的目标文件:make ...
- 201521123084 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...
- 【Beta】 第一次Daily Scrum Meeting
一.本次会议为第一次meeting会议 二.时间:20::0AM-20:50AM 地点:宿舍楼下 三.会议站立式照片 四.今日任务安排 成员 昨日任务 今日任务 林晓芳 对已完成的功能进行进一步测 ...
- 团队作业4——第一次项目冲刺(Alpha版本)4.23
·本次会议为第二次Scrum Meeting会议~ ·本次会议项目经理召开时间为17:00,在教学楼教室召开,召开时长约30分钟,探讨了昨日任务的进展.查重功能.今日要做的任务以及后续所要开展的工作. ...
- C++学习笔记——STL(标准模板库)
1.首先.需要学习C++ 模板的概念 2.C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量.链表. ...