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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| #include <bits/stdc++.h> using namespace std; typedef long long ll; #define endl '\n' #define Turnoff std::ios::sync_with_stdio(false) const ll Max=2e5+5; const double PI=acos(-1);
vector<ll>arr; int tp[Max],op[Max]; ll d[Max]; struct Node{ll sum,cnt;};
struct Tree{ Node tree[Max<<2]; void push_up(int now){ tree[now].sum=tree[now<<1].sum+tree[now<<1|1].sum; tree[now].cnt=tree[now<<1].cnt+tree[now<<1|1].cnt; } void updata(int pos,int val,int l,int r,int node){ if(l==r){ tree[node].cnt+=val; tree[node].sum+=val*arr[l]; return; } int mid=(l+r)>>1; if(pos<=mid)updata(pos,val,l,mid,node<<1); else updata(pos,val,mid+1,r,node<<1|1); push_up(node); } ll querySum(int k,int l,int r,int node){ if(k<=0)return 0; if(tree[node].cnt<=k)return tree[node].sum; if(l==r)return arr[l]; int mid=(l+r)>>1; ll ans=0; if(tree[node<<1|1].cnt>=k)ans=querySum(k,mid+1,r,node<<1|1); else { k-=tree[node<<1|1].cnt; ans=tree[node<<1|1].sum+querySum(k,l,mid,node<<1); } return ans; } int queryMin(int l,int r,int node){ if(l==r)return l; int mid=(l+r)>>1; if(tree[node<<1].cnt)return queryMin(l,mid,node<<1); else return queryMin(mid+1,r,node<<1|1); } }Allspell,Light; int main() { int n;cin>>n; for(int i=0;i<n;i++){ cin>>tp[i]>>d[i]; arr.push_back(abs(d[i])); op[i]=(d[i]>0); } sort(arr.begin(),arr.end()); arr.erase(unique(arr.begin(),arr.end()),arr.end()); int len=arr.size(),num=0; for(int i=0;i<n;i++)d[i]=lower_bound(arr.begin(),arr.end(),abs(d[i]))-arr.begin(); for(int i=0;i<n;i++){ if(op[i]){ if(tp[i]==0)Allspell.updata(d[i],1,0,len-1,1); else{ num++; Allspell.updata(d[i],1,0,len-1,1); Light.updata(d[i],1,0,len-1,1); } } else{ if(tp[i]==0)Allspell.updata(d[i],-1,0,len-1,1); else{ num--; Allspell.updata(d[i],-1,0,len-1,1); Light.updata(d[i],-1,0,len-1,1); } } ll ans=Allspell.tree[1].sum; if(num){ int minLight=Light.queryMin(0,len-1,1); Allspell.updata(minLight,-1,0,len-1,1); ans+=Allspell.querySum(num,0,len-1,1); Allspell.updata(minLight,1,0,len-1,1); } cout<<ans<<endl; } }
|