AT_abc347_e的题解

(一)

可能因为我太菜了,感觉 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;
}
posted @ 2024-03-31 11:11  Jerry_heng  阅读(25)  评论(0)    收藏  举报