1. 程式人生 > >Codeforces 279C - Ladder - [簡單DP]

Codeforces 279C - Ladder - [簡單DP]

lse i++ set its lan problems http namespace with

題目鏈接:http://codeforces.com/problemset/problem/279/C

題意:

給出 $n$ 個整數 $a[1 \sim n]$,$m$ 個查詢,對於一個查詢 $[l_i,r_i]$,對應於子段 $a[l_i], a[l_i+1], \cdots, a[r_i]$,需要你判斷這個子段是不是單峰的。

此處的單峰,指的是,開始時是一段單調不減的,然後以一段單調不增結束;同時這兩段的長度為零也是可以的。

題解:

令 $f[i]$ 表示第 $i$ 個整數往前走,保持單調不減的狀態,最遠能走多遠。

相應的 $g[i]$ 表示第 $i$ 個整數往後走,保持單調不減的狀態,最遠能走多遠。

對於所有的查詢,如果 $g[l_i] + f[r_i] \ge r-l+1$,就代表是單峰的。

AC代碼:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n,m,a[maxn];
int f[maxn],g[maxn];
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    cin>>n>>m;
    memset(a,0,sizeof
(a)); for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) { if(a[i-1]>=a[i]) f[i]=f[i-1]+1; else f[i]=1; } for(int i=n;i>=1;i--) { if(a[i]<=a[i+1]) g[i]=g[i+1]+1; else g[i]=1; } while(m--) {
int l,r; cin>>l>>r; cout<<((g[l]+f[r]>=r-l+1)?"Yes":"No")<<\n; } }

Codeforces 279C - Ladder - [簡單DP]