Codeforces 279C - Ladder - [簡單DP]
阿新 • • 發佈:2019-03-07
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]