题目链接:点击打开链接

题意:

给定n座山

以下n个数字表示n座山的高度

若这座山u合法,则要满足:

1、若u的左边存在比u高的山,设v是u左边距离u近期的且严格比u高的山,在[v,u]之间至少有一座山x,使得x和u的高度差>=15000

2、右边也同理。

同一时候满足1、2的情况则算合法。

问:

输出全部合法的山。

思路:

求距离某个点近期的山就是维护一个单调栈,然后给山的高度求一个RMQ。

写写写。。。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<bits/stdc++.h>
template <class T>
inline bool rd(T &ret) {
char c; int sgn;
if(c=getchar(),c==EOF) return 0;
while(c!='-'&&(c<'0'||c>'9')) c=getchar();
sgn=(c=='-')?-1:1;
ret=(c=='-')?0:(c-'0');
while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
ret*=sgn;
return 1;
}
template <class T>
inline void pt(T x) {
if (x <0) {
putchar('-');
x = -x;
}
if(x>9) pt(x/10);
putchar(x%10+'0');
}
using namespace std;
typedef long long ll;
const int N = 100050;
int d[N*2][20];
void RMQ_init(int *A, int n) {
for (int i = 1; i <= n; ++i)
d[i][0] = A[i];
for (int j = 1; (1 << j) <= n; ++j)
for (int i = 1; i + j - 1 <= n; ++i) {
d[i][j] = min(d[i][j - 1], d[i + (1 << (j - 1))][j - 1]);
}
}
int RMQ(int L, int R) {
int k = 0;
while ((1 << (k + 1)) <= R - L + 1)
++k;
return min(d[L][k], d[R - (1 << k) + 1][k]);
}
int n, h[N], Stack[N], top;
int lh[N], rh[N];
void work(){
for(int i = 1; i <= n; i++)rd(h[i]);
top = 0;
for(int i = 1; i <= n; i++) {
while(top && h[ Stack[top-1] ] <= h[i])top--;
if(top) lh[i] = Stack[top-1];
else lh[i] = 0;
Stack[top++] = i;
}
top = 0;
for(int i = n; i; i--){
while(top && h[ Stack[top-1] ]<= h[i])top--;
if(top) rh[i] = Stack[top-1];
else rh[i] = 0;
Stack[top++] = i;
}
}
const int hehe = 150000;
vector<int>ans;
int main(){
while(cin>>n){
work();
RMQ_init(h, n);
ans.clear();
for(int i =1; i <= n; i++){
if(lh[i] == 0 && rh[i] == 0) ans.push_back(i);
else if(lh[i] == 0){
int v = RMQ(i, rh[i]);
if(h[i] - v >= hehe)
ans.push_back(i);
}
else if(rh[i] == 0){
int v = RMQ(lh[i], i);
if(h[i] - v >= hehe)
ans.push_back(i);
}
else {
int u = RMQ(lh[i], i), v = RMQ(i, rh[i]);
int maxx = max(u, v);
if(h[i] - maxx >= hehe)
ans.push_back(i);
}
}
for(int i = 0; i < ans.size(); i++){
pt(ans[i]);
if(i==ans.size()-1)puts("");
else putchar(' ');
}
}
return 0;
}

最新文章

  1. Nagios学习实践系列——产品介绍篇
  2. swift 构建类
  3. MySQL数据库迁移(转)
  4. 解决Linux中java.net.UnknownHostException: oracledb.sys.iflashbuy.com问题
  5. Android:PopupWindow简单弹窗改进版
  6. OpenStack优先
  7. Angularjs directive全面解读(1.4.5)
  8. Node.js之包与npm包管理工具
  9. model 字段参数 choice
  10. JSF action actionListner 详解
  11. Oracle_plsql_开发工具搭建最小化客户端
  12. 面试常问Spring IOC,不得不会。
  13. Install Virtualbox on ubuntu
  14. 【转】Code First 属性详解
  15. call与apply简单介绍
  16. nova-api源码分析(APP的调用)
  17. Asp.Net正则获取链接地址
  18. Javascript 中函数的 length 属性
  19. Android APK反编译详解(转)
  20. MySQL建表语句的一些特殊字段

热门文章

  1. SpringBoot错误信息总结(不定时更新)
  2. spark提交应用的方法(spark-submit)
  3. html中radio、checkbox选中状态研究(静下心来看,静下心来总结)
  4. gvim 窗口最大化启动
  5. 无法顺利删除问题处理一则-ORA-00604和ORA-00942错误
  6. PL/SQL精明的调用栈分析
  7. [Compose] 16. Apply multiple functors as arguments to a function (Applicatives)
  8. NOIP模拟 回文序列 - DP
  9. WPF+SignalR实现用户列表实时刷新
  10. MAC终端:如何调整字体大小和终端样式