题解:dp转移只考虑最后一个以多少个相同的数结尾就好了。如何保证以最少的数结尾需要贪心
#include"bits/stdc++.h"
using namespace std;
typedef long long ll;
const int MX = 1e6+7;
const int INF = 0x3f3f3f3f;
int t[MX],f[MX];
int n,k;
int get_val(int lastt, int lastf, int t, int f)
{
if(lastt == 0){
if(t > f){
if(t/(f+1) + (t%(f+1) > 0) > k) return INF;
if(k*f + 1 >= t) return 1;
return t - k*f;
}
else{
int tf = f+lastf;
if(tf/t + (tf%t > 0) > k) return INF;
return 1;
}
}
else {
if(t > f){
int tt = t+lastt;
if(tt/(f+1) + (tt%(f+1) > 0) > k) return INF;
if(k*f + 1 >= tt) return 1;
return tt - k*f;
}
else{
if(f/t + (f%t) > k) return INF;
return 1;
}
}
}
bool work()
{
int lastt = 0, lastf = 0;
lastt = get_val(0,0,t[1],f[1]);
lastf = get_val(0,0,f[1],t[1]);
int nowt = INF, nowf = INF;
if(lastt == INF && lastf == INF) return 0;
for(int i = 2; i<= n; i++){
if(lastt < INF) {
nowt = min(nowt,get_val(lastt,0,t[i],f[i]));
nowf = min(nowf,get_val(0,lastt,f[i],t[i]));
}
if(lastf < INF){
nowt = min(nowt,get_val(0,lastf,t[i],f[i]));
nowf = min(nowf,get_val(lastf,0,f[i],t[i]));
}
lastt = nowt; lastf = nowf;
nowt = nowf = INF;
if(lastt == INF && lastf == INF) return 0;
}
return 1;
}
int main(){
#ifdef LOCAL
freopen("input.txt","r",stdin);
#endif // LOCAL
scanf("%d%d",&n,&k);
for(int i = 1; i <= n; i++)
scanf("%d",&t[i]);
for(int i = 1; i <= n; i++)
scanf("%d",&f[i]);
if(work()) printf("YES\n");
else printf("NO\n");
}