UVA6531Go up the ultras
这题意甚是难懂。。当且峰值为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的更多相关文章
- UVALive 6531 Go up the ultras 单调栈+RMQ
题目链接:点击打开链接 题意: 给定n座山 以下n个数字表示n座山的高度 若这座山u合法,则要满足: 1.若u的左边存在比u高的山,设v是u左边距离u近期的且严格比u高的山,在[v,u]之间至少有一座 ...
- The 2013 South America/Brazil Regional Contest 题解
A: UVALive 6525 cid=61196#problem/A" style="color:blue; text-decoration:none">Atta ...
- 2008 SCI 影响因子(Impact Factor)
2008 SCI 影响因子(Impact Factor) Excel download 期刊名缩写 影响因子 ISSN号 CA-CANCER J CLIN 74.575 0007-9235 NEW E ...
- Image Processing and Analysis_8_Edge Detection:Edge and line oriented contour detection State of the art ——2011
此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...
随机推荐
- 该项目不在c:\ 请确认该项目的位置
该项目不在c:\ 请确认该项目的位置 - CSDN博客https://blog.csdn.net/feilong1lantern/article/details/50388414 在删除不掉的文件夹目 ...
- top swap
显示交换空间(虚拟内存)的使用情况
- 用Java编写的http下载工具类,包含下载进度回调
HttpDownloader.java package com.buyishi; import java.io.FileOutputStream; import java.io.IOException ...
- powerdesigner 导入mysql数据库(步骤及注意点)
参考博客 PowerDesigner中导入MYSQL数据库结构的步骤 mysql ODBC 在64位下提示找不到odbc驱动问题 PowerDesigner逆向工程导入MYSQL数据库总结
- JAVA变量存储
1.java变量存储域 java变量的存储区域主要放在以下几个地方: (1)寄存器:可以说是最快的存储区,在C/C++中可以声明寄存器变量,但是在java中不能声明寄存器变量,只是编译器在编译时确定. ...
- bzoj4664: Count
是bzoj4498: 魔法的碰撞的哥哥题,我只写了一种 不一样的地方在于贡献有负数,第三维要保存的不能仅仅是0~L,这样空间会炸裂 考虑如何把贡献变成正的 假如要求最优解,那么一定是按顺序排,混乱度为 ...
- 自定义表单SQL命令行批量删除垃圾留言
1.每天被恶意留言困扰,花费大量的时间去清理却效果不理想,对于没有能力做二次开发并且靠纯手工删除留言的菜鸟来讲是一个大麻烦. 2.大家都知道织梦的留言内容是存在数据库里的,而数据库的内容是可以批量删除 ...
- Pycharm中如何安装python库
1首先打开pycharm工具,选择File中的Setting选项,如下图所示 2在打开的setting界面中我们点击python的解释器,你会看到很多导入的第三方库,如下图所示,点击最右边的加号 3在 ...
- POJ - 1236 Network of Schools(有向图的强连通分量)
d.各学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输, 问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件. 问题2:至少需要添加几条传输线 ...
- BZOJ_2017_[Usaco2009 Nov]硬币游戏_博弈论+DP
BZOJ_2017_[Usaco2009 Nov]硬币游戏_博弈论+DP Description 农夫约翰的奶牛喜欢玩硬币游戏,因此他发明了一种称为“Xoinc”的两人硬币游戏. 初始时,一个有N(5 ...