USACO/DEC/BR1
P9974 [USACO23DEC] Candy Cane Feast B
分析
我们想一下每个牛只能吃到的糖果有多少呢?
牛高为 $ni [i] $ ,糖果被吃的高度为 $ mn $
那我们只需每次判断 $ni [i] $ 是否大于 $ mn $ ,牛低的话吃不到,牛高的话能吃的为 $ni [i] $ 以下到 $ mn $ 或者为糖果的高度到 $ mn $ ,那我们发现糖果减少的高度也是从下往上连续的一段位置
那减少的高度又是多少呢?
能吃到的时候就证明牛比 $ mn $ 高,$ mn $ 为牛高或者糖果最大高度
最后枚举即可

AC code
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
long long ni[200005],mi[200005];
for(int i=1;i<=n;i++)cin>>ni[i];//h
for(int i=1;i<=m;i++)cin>>mi[i];//l
for(int i=1;i<=m;i++){
int mn=0; //记录吃后的高度
for(int j=1;j<=n;j++){
if(ni[j]>mn){ //如果比当前吃的高度(悬空的)还高,可以吃
if(ni[j]>mi[i]){ //比当前糖还高,把糖全吃了
ni[j]+=mi[i]-mn;
break;
}
int f=ni[j];
ni[j]+=ni[j]-mn;
mn=f;
}
}
}
for(int i=1;i<=n;i++) cout<<ni[i]<<endl;
return 0;
}

浙公网安备 33010602011771号