[CodeForces 279C] Ladder (DP)
2016-04-24 16:18
330 查看
CodeForces - 279C
给定一个序列,问序列中一段区间是否是山峰形状的山峰形状即为中间有个最大值,然后向两边非严格递减
第一反应是想着处理出中间峰向两边延伸的最远距离
然后用三分搜索找峰
但是三分搜索在整数区间上存在诸多坑点
而且在区间非单峰的时候存在一些不确定因素
所以没写好,挂了很多发
后来看了题解,发现其实只要处理出两边山脚能向内延伸的最远距离
然后加起来看是否大于等于区间长度
这样就避免了找峰的问题
逆向思维的应用!
#include <cstdio> #include <iostream> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> #include <map> #include <set> #include <queue> using namespace std; typedef pair<int,int> Pii; typedef long long LL; typedef unsigned long long ULL; typedef double DBL; typedef long double LDBL; #define MST(a,b) memset(a,b,sizeof(a)) #define CLR(a) MST(a,0) #define Pow2(a) (a*a) const int maxn=1e5+10; int N,M; int inpt[maxn]; int ans[maxn][2]; int main() { scanf("%d%d", &N, &M); CLR(inpt); for(int i=1; i<=N; i++) scanf("%d", &inpt[i]); for(int i=1; i<=N; i++) { if(inpt[i]<=inpt[i-1]) ans[i][0]=ans[i-1][0]+1; else ans[i][0]=1; } for(int i=N; i>=1; i--) { if(inpt[i]<=inpt[i+1]) ans[i][1]=ans[i+1][1]+1; else ans[i][1]=1; } int l,r; while(~scanf("%d%d", &l, &r)) { if(ans[l][1]+ans[r][0]>=(r-l+1)) puts("Yes"); else puts("No"); } return 0; }
相关文章推荐
- AngularJS》5个实例详解Directive(指令)机制
- PCA人脸识别学习及C语言实现
- 手把手教你用Python爬虫煎蛋妹纸海量图片
- 我在一个结构体里定义超过两个字符数组的成员输出结果会出错
- Java集合框架的总结
- 【FTP】在自己的电脑上建立FTP服务器
- CAShapeLayer的绘制
- IOS设计模式--策略模式
- java泛型类和泛型函数
- android 中通过代码创建控件
- C++中的RTTI机制解析
- Swift中的?与!(Optional Type)
- shell和python实现时间转化
- 求改错,题目如下:求n个整数中第二小的数。 相同的整数看成一个数。比如,有5个数分别是1,1,3,4,5,那么第二小的数就是3。
- exe4教程
- vtk实战(一)——HelloVtk
- Eclipse快捷键大全
- equals和hashCode
- 数据结构实验二 栈、队列
- arc中dealloc方法不调用