莫队 3AC+7WA求调
查看原帖
莫队 3AC+7WA求调
520748
_Ch1F4N_楼主2022/10/6 15:22

A了后三个点,求各位dalao帮忙调调。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int sum[1000001];
struct query{
    int l,r;
    int val;
    int id;
    int t;
}q[1000001];
int t=1;
int change_i[1000001];
int change_old[1000001];
int change_new[1000001];
int ans=0;
int sq;
bool cmp(query a, query b)
{
   if(a.l/sq!=b.l/sq)
   return a.l>b.l;
   if(a.r/sq!=b.r/sq)
   return a.r<b.r;
   return a.t<b.t;
}
bool cmp1(query a,query b)
{
	return a.id<b.id;
}
int Q;
int n;
int cnt=0;
int a[1000001];
signed main()
{
    scanf("%lld",&n);
    cin>>Q;
    for(int i=1;i<=n;i++)
    scanf("%lld",&a[i]);
		sq=pow(n,2*1.0/3);
    for(int i=1;i<=Q;i++)
    {
        char op;
        cin>>op;
        if(op=='Q')
        {
        scanf("%lld",&q[++cnt].l);
        scanf("%lld",&q[cnt].r);
        q[cnt].id=cnt;
        q[cnt].t=t;
        }
        if(op=='R')
        {
            int x,y;
            cin>>x>>y;
            change_i[t]=x;
            change_old[t]=a[x];
            change_new[t]=y;
            t++;
        }
    }
    sort(q+1,q+cnt+1,cmp);
    int L=1,R=0,T=1;
    for(int i=1;i<=cnt;i++)
    {
        while(T>q[i].t)
        {
            T--;
            if(L<=change_i[T]&&R>=change_i[T]);
            {
                sum[change_new[T]]--;
                sum[change_old[T]]++;
                if(sum[change_new[T]]==0)
                ans--;
                if(sum[change_old[T]]==1)
                ans++;
            }
            a[change_i[T]]=change_old[T];
        }
        while(T<q[i].t)
        {
            if(L<=change_i[T]&&R>=change_i[T]);
            {
                sum[change_new[T]]++;
                sum[change_old[T]]--;
                if(sum[change_old[T]]==0)
                ans--;
                if(sum[change_new[T]]==1)
                ans++;
            }
            a[change_i[T]]=change_new[T];
            T++;
        }
        while(q[i].l<L) 
        {
            L--;
            sum[a[L]]++;
            if(sum[a[L]]==1)
            ans++;
        }
		while(q[i].l>L) 
        {
            sum[a[L]]--;
            if(sum[a[L]]==0)
            ans--;
            L++;
        }
		while(q[i].r<R) 
        {
            sum[a[R]]--;
            if(sum[a[R]]==0)
            ans--;
            R--;
        }
		while(q[i].r>R) 
        {
            R++;
            sum[a[R]]++;
            if(sum[a[R]]==1)
            ans++;
        }
	 	q[i].val=ans;
    }
    sort(q+1,q+cnt+1,cmp1);
	for(int i=1;i<=cnt;i++)
	printf("%lld \n",q[i].val);
    return 0;
}

2022/10/6 15:22
加载中...