您的位置:首页 > 其它

[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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: