/* 给定数组a[],表示每种资源数目标量,一开始都是0 每次增,删,改一个三元组(s,t,u):如果资源s数量t,那么资源u+1,可链式增加 问每次修改后达到目标资源的最少用时 结论:直接开数组cnt[i]累计每种资源通过三元组增加的值,多出a[i]的部分去掉就是贡献 */ #include<bits/stdc++.h> using namespace std; #define N 200005 #define ll long long map<pair<int,int>,int>mp; ll n,q,a[N],cnt[N],sum; int main(){ cin>>n; for(int i=1;i<=n;i++)cin>>a[i],sum+=a[i]; cin>>q; while(q--){ int s,t,u; scanf("%d%d%d",&s,&t,&u); pair<int,int>p=make_pair(s,t); if(mp[p]!=0){ int last=mp[p]; if(cnt[last]<=a[last])sum++; cnt[last]--; } mp[p]=u; if(cnt[u]<a[u])sum--; cnt[u]++; cout<<sum<<‘\n‘; } }
原文:https://www.cnblogs.com/zsben991126/p/12293356.html