0%

START199——Perfect Ranges

思路讲解

只要想到dp,那么写起来还是挺简单的。

这个dp的定义还是挺简单的,我的dp[i]的定义是以 i 的 mx 为结尾,所能得到的区间长度(计数),dp2[i] 的定义是以 i 的 mn 为结尾,所能得到的区间长度(计数)。

然后下划线部分注意初始化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
inline void __(){
cin>>N;
vll A(N+5),B(N+5);
FOR(i,1,N){
cin>>A[i];
}
FOR(i,1,N){
cin>>B[i];
}
vll dp(N+5),dp2(N+5);
FOR(i,1,N){
ll mx=max(A[i],B[i]),mn=min(A[i],B[i]);
dp[i]=1;
if(mx>max(A[i-1],B[i-1])){
dp[i]=dp[i-1]+1;
}
if(mx>min(A[i-1],B[i-1])){
dp[i]=max(dp[i],dp2[i-1]+1);
}
dp2[i]=1;
if(mn>max(A[i-1],B[i-1])){
dp2[i]=dp[i-1]+1;
}
if(mn>min(A[i-1],B[i-1])){
dp2[i]=max(dp2[i],dp2[i-1]+1);
}
}
ll ans=0;
#ifdef LOCAL
_print(dp);
_print(dp2);
cend;
#endif
FOR(i,1,N){
ans+=max(dp2[i],dp[i]);
}
cout<<ans<<"\n";
}

AC代码

https://www.codechef.com/viewsolution/1184464744

心路历程(WA,TLE,MLE……)