莫队爆0求助
查看原帖
莫队爆0求助
422110
HgSO4qwq楼主2022/8/19 11:49

RT, 离散化懒的写了

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

struct query 
{
    long long l,r,k;
}q[500010];

int ans[500010];

short res[50000010];
long long a[500010],tot,l=1,r=0,blk[500010];

void ADD(int pos)
{
    tot++;
    res[a[pos]]++;
    if(res[a[pos]]==2) res[0]++;
	else if(res[a[pos]]>2) res[0]--;
}

void SUB(int pos)
{
    tot--;
    res[a[pos]]--;
    if(res[a[pos]]==1) res[0]--;
	else if(res[a[pos]]==2) res[0]++;
}

int main()
{
    int n,m,ax,by,k;
    cin>>n>>m;
	res[0]=0;
	memset(res,0,sizeof(res));
    int blkl=sqrt(n);
    // cout<<blkl<<endl;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) {blk[i]=((i-1)/blkl)+1;/*cout<<blk[i]<<' ';*/}
    // cout<<endl;  
    for(int i=1;i<=m;i++)
    {
        cin>>q[i].l>>q[i].r;
        q[i].k=i;
    }
    sort(q+1,q+m+1,[](query x,query y){return (blk[x.l]==blk[y.l])?(x.r<y.r):(blk[x.l]<blk[y.l]);});
    for(int i=1;i<=m;i++)
    { 
        // cout<<q[i].l<<' '<<q[i].r<<endl;
        // if(q[i].l==q[i].r) {ans[q[i].k].a=0;ans[q[i].k].b=1;continue;}
        while(q[i].l<l) ADD(--l);
        while(q[i].r>r) ADD(++r);
        while(q[i].l>l) SUB(l++);
        while(q[i].r<r) SUB(r--);
        ans[q[i].k]=res[0];
    }
    for(int i=1;i<=m;i++) cout<<ans[i]<<endl;
    return 0;
} 
2022/8/19 11:49
加载中...