#include <bits/stdc++.h>
using namespace std;
pair<int,int> tree[1<<11];
void update(int v,int val,int indx){
tree[v]={val,indx};
while (v/2>0){
v/=2;
tree[v]=max(tree[v*2],tree[v*2+1]);
}
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int N,K;
cin>>N>>K;
int tab[N];
for (int i=0;i<N;i++){
cin>>tab[i];
update(i+(1<<10),tab[i],i);
}
long long ans=0;
for (int i=0;i<N;i++){
pair<int,int> akt=tree[1];
int wartosc=akt.first;
int index=akt.second;
// cout<<wartosc<<"\n";
if (index+1<N and tab[index+1]<tab[index]){
if (abs(tab[index]-tab[index+1])>K){
ans+=tab[index]-K-tab[index+1];
update(index+1+(1<<10),tab[index]-K,index+1);
tab[index+1]=tab[index]-K;
}
}
if (index-1>=0 and tab[index-1]<tab[index]){
if (abs(tab[index]-tab[index-1])>K){
ans+=tab[index]-K-tab[index-1];
update(index-1+(1<<10),tab[index]-K,index-1);
tab[index-1]=tab[index]-K;
}
}
update(index+(1<<10),-1,-1);
}
cout<<ans<<"\n";
}
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 39 40 41 42 43 44 45 46 47 | #include <bits/stdc++.h> using namespace std; pair<int,int> tree[1<<11]; void update(int v,int val,int indx){ tree[v]={val,indx}; while (v/2>0){ v/=2; tree[v]=max(tree[v*2],tree[v*2+1]); } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int N,K; cin>>N>>K; int tab[N]; for (int i=0;i<N;i++){ cin>>tab[i]; update(i+(1<<10),tab[i],i); } long long ans=0; for (int i=0;i<N;i++){ pair<int,int> akt=tree[1]; int wartosc=akt.first; int index=akt.second; // cout<<wartosc<<"\n"; if (index+1<N and tab[index+1]<tab[index]){ if (abs(tab[index]-tab[index+1])>K){ ans+=tab[index]-K-tab[index+1]; update(index+1+(1<<10),tab[index]-K,index+1); tab[index+1]=tab[index]-K; } } if (index-1>=0 and tab[index-1]<tab[index]){ if (abs(tab[index]-tab[index-1])>K){ ans+=tab[index]-K-tab[index-1]; update(index-1+(1<<10),tab[index]-K,index-1); tab[index-1]=tab[index]-K; } } update(index+(1<<10),-1,-1); } cout<<ans<<"\n"; } |
English