(一)
可能因為我太菜了,感覺 D>E。
用 \(vis_i\) 表示 \(i\) 是否出現,\(sum_i\) 表示當前集合大小。
用 vector 維護出現的區間的端點。
將 \(sum\) 陣列字首和即可。
(二)
AC 程式碼。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q,x,siz,sum[200010];
vector<int>v[200010];
bool vis[200010];
signed main(){
ios::sync_with_stdio(0);
cin>>n>>q;
for(int i=1;i<=q;i++){
cin>>x;
if(vis[x])vis[x]=0,siz--;
else vis[x]=1,siz++;
sum[i]=siz;
v[x].push_back(i);
}
for(int i=1;i<=q;i++)sum[i]+=sum[i-1];
for(int i=1;i<=n;i++){
int s=0;
for(int j=0;j<v[i].size();j++){
if(j%2==0){
if(j==v[i].size()-1)s+=sum[q]-sum[v[i][j]-1];
else s+=sum[v[i][j+1]-1]-sum[v[i][j]-1];
}
else continue;
}
cout<<s<<" ";
}
return 0;
}