51nod 1349 最大值
找到每个元素g[i]作为最大值的区间[L,R],那么以他为最大值的区间数有(i-L+1)*(R-i+1)个。
为了加速,以k为最大值的区间数放入H[k],再以此统计一个前缀和,更新入H。那么>=s的区间个数就是H[1e5]-H[s-1]。
留意:为了避免区间重复,对于同样的元素,左边遇到时继续延伸,用<=号,右边遇到时不再延伸,用<号。
比如{3,3},防止既以第一个3为基准统计了区间[1,2],又以第2个3为基准统计了[1,2]。
另,统计区间数时,因为有重复元素,比如以k为最大值的区间数为cnt,那么应该是H[k]+=cnt。而非H[k]=cnt。
#include <stdio.h>
#include <string.h> #define ll long long const ll maxN=1e5+;
ll N, M, K, T; ll g[maxN], h[maxN];
ll L[maxN], R[maxN]; int main() {
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
#endif
scanf("%lld", &N);
for (ll i = ; i <= N; ++i)
scanf("%lld", &g[i]);
scanf("%lld", &K); for (ll i = ; i <= N; ++i) {
L[i] = i - ;
R[i] = i + ;
} for (ll i = ; i <= N; ++i)
while (L[i] && g[L[i]] <= g[i])
L[i] = L[L[i]];
for (ll i = N; i >= ; --i)
while (R[i] <= N && g[R[i]] < g[i])
R[i] = R[R[i]];
/*
for (ll i = 1; i <= N; ++i)
printf("%lld %lld\n", L[i], R[i]);
puts("");
*/
memset(h, , sizeof h);
for (ll i = ; i <= N; ++i)
h[g[i]] += (i - L[i]) * (R[i] - i);
for (ll i = ; i < maxN; ++i)
h[i] += h[i - ]; for (ll i = , s; i < K; ++i) {
scanf("%lld", &s);
printf("%lld\n", h[maxN - ] - h[s - ]);
}
return ;
}
51nod 1349 最大值的更多相关文章
- 51nod 1349 最大值(单调栈)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1349 题意: 求区间内最大值大于等于k的区间个数. 思路: 利用求出对于 ...
- 51nod——1402最大值、2479小b分糖果 (套路)
1402最大值:正向从1到n,如果没有限制,就依次递增1,如果有限制,就取那个限制和递增到这的最小值.这样保证1和每个限制点后面都是符合题意的递增,但是限制点前面这个位置可能会有落差(之前递增多了). ...
- 51nod 1402 最大值 3级算法题 排序后修改限制点 时间复杂度O(m^2)
代码: 题意,第一个数为0,相邻的数相差0或者1,有一些点有限制,不大于给定值,求这组数中可能的最大的那个数. 这题我们看一个例子:第5个数的限制为2 1 2 3 4 5 6 7 8 9 0 1 2 ...
- 51nod 1402 最大值(贪心)
原题链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1402 思路:借鉴了这篇博文http://blog.csdn.n ...
- 51nod1349 最大值
还是傻叉单调栈 #include<cstdio> #include<cstring> #include<cctype> #include<algorithm& ...
- 51Nod 1277 字符串中的最大值(KMP,裸题)
1277 字符串中的最大值 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 一个字符串的前缀是指包含该字符第一个字母的连续子串,例如: ...
- 51nod 1277 字符串中的最大值
题目链接 51nod 1277 字符串中的最大值 题解 对于单串,考虑多串的fail树,发现next数组的关系形成树形结构 建出next树,对于每一个前缀,他出现的次数就是他子树的大小 代码 #inc ...
- 51Nod - 1640 天气晴朗的魔法 大+小生成树(最大值最小)/二分
天气晴朗的魔法 这样阴沉的天气持续下去,我们不免担心起他的健康. 51nod魔法学校近日开展了主题为“天气晴朗”的魔法交流活动. N名魔法师按阵法站好,之后选取N - 1条魔法链将所有魔法师的 ...
- COGS 2566. [51nod 1129] 字符串最大值
★★★ 输入文件:string_maxval.in 输出文件:string_maxval.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 一个字符串的前缀是指包 ...
随机推荐
- spring之IOC模拟实现
使用Spring框架已经有很长时间了,一直没有仔细的想过框架的设计思想是什么样的,底层到底是怎么实现的,这几天调试程序看了些源码,写下来做个记录.由于Spring框架博大精深,个人理解的难免有不正确的 ...
- Hardware Emulation Platform (硬件仿真平台) 在IC验证中的运用情况如何?
三个EDA公司都有自己的hardware emulation verification platform: Cadence Palladium, Synopsys ZeBu, Mentor Veloc ...
- *2.2.4 加入virtual interface
在前几节的例子中,driver中等待时钟事件(@posedge top.clk).给DUT中输入端口赋值(top.rx_dv <= 1' b1)都是使用绝对路径,绝对路径的使用大大减弱了验证平台 ...
- Flume1.6.0搭建
下载地址:http://archive.apache.org/dist/flume/ 解压完毕 切换到安装目录下/usr/local/flume/apache-flume-1.6.0-bin/conf ...
- oracle用plsql登陆出错,提示ORA-12170:TNS:链接超时 --------关闭防火墙试试
oracle用plsql登陆出错,提示ORA-12170:TNS:链接超时 但是使用sqlplus可以连接 ping 本机127.0.0.1 显示一般故障 后关闭防火墙,问题解决. ps:登录时使用@ ...
- ORACLE 分页 java 用jdbc方式以 sys账号连接oracle数据的问题
2,3,4,6,8 betwenen 为闭区间,前后都包括 select * from(select a.*,rownum rn from (select * from student) a ) ...
- ListView和Adapter
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...
- RxJS库
介绍 RxJS是一个异步编程的库,同时它通过observable序列来实现基于事件的编程.它提供了一个核心的类型:Observable,几个辅助类型(Observer,Schedulers,Subje ...
- C# 之正则表达式运用
C#正则验证大全 Regex.IsMatch()正则表达式验证 需要引入命名空间 using System.Text.RegularExpressions; #region 验证文本框输入为数字 ...
- C/C++:Windows cmd 指令
一.快捷键1. Windows键 自从104键盘首次加入Windows键后,微软便一直计划为这个键添加更多功能,当然Win8也不例外. * Win+C:调出应用Charm菜单(Metro.传统桌面) ...