正题
题目链接:https://ac.nowcoder.com/acm/contest/1101/A
题目大意
nnn天第iii天需要aia_iai台机器,每台机器可以工作mmm天。qqq次修改,每次修改一个aia_iai,求每次修改后至少需要雇佣多少台机器。
解题思路
很容易想到答案就是max{ai,⌈summ⌉}max\{a_i,\lceil \frac{sum}{m}\rceil\}max{ai,⌈msum⌉}
线段树维护即可。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
const ll N=4e5+10;
struct tree_node{ll l,r,w;
};
ll n,m,q,a[N],ans;
struct node{tree_node t[N*4];void Build(ll x,ll l,ll r){t[x].l=l;t[x].r=r;if(l==r){t[x].w=a[l];return;}ll mid=(l+r)/2;Build(x*2,l,mid);Build(x*2+1,mid+1,r);t[x].w=max(t[x*2].w,t[x*2+1].w);}void Change(ll x,ll pos,ll num){if(t[x].l==t[x].r){t[x].w=num;return;}ll mid=(t[x].l+t[x].r)/2;if(pos<=mid) Change(x*2,pos,num);else Change(x*2+1,pos,num);t[x].w=max(t[x*2].w,t[x*2+1].w);}
}Tree;
int main()
{scanf("%lld%lld%lld",&n,&m,&q);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]),ans+=a[i];Tree.Build(1,1,n);printf("%lld\n",max(Tree.t[1].w,ans/m+((ans%m)?1ll:0ll)));while(q--){ll x,num;scanf("%lld%lld",&x,&num);ans+=num-a[x];a[x]=num;Tree.Change(1,x,num);printf("%lld\n",max(Tree.t[1].w,ans/m+((ans%m)?1ll:0ll)));}
}