AT_abc347_e的題解

Jerry_heng發表於2024-03-31

(一)

可能因為我太菜了,感覺 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;
}