牛客-服务器需求【线段树】

mac2025-12-22  10

正题

题目链接:https://ac.nowcoder.com/acm/contest/1101/A


题目大意

n n n天第 i i i天需要 a i a_i ai台机器,每台机器可以工作 m m m天。 q q q次修改,每次修改一个 a i a_i ai,求每次修改后至少需要雇佣多少台机器。


解题思路

很容易想到答案就是 m a x { a i , ⌈ s u m m ⌉ } max\{a_i,\lceil \frac{sum}{m}\rceil\} max{ai,msum}

线段树维护即可。


c o d e code code

#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))); } }
最新回复(0)