ABC347E 题解
题意
初始有一个长度为
思路
如果暴力修改,复杂度为
因此考虑分别处理
那么记录下所有操作时的
这样时间复杂度优化至
代码
#include<iostream>
#include<vector>
#define int long long
const int N=2e5+10;
using namespace std;
int read()
{
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9') { if(ch=='-') w=-1; ch=getchar();}
while(ch>='0'&&ch<='9') { s=s*10+ch-'0'; ch=getchar();}
return s*w;
}
int n,Q,cnt,s[N];//cnt为目前S中元素个数,s为前缀和数组
bool f[N];//每个下标是否在S中
vector <int> pos[N];//每个下标出现的位置
signed main()
{
n=read(),Q=read();
for(int i=1;i<=Q;i++)
{
int t=read();
if(!f[t]) cnt++,f[t]=1;
else cnt--,f[t]=0;
s[i]=s[i-1]+cnt;
pos[t].push_back(i);
}
for(int i=1;i<=n;i++)
{
int t=0;//分别处理每一位
if(pos[i].size()%2) pos[i].push_back(Q+1);//如果出现奇数次,则操作结束时其还在序列中,需要特判
for(int j=0;j<pos[i].size();j+=2)
{
int l=pos[i][j],r=pos[i][j+1]-1;
t+=s[r]-s[l-1];
}//每两次之间都能取得贡献
cout<<t<<' ';
}
return 0;
}