贪心。
要凑到最大的数量,让可以更改的位置的数值更改成为上一个离自己最近位置并且有数值的数-x。注意如果减到小于值域下限,我们可以直接更改为值域上限。这样做的目的是方便让后面的可更改位置产生贡献。
凑最小的答案,就一直让可更改位置的数值更改为上一个值-x+1即可。
#include<bits/stdc++.h>
#define endl "\n"
#define int long long
using namespace std;
/*inline __int128 read(){
__int128 x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){
if(ch == '-')
f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
inline void print(__int128 x){
if(x < 0){
putchar('-');
x = -x;
}
if(x > 9)
print(x / 10);
putchar(x % 10 + '0');
}*/
void slove() {
int n, x;
std::cin >> n >> x;
std::vector<int> a(n + 1), b(n + 1), c(n + 1);
for (int i = 1; i <= n; i++) std::cin >> a[i], b[i] = c[i] = a[i];
if (b[1] == -999) b[1] = 50;
int lst = b[1];
for (int i = 2; i <= n; i++) {
if (b[i] == -999) {
if(lst-x<-50)
{
b[i]=50;
}
else
{
b[i]=lst-x;
}
}
lst = b[i];
}
int ans1 = 0, ans2 = 0;
for (int i = 2; i <= n; i++) {
if (b[i - 1] - b[i] >= x) ans1++;
}
// for(int i=1;i<=n;i++) std::cout<<b[i]<<" ";
// std::cout<<endl;
if (c[1] == -999) {
for (int i = 2; i <= n; i++) if (c[i] != -999) {
lst = c[i];
c[1] = c[i];
break;
}
}
if (c[1] == -999) {
ans2 = 0;
std::cout << ans1 << " " << ans2 << endl;
return ;
}
lst = c[1];
for (int i = 2; i <= n; i++) {
if (c[i] == -999) {
c[i] = std::max(-50 * 1LL, lst - x + 1);
}
lst = c[i];
}
for (int i = 2; i <= n; i++) {
//std::cout<<c[i]<<" ";
if (c[i - 1] - c[i] >= x) ans2++;
}
//std::cout<<endl;
std::cout << ans1 << " " << ans2 << endl;
}
signed main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int T = 1;
//std::cin>>T;
while (T--) {
slove();
}
return 0;
}



京公网安备 11010502036488号