51nod——2476 小b和序列 预处理

  对于每一个元素,预处理出它作为最小值,两边可以作用到的最大位置。比如下标∈[0,8]的这个数组:1 8 6 2 5 4 3 8 7,1可以作用到所有区间,2可以作用到区间[1,8],第一个8可以作用到[1,7]。也就是说从两边分别找到第一个大于等于这个元素的位置,然后标记,其实就是找最宽的区间长度。可能左边更宽也可能右边更宽,对所有元素的max(a[i]*(i-l[i])),a[i]*(r[i]-i)) 求max就是答案了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define maxn 50050
 4 int a[maxn],l[maxn],r[maxn];
 5 int main(){
 6     std::ios::sync_with_stdio(0);
 7     cin.tie(0);
 8     int n; cin>>n;
 9     for(int i=0;i<n;i++) cin>>a[i];
10
11     for(int i=0;i<n;i++){//预处理 找到可以以a[i]为最小值的区间
12         int ll=0,rr=n-1;
13         while(a[ll]<a[i]) ll++;
14         l[i]=ll;
15         while(a[rr]<a[i]) rr--;
16         r[i]=rr;
17     }
18     int maxx=0;
19
20     for(int i=0;i<n;i++)
21         maxx=max(max(maxx,a[i]*(i-l[i])),a[i]*(r[i]-i));
22     cout<<maxx<<endl;
23     return 0;
24 }

原文地址:https://www.cnblogs.com/noobimp/p/10946960.html

时间: 2024-08-05 04:05:12

51nod——2476 小b和序列 预处理的相关文章

51NOD算法马拉松 最大值问题 离线预处理+set lower_bound

题目:http://www.51nod.com/contest/problem.html#!problemId=1349 题意:100000个数的序列,有100000次询问,每次问区间最大值大于等于k的区间有多少? 思路:一开始没看到"大于等于",想了很久也不会,原来看错题了.看错题害死人. 一般询问的问题,如果不能用线段树log(n)求出,那么就离线做. 首先将询问按从大到小排序,再将序列中的每个数排序,注意记录序号. 对于当前询问,每加进一个数,我需要找到它在加进的序列(按大小有序

NTT【51nod】1514 美妙的序列

题意:1~n 的全排列中,有多少个排列满足任意从中间切成两段后,左边段的最大值大于右边段的最小值? 例如:n为3时有3种 2 3 1 3 1 2 3 2 1 解释:比如 2 3 1 (2) (3 1) 1比2小 (2 3) (1) 1比2小 都满足上面的条件. 3 2 1 (3)(2 1) 1比3小 (32)(1)  1比3小 都满足上面的条件. 而2 1 3不满足,因为(2 1)(3),3比左边所有的数都大. ====================================分割线===

小Z爱序列(NOIP信(sang)心(bin)赛)From Fall_Dream(粗制单调队列&amp;单调栈的算法解析)

原题: 小Z最擅长解决序列问题啦,什么最长公共上升然后下降然后上升的子序列,小Z都是轻松解决的呢. 但是小Z不擅长出序列问题啊,所以它给了你一道签到题. 给定一个n个数的序列ai,你要求出满足下述条件的点对的数量. 假设点对是(i , j),max(l,r)是[l,r]当中最大的ai的值. 这个点对满足条件当且仅当i+1<j 且 ai < max(i+1,j-1) < aj 为了简单,保证输入的是一个1-n的排列.相信你已经会做了吧? 输入/输出格式 输入数据第一行有一个数字n,然后第二

51nod 1631 小鲨鱼在51nod小学

基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 鲨鱼巨巨2.0(以下简称小鲨鱼)以优异的成绩考入了51nod小学.并依靠算法方面的特长,在班里担任了许多职务. 每一个职务都有一个起始时间A和结束时间B,意为小鲨鱼在[A, B]时间内,担任了某职务(inclusively). 现在给定小鲨鱼的职务履历表,你可以高效的给出小鲨鱼在某天担任了哪些职务吗? p.s. 由于小鲨鱼担任的职务太多,所有任期小于一个自然月的职务都忽略不计.(如1月1日~2月1日为一个自然月,

Python实践:猜数字小程序Collatz序列

猜数字 代码 ''' 猜数字小游戏,不断输入你所猜的数(1-100),程序会根据你的输入提醒你进行 适当调整所猜数的大小,直到最后猜出这个随机数 ''' guessNumber = random.randint(1,100) print("I'm thinking a number between 1 and 100.") while True: print('Take a guess.') guess = int(input()) if guess > guessNumber:

51nod 1471 小S的兴趣 sqrt

小S喜欢有趣的事.但是,每个人的兴趣都是独特的.小S热衷于自问自答.有一天,小S想出了一个问题. 有一个包含n个正整数的数组a和针对这个数组的几个问题.这些问题有两种类型: 1.      在数组下标l到r的部分上,将一个单元格循环移动到右端.即以下面方式重新分配数组上的元素. a[l], a[l+1], ..., a[r-1], a[r] → a[r], a[l], a[l+1], ..., a[r-1]. 2.      在数组下标l到r的部分上,计算有多少元素的值与k相等. 小S很喜欢这个

51nod 1831 小C的游戏

小C和小L是好朋友,她们在玩一个游戏. 一开始有一个大小为n的石子堆,小C先手. 每次可以对这个石子堆拿走一个或者把这个石子堆分成等量的几份并只取其中一份(不能不变或只剩下一个). 如果取走最后一个人的算败,请问这个游戏小C是否能胜. Input一行表示数据组数Tcases(Tcases<=1,000). 后面Tcases行每行一个n(n<=1,000,000,000).Output有Tcases行对于先手获胜输出“TAK”,先手狗带输出“NIE”.Sample Input 1 5 Sampl

51nod 1126 求递推序列的第N项 &amp;&amp; hdu - 1005 Number Sequence (求周期)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1126 http://acm.hdu.edu.cn/showproblem.php?pid=1005 注意上面一题和下面一题的区别,上面A,B可能取负数,但是mod跟c++中%是不一样的,mod只会得到非负数,两次跳进这个坑了. 然后就找周期,只要f[i-1]==1&&f[i]==1就可以跳出,然后i-2就是周期,输出n%(i-2)的时候,要注意如果等于0的话,其实

算法题:括号匹配(小中大括号序列)

括号序列由( )[ ]{ }组成,不合法的括号序列由( { ) },[ } { ],等等.编程实现一个函数,检查一个括号序列是否是合法的括号序列. 解法: 思路和"后缀表达式的求解"相似.我们借助栈,每读一个括号,如果是左括号,那么入栈,然后继续读下一个括号:如果是右括号,那么就要看看这个右括号和栈顶的括号是否匹配:如果匹配,那么弹出栈顶的括号,继续读下一个括号.当栈变空时,说明此括号序列是合法的. public class Test05 { public static boolean