求dalao看看为什么WA

@潜翎 2019-05-15 22:52 回复

对着题解把打的不一样的地方都改了改,可它还是30pts……

以及感觉错的地方都很小,就是一个小误差这种感觉……

de了一天bug,求求求助QWQ

#include <math.h>
#include <stdio.h>
#include <algorithm>
#define N 500010
using namespace std;
int n,m,num=0,rnum=0,qnum=0,base;
int a[N],p[N],ans[N];
struct replace
{
    int pla,pre,suc;
}r[N];
struct query
{
    int l,r,t,pos;
}q[N];
int read()
{
    int x=0,w=1;
    char ch;
    ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return x*w;
}
bool cmp(const query &x,const query &y)
{
    if(x.l/base!=y.l/base) return x.l/base<y.l/base;
    if(x.r/base!=y.r/base) return x.r/base<y.r/base;
    return x.t<y.t;
}
int main()
{
    char op[5];
    int l1=1,r1=0,ti=0;
    n=read();m=read();
    for(int i=1;i<=n;i++) a[i]=read();
    for(int i=1;i<=m;i++)
    {
        scanf("%s",op);
        if(op[0]=='R')
        {
            r[++rnum].pla=read();
            r[rnum].suc=read();
            r[rnum].pre=a[r[rnum].pla];
            a[r[rnum].pla]=r[rnum].suc;
        }
        else
        {
            q[++qnum].l=read();
            q[qnum].r=read();
            q[qnum].pos=qnum;
            q[qnum].t=rnum;//记录修改地点QWQ 
        }
    }
    base=ceil(exp((log(n)+log(rnum))/3));//ceil:大于或等于该式最小整数
    for(int i=rnum;i>=1;i--) a[r[i].pla]=r[i].pre;
    sort(q+1,q+qnum+1,cmp);
    for(int i=1;i<=m;i++)
    {
        while(q[i].l<l1) num+=!p[a[--l1]]++;//dalao写法。。。
        while(q[i].l>l1) num-=!--p[a[l1++]];
        while(q[i].r>r1) num+=!p[a[++r1]]++;
        while(q[i].r<r1) num-=!--p[a[r1--]];
        while(q[i].t<ti)
        {
            int pos=r[ti].pla;
            if(l1<=pos&&pos<=r1) num-=!--p[a[pos]];
            a[pos]=r[ti--].pre;
            if(l1<=pos&&pos<=r1) num+=!p[a[pos]]++;
        };
        while(q[i].t>ti)
        {
            int pos=r[++ti].pla;
            if(l1<=pos&&pos<=r1) num-=!--p[a[pos]];
            a[pos]=r[ti].suc;
            if(l1<=pos&&pos<=r1) num+=!p[a[pos]]++;
        };
        ans[q[i].pos]=num;
    }
    for(int i=1;i<=qnum;i++) printf("%d\n",ans[i]);
    return 0;
}