答案具有连续性,每次的操作可能导致三个结果,+1,不变,-1
我们考虑操作,如果之前存在,那么之前变少的数量要+1,那么就要分是否答案+1
之后,我们考虑现在的贡献,也分两种情况考虑答案是否-1
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<ll,ll> pll; const int N=2e6+10; const int inf=0x3f3f3f3f; const int mod=1e9+7; int a[N]; map<pll,int> m1; int main(){ ios::sync_with_stdio(false); int n; cin>>n; ll ans=0; int i; for(i=1;i<=n;i++){ cin>>a[i]; ans+=a[i]; } int m; cin>>m; m1.clear(); while(m--){ int x,y,c; cin>>x>>y>>c; int tmp=m1[{x,y}]; if(tmp){ a[tmp]++; if(a[tmp]>0) ans++; } m1[{x,y}]=c; if(a[c]>0) ans--; a[c]--; cout<<ans<<endl; } return 0; }