【GDKOI2014】JZOJ2020年8月13日提高組T4 記憶體分配
阿新 • • 發佈:2020-08-13
【GDKOI2014】JZOJ2020年8月13日提高組T4 記憶體分配
題目
Description
Input
Output
輸出m行,每行一個整數,代表輸入中每次程式變化後系統所需要的空閒記憶體單位數。
Sample Input
2 3
1 4
1 4
2 2 1
2 1 1
1 1 1
Sample Output
2
3
1
Data Constraint
對於30%的資料,有1<=n,m<=1000
對於100%的資料,有1<=n,m<=100000
Hint
題解
題意
有\(n\)個點
每個點有兩個值\(a\),\(b\)
當節點\(i\)加上\(b_i\)時它就會消失,貢獻\(a_i+b_i\)
每秒都會有個點的\(a_i\)和\(b_i\)改變
問最小初始費用
分析
發現有修改
易想到線段樹
設\(sum[l][r]\)表示\(\sum_{i=l}^{r}a[i]\)
\(ans[l][r]\)表示\(l\)~\(r\)的最小答案
那麼可以用線段樹維護
順便把\(ans\)和\(sum\)改為一維
動態開點
Code
#include<bits/stdc++.h> #define inf 2147483647 #define rg register using namespace std; struct node { long long size,rs,ls,val; }tree[4000005]; long long n,m,j,tot,a[1000005],b[1000005],ans[4000005]; void ins(long long now,long long l,long long r,long long p,long long q) { if (l==r) { tree[now].val+=p; tree[now].size++; ans[now]=q; return; } long long mid=(l+r)>>1; if (q<=mid) { if (tree[now].ls==0) tree[now].ls=++tot; ins(tree[now].ls,l,mid,p,q); } else { if (tree[now].rs==0) tree[now].rs=++tot; ins(tree[now].rs,mid+1,r,p,q); } tree[now].val=tree[tree[now].ls].val+tree[tree[now].rs].val; ans[now]=max(ans[tree[now].ls],ans[tree[now].rs]-tree[tree[now].ls].val); } void del(long long now,long long l,long long r,long long p,long long q) { if (l==r) { tree[now].val-=p; tree[now].size--; if (tree[now].size==0) ans[now]=0; return; } long long mid=(l+r)>>1; if (q<=mid) { if (tree[now].ls==0) tree[now].ls=++tot; del(tree[now].ls,l,mid,p,q); } else { if (tree[now].rs==0) tree[now].rs=++tot; del(tree[now].rs,mid+1,r,p,q); } tree[now].val=tree[tree[now].ls].val+tree[tree[now].rs].val; ans[now]=max(ans[tree[now].ls],ans[tree[now].rs]-tree[tree[now].ls].val); } int main() { freopen("test.in","r",stdin); freopen("test.out","w",stdout); scanf("%lld%lld",&n,&m); tot=1; for (rg long long i=1;i<=n;++i) { scanf("%lld%lld",&a[i],&b[i]); ins(1,0,inf,a[i],b[i]); } for (rg long long i=1;i<=m;i++) { scanf("%lld",&j); del(1,0,inf,a[j],b[j]); scanf("%lld%lld",&a[j],&b[j]); ins(1,0,inf,a[j],b[j]); printf("%lld\n",ans[1]); } return 0; }