前言
传送门 :
题意
给你两个数组 b [ ] , a [ ] b[],a[] b[],a[]询问是否有
x
i
=
a
i
∣
∣
b
i
x_i=a_i||b_i
xi=ai∣∣bi
∣
x
i
−
x
i
−
1
<
=
k
∣
|x_i-x_{i-1}<=k|
∣xi−xi−1<=k∣
思路
状态表示 :
d
p
[
i
]
[
2
]
(
b
o
o
l
)
dp[i][2] ( bool)
dp[i][2](bool)
当前在
i
i
i节点
a
[
i
]
∣
∣
b
[
i
]
a[i]||b[i]
a[i]∣∣b[i]是否可 用
- d p [ i ] [ 0 ] = 0 dp[i][0]=0 dp[i][0]=0 表示第 a [ i ] a[i] a[i]不可用
- d p [ i ] [ 1 ] = 0 dp[i][1]=0 dp[i][1]=0 表示第 b [ i ] b[i] b[i]不可用
状态计算 :
- d p [ i ] [ 0 ] dp[i][0] dp[i][0]可以从 d p [ i − 1 ] [ 0 ] = d p [ i − 1 ] [ 1 ] = 1 dp[i-1][0]=dp[i-1][1]=1 dp[i−1][0]=dp[i−1][1]=1转移
- d p [ i ] [ 1 ] dp[i][1] dp[i][1]可以从 d p [ i − 1 ] [ 0 ] = d p [ i − 1 ] [ 1 ] = 1 dp[i-1][0]=dp[i-1][1]=1 dp[i−1][0]=dp[i−1][1]=1转移
初始化状态 :
d
p
[
1
]
[
1
]
=
d
p
[
0
]
[
1
]
=
1
dp[1][1] =dp[0][1]=1
dp[1][1]=dp[0][1]=1
才少打一场 a b c abc abc,这个 C C C就不是一眼题了Orz
Mycode
const int N = 2e5+10;
int n,k;
int a[N],b[N];
int dp[N][2];
void solve()
{
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
dp[1][0] = dp[1][1] = 1;
for(int i=2;i<=n;i++){
if(dp[i-1][0] && abs(a[i] - a[i-1]) <=k ) dp[i][0] = 1;
else if(dp[i-1][1] && abs(a[i] - b[i-1]) <=k ) dp[i][0] = 1;
if(dp[i-1][0] && abs(b[i] - a[i-1]) <=k) dp[i][1] = 1;
else if(dp[i-1][1] && abs(b[i] - b[i-1])<=k) dp[i][1] = 1;
}
if(dp[n][0] || dp[n][1]){
cout<<"Yes"<<endl;
return;
}
cout<<"No"<<endl;
}