最后三个点行首有空格!!
证据:
这是一份完全正确的待修莫队
但是它只有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 字符串开头无空格
接着试一下
scanf(" %c %d %d " ,&op,&x,&y);//scanf 字符串开头空格
像这种数字加字符的输入还是用带空格的scanf或是cin(数据小时)吧。
坑人啊,浪费好久时间
希望 管理员有空改一下数据
不@人了