链接

这题意甚是难懂。。当且峰值为h 如果他能为ultras 需要满足条件 d>=15W d满足它到任意一个比它高的点须经过h-d这个点

通俗一点来说,如果这个点满足条件 就找离他最近的一个<=h-15W的点 看他们之间是否有比它更高的点  如果没有的话 它就满足条件 需要左右两边找。

用线段树依次插入点值  位置为节点值 更新最大值及最小值。

需要离散化 卡时间。。

 #include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<cmath>
using namespace std;
#define N 1000010
#define M 100010
int s[N<<],ss[N<<];
int h[M],o[M],n,p[N],hi[M<<];
bool f[M],ff[N];
void update(int oo,int p,int d,int l,int r,int w)
{
if(l==r)
{
if(oo)
s[w] = d;
else
ss[w] = d;
return ;
}
int m = (l+r)>>;
if(p<=m)
update(oo,p,d,l,m,w<<);
else
update(oo,p,d,m+,r,w<<|);
if(oo)
s[w] = max(s[w<<],s[w<<|]);
else
ss[w] = min(ss[w<<],ss[w<<|]);
}
int query(int oo,int a,int b,int l,int r,int w)
{
if(a<=l&&b>=r)
{
if(oo)
return s[w];
else
return ss[w];
}
int m = (l+r)>>,re;
if(oo)
{
re = ;
if(a<=m)
re = query(oo,a,b,l,m,w<<);
if(b>m)
re = max(re,query(oo,a,b,m+,r,w<<|));
}
else
{
re = n+;
if(a<=m)
re = query(oo,a,b,l,m,w<<);
if(b>m)
re = min(re,query(oo,a,b,m+,r,w<<|));
}
return re;
}
void build(int l,int r,int w,int oo)
{
if(l==r)
{ if(oo)
s[w] = ;
else
ss[w] = n+;
return ;
}
int m = (l+r)>>;
build(l,m,w<<,oo);
build(m+,r,w<<|,oo);
if(oo)
s[w] = max(s[w<<],s[w<<|]);
else
ss[w] = min(ss[w<<],ss[w<<|]);
}
int main()
{
int i;
int hh = ,num=;
while(scanf("%d",&n)!=EOF)
{
memset(f,,sizeof(f));
memset(ff,,sizeof(ff));
int mm = ,e = ;
for(i = ; i <= n ;i++)
{
scanf("%d",&h[i]);
if(!ff[h[i]])
{
hi[e++] = h[i];
ff[h[i]] = ;
}
if(h[i]>hh)
{
if(!ff[h[i]-hh])
hi[e++] = h[i]-hh;
ff[h[i]-hh] = ;
}
}
sort(hi,hi+e);
int ko = ;
for(i = ;i < e; i++)
{
p[hi[i]] = ++ko;
}
mm = ko+;
build(,mm,,);
update(,,,,mm,);
for(i = ; i < n ;i++)
{
if(h[i]<=hh)
{
update(,p[h[i]],i,,mm,);
continue;
}
if(h[i]>=h[i-]&&h[i]>=h[i+])
{
f[i] = ;
int k1 = query(,,p[h[i]-hh],,mm,);
int k2 = query(,p[h[i]]+,mm,,mm,);
if(k2)
{
if(!k1||k2>k1)
f[i] = ;
}
}
update(,p[h[i]],i,,mm,);
}
build(,mm,,);
update(,,n,,mm,);
for(i = n-; i >= ; i--)
{
if(f[i])
{
int k1 = query(,,p[h[i]-hh],,mm,);
int k2 = query(,p[h[i]]+,mm,,mm,);
if(k2!=n+)
{
if(k1==n+||k2<k1)
f[i] = ;
}
}
update(,p[h[i]],i,,mm,);
}
int g = ;
for(i = ; i <= n; i++)
if(f[i])
o[++g] = i;
for(i = ; i < g; i++)
printf("%d ",o[i]);
printf("%d\n",o[i]);
}
return ;
}
/*
26
0 50000 150000 200000 150000
200000 300000 100000 50000 150000 330000 350000
250000 350000 200000 220000 300000 50000 100000
250000 100000 150000 500000 300000 250000 0
*/

UVA6531Go up the ultras的更多相关文章

  1. UVALive 6531 Go up the ultras 单调栈+RMQ

    题目链接:点击打开链接 题意: 给定n座山 以下n个数字表示n座山的高度 若这座山u合法,则要满足: 1.若u的左边存在比u高的山,设v是u左边距离u近期的且严格比u高的山,在[v,u]之间至少有一座 ...

  2. The 2013 South America/Brazil Regional Contest 题解

    A: UVALive 6525 cid=61196#problem/A" style="color:blue; text-decoration:none">Atta ...

  3. 2008 SCI 影响因子(Impact Factor)

    2008 SCI 影响因子(Impact Factor) Excel download 期刊名缩写 影响因子 ISSN号 CA-CANCER J CLIN 74.575 0007-9235 NEW E ...

  4. Image Processing and Analysis_8_Edge Detection:Edge and line oriented contour detection State of the art ——2011

    此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...

随机推荐

  1. field 属性操作

    首先必须明一点 Field类主要是用来辅助获取和操作类的属性的! 1.怎么通过反射获取类的属性 先来看JDK提供的方法有如下几种: a)Class.getDeclaredField(String na ...

  2. spring的依赖注入(DI)、控制反转(IOC)和面向切面(AOP)

    在spring的配置文件增加 <context:component-scan base-package="com.jmu.ccjoin.service"/> <c ...

  3. GNU Makeflie

    简介 Gnu Make主要用于构建和管理程序包.Makefile文件描述了整个工程的编译.连接等规则. 其中包括: 工程中的哪些源文件需要编译以及如何编译: 需要创建那些库文件以及如何创建这些库文件: ...

  4. Servlet session的理解

    servlet参见http://blog.csdn.net/bryanliu1982/article/details/5214899 session参见http://lavasoft.blog.51c ...

  5. YTU 2443: C++习题 复数类--重载运算符3+

    2443: C++习题 复数类--重载运算符3+ 时间限制: 1 Sec  内存限制: 128 MB 提交: 1368  解决: 733 题目描述 请编写程序,处理一个复数与一个double数相加的运 ...

  6. code::Blocks 汉化经验

    首先,在网上下载一个code::Block的汉化包 code::Block汉化包下载地址,复制到地址栏即可.  http://files.cnblogs.com/files/QW-lzm/codebl ...

  7. html5--6-19 CSS3中的文字与字体

    html5--6-19 CSS3中的文字与字体 学习要点 掌握文字与字体的设置 颜色值查询方法: 百度查询,很多网站有提供 下载相关手册等需要时查表 运用绘图工具中的拾色器 CSS中常用的字体属性设置 ...

  8. 接口_简单get接口_第一个接口

    import flask,json # print(__name__) ##__name__代表当前这个python文件 server = flask.Flask(__name__) #把咱们当前的这 ...

  9. python-----实现print不换行

    python中print输出是默认换行的,那如何我们不想换行,且需要用多个print函数输出时,就需要改变print默认换行的属性: 例: print('Hello') print('!') 输出结果 ...

  10. HTML <legend> 标签

    转自:https://www.w3cschool.cn/htmltags/tag-legend.html <!DOCTYPE HTML> <html> <body> ...