WA最后三个点的家人们 你们的莫队没错 数据错了!
查看原帖
WA最后三个点的家人们 你们的莫队没错 数据错了!
161697
ღꦿ࿐楼主2022/1/12 08:34

最后三个点行首有空格!!

证据:

这是一份完全正确的待修莫队

但是它只有60分

评测记录

#include<bits/stdc++.h>
using namespace std;
const int N= 133338 ;

#define ll long long
#define lll __int128
#define lb long double
#define D double

#define psb push_back
#define mkp make_pair

#define min3(xxx,yyy,zzz) min(min(xxx,yyy),zzz)
#define max3(xxx,yyy,zzz) max(max(xxx,yyy),zzz)

#define gi greater<int>
#define gl greater<ll>
#define vl vector<ll>
#define vi vector<int>
#define pii pair<int,int>
#define pll pair<ll,ll>
#define fi first
#define se second

#define rep(variable,leftrange,rightrange) for(int variable=leftrange;variable<=rightrange;++variable)
#define Rep(variable,leftrange,rightrange) for(int variable=leftrange;variable>=rightrange;--variable)

#define Seed Srand(time(0))
#define rd(p) (rand()%p)

#define ss stable_sort
#define nxp next_permutation
#define rds random_shuffle

#define mem(x,y) memset(x,y,sizeof x) 
#define Finda(a,siz,b) (lower_bound(a+1,a+siz+1,b)-a)
#define Findv(a,b) (lower_bound(a.begin(),a.end(),b)-a.begin())
#define qc(v) v.erase(unique(v.begin(),v.end()),v.end())

#define sq(x) ((x)*(x))
#define lowbit(x) (x& -x)

#define upmin(x,y) x=min(x,y)
#define upmax(x,y) x=max(x,y)

template <typename T>inline void read(T &t)
{bool flag = 1 ;char c=getchar();t=0;while(!isdigit(c)){ if(c=='-') flag = 0; c=getchar();}while(isdigit(c))t=(t<<3)+(t<<1)+c-48,c=getchar(); if(!flag) t=~(t-1);}
template <typename T,typename... Args> inline void read(T& t, Args&... args){read(t);read(args...);}
template <typename T> inline void wrt(T x)
{if(x<0) x=~(x-1),putchar('-'); if(x>9) wrt(x/10); putchar(x%10+'0');}
template <typename T> inline void wrt(T x,char c) {wrt(x);putchar(c);}

// code_space:debug
#define debug puts("I am still alive") 
#define S_debug(l,r,val) printf("[%d,%d] : %d \n",l,r,val)
#define P_debug(a,b) printf(#a"[%d] = %d \n",b,a[b])
#define A_debug(a,b) rep(i,1,b) P_debug(a,i);

int m,n,a[N],siz,b[N],ans[N];
struct ask{
    int l,r,t,num;
    bool operator<(const ask &a1) const {
        if(l/siz!=a1.l/siz) return l/siz<a1.l/siz;
        if(r/siz!=a1.r/siz) return r/siz<a1.r/siz; 
        return t<a1.t;
    }
}q[N];

struct upd{
    int k , q , h ;
}u[N];

struct information{
    int cnt[1000005] , sum;

    void init()
    {      
        sum = 0;
        rep(i,0,1000000) cnt[i] = 0;
    }
    void Insert(int p)
    {
        if(cnt[a[p]]==0) sum++;
        cnt[a[p]]++;
    }
    void Delete(int p)
    {
        if(cnt[a[p]]==1) sum--;
        cnt[a[p]]--;
    }
    void Forward(int p)
    {
        if(cnt[u[p].q]==1) sum--;
        cnt[u[p].q]--;
        if(cnt[u[p].h]==0) sum++;
        cnt[u[p].h]++;
    }   
    void Back(int p)
    {
        if(cnt[u[p].h]==1) sum--;
        cnt[u[p].h]--;
        if(cnt[u[p].q]==0) sum++;
        cnt[u[p].q]++;
    }
    int Ans()
    {
        return sum;
    }
} val;

int main()
{
    read(n,m);
    rep(i,1,n)
    read(a[i]);
    rep(i,1,n)
    b[i]=a[i];
    siz = pow(n,0.666);
    int tim = 0 ;
    int qc = 0 ;
    rep(i,1,m)
    {
        int x,y;
        char op; 
        scanf("%c",&op);
        read(x,y);
        if(op=='Q')
        {
            q[++qc].t = tim ;
            q[qc].l = x;
            q[qc].r = y;
            q[qc].num = qc; 
        }
        if(op=='R')
        {
            u[++tim].k = x ;
            u[tim].q = b[x] ;
            u[tim].h = y ;
            b[x] = y ;
        }
    }
    sort(q+1,q+qc+1);
    val.init();
    int ml = 0 ;
    int mr = 0 ;
    int mt = 0 ;
    rep(i,1,qc)
    {
        while(ml>q[i].l) ml--,val.Insert(ml);
        while(mr<q[i].r) mr++,val.Insert(mr);
        while(ml<q[i].l) val.Delete(ml),ml++;
        while(mr>q[i].r) val.Delete(mr),mr--;
        while(mt<q[i].t) 
        {
            mt++;
            a[u[mt].k] = u[mt].h;
            if(ml<=u[mt].k&&u[mt].k<=mr) val.Forward(mt);   
        }
        while(mt>q[i].t)
        {
            if(ml<=u[mt].k&&u[mt].k<=mr) val.Back(mt);
            a[u[mt].k] = u[mt].q;
            mt--;
        }
        ans[q[i].num] = val.Ans() ;
    }
    rep(i,1,qc)
    wrt(ans[i],'\n');
    return  0;
}

原因是因为输入

scanf("%c",&op); //scanf
read(x,y);  //快读

然后就读到了空格(?)

把读入改为

cin>>op>>x>>y; //cin

就AC了

评测记录

但是我不理解 于是我又试了试

scanf("%c %d %d " ,&op,&x,&y);//scanf 字符串开头无空格

WA了,也是最后3个点

接着试一下

scanf(" %c %d %d " ,&op,&x,&y);//scanf 字符串开头空格

AC?!

像这种数字加字符的输入还是用带空格的scanf或是cin(数据小时)吧。

坑人啊,浪费好久时间

希望 管理员有空改一下数据

不@人了

2022/1/12 08:34
加载中...