本地测试AC,提交却全WA,输出仅为一个0,到底发生了什么?

P1486 [NOI2004] 郁闷的出纳员

实际提交时将freopen删去了 求dalao帮忙
by League丶翎 @ 2018-01-02 22:06:07


可以试下洛谷IDE
by LPA20020220 @ 2018-01-02 22:09:00


捕捉dalao一只
by Mirach @ 2018-01-02 22:18:44


检查一下询问和删除,我在本地帮你拍出错了 数据文件: ```cpp #include<bits/stdc++.h> using namespace std; int main() { srand(time(NULL)); int n=1000; int minn=10000; printf("%d %d\n",n,minn); for(int i=0;i<n;++i) { switch(rand()%5) { case 0: putchar('I'),printf(" %d\n",rand()%10000+10000); break; case 1: putchar('A'),printf(" %d\n",rand()%10000); break; case 2: putchar('S'),printf(" %d\n",rand()%10000); break; case 3: putchar('F'),printf(" %d\n",rand()%500); break; case 4: putchar('F'),printf(" %d\n",rand()%100); break; } } return 0; } ``` 删除删多的可能比较大。。。 我的代码: ```cpp #pragma GCC optimize(3) #include<cstdio> #define N 500100 #define R register static int son[N][2],fat[N],key[N],val[N],siz[N],rt,tot,pos,sum; inline void PU(int x){siz[x]=son[x][0][siz]+son[x][1][siz]+val[x];} inline void Rot(int x) { R int y=fat[x],z=fat[y],k=son[y][0]==x; son[z][son[z][1]==y]=x;fat[x]=z; son[y][!k]=son[x][k];son[x][k][fat]=y; son[x][k]=y;fat[y]=x;PU(y); } inline void Spl(int x,int goal) { for(;fat[x]!=goal;Rot(x)) { R int y=fat[x],z=fat[y]; if(z!=goal)(son[y][0]==x)^(son[z][0]==y)?Rot(x):Rot(y); }PU(x);if(!goal)rt=x; } inline void Fin(int x) {for(pos=rt;son[pos][x>key[pos]]&&x!=key[pos];pos=son[pos][x>key[pos]]);Spl(pos,0);} inline void Nex(int x,int k) { Fin(x);if(!(key[pos]>x&&k||key[pos]<x&&!k)) for(pos=son[pos][k];son[pos][!k];pos=son[pos][!k]); } inline void Ins(int x) { R int fa=0; for(pos=rt;pos&&key[pos]!=x;pos=son[pos][x>key[pos]])fa=pos; if(pos)++val[pos];else { pos=++tot; son[fa][x>key[fa]]=pos; son[pos][0]=son[pos][1]=0; fat[pos]=fa;key[pos]=x;val[pos]=siz[pos]=1; }Spl(pos,0); } inline void Del(int x) { Nex(x,1);R int p=pos; Fin(-1e9);Spl(p,rt); sum+=p[son][0][siz]; son[p][0]=0; PU(p);PU(rt); } inline int Kth(int k) { if(k<2||k+1>siz[rt])return 0; for(pos=rt;;) { R int y=son[pos][0]; if(k>siz[y]+val[pos]) { k-=siz[y]+val[pos]; pos=son[pos][1]; }else if(siz[y]<k)return 1; else pos=y; } } inline int read(){int x=0,f=0;register char ch=getchar();for(;ch<48||ch>57;ch=getchar())f|=ch=='-';for(;ch>47&&ch<58;ch=getchar())x=(x<<1)+(x<<3)+(ch^48);return f?-x:x;} int main() { char s[5];int now=0; Ins(-1e9);Ins(+1e9); int n=read(),minn=read(); for(int i=0;i<n;++i) { scanf("%s",s);int k=read(); switch(s[0]) { case 'I':if(k>=minn)Ins(k-now);break; case 'A':now+=k;break; case 'S':now-=k;Del(minn-now-1);break; case 'F':printf("%d\n",Kth(siz[rt]-k)?key[pos]+now:-1);break; } }printf("%d\n",sum); } ```
by Hades18 @ 2018-01-03 09:51:34


@[League丶翎](/space/show?uid=20601) 你的输出和标算很近了,但差了一点 标算: ```cpp ***** ans.txt 25858 46209 -1 44682 -1 ``` 你的输出: ```cpp ***** OUT.TXT 25858 49314 -1 47407 -1 ```
by Hades18 @ 2018-01-03 09:55:17


谢谢dalao,已经改正 放上我的代码
by League丶翎 @ 2018-01-03 20:04:55


@[尘染梦](/space/show?uid=27029)
by League丶翎 @ 2018-01-03 20:05:03


```cpp #include <bits/stdc++.h> using namespace std; #define maxn 100010 int ch[maxn][2],key[maxn],f[maxn],size[maxn],cnt[maxn]; int sz,root,n,m,add,del; int read() { int ans=0,flag=1; char c=getchar(); while( (c>'9' || c<'0') && c!='-' ) c=getchar(); if(c=='-') flag=-1,c=getchar(); while(c>='0' && c<='9') ans=ans*10+c-'0',c=getchar(); return ans*flag; } bool get(int x) {return ch[f[x]][1]==x;} void clear(int x) { ch[x][0]=ch[x][1]=size[x]=f[x]=cnt[x]=key[x]=0; return ; } void update(int x) { int &l=ch[x][0],&r=ch[x][1]; size[x]=cnt[x]+size[l]+size[r]; return ; } void rotate(int x) { int old=f[x],oldf=f[old],w=get(x); ch[old][w]=ch[x][w^1]; f[ch[old][w]]=old; ch[x][w^1]=old; f[old]=x; f[x]=oldf; if(oldf) ch[oldf][ch[oldf][1]==old]=x; update(old); update(x); return ; } void splay(int x,int tar) { for(int fa;(fa=f[x])!=tar;rotate(x)) if(f[fa]!=tar) rotate(get(x)==get(fa)?fa:x); if(!tar) root=x; return ; } int findx(int x) { //by search the ranking return the treenumber int now=root; while(1) { if(ch[now][1] && x<=size[ch[now][1]]) now=ch[now][1]; else { int tmp=(ch[now][1]?size[ch[now][1]]:0)+cnt[now]; if(x<=tmp) { splay(now,0); return now; } x-=tmp; now=ch[now][0]; } } } void insert(int x) { if(root==0) { sz++; ch[sz][0]=ch[sz][1]=f[sz]=0; root=sz; cnt[sz]=size[sz]=1; key[sz]=x; return ; } int now=root,fa=0; while(1) { if(x==key[now]) { cnt[now]++; update(now);update(fa); splay(now,0); break; } fa=now; now=ch[now][key[now]<x]; if(now==0) { sz++; ch[sz][0]=ch[sz][1]=0; f[sz]=fa; cnt[sz]=size[sz]=1; ch[fa][key[fa]<x]=sz; key[sz]=x; update(fa); splay(sz,0); break; } } return ; } int main() { freopen("in","r",stdin); n=read(),m=read(); while(n--) { char str[10]; scanf("%s",str); int k=read(); switch(str[0]) { case 'I':{ if(k>=m) insert(k-add); break; } case 'A':{ add+=k; break; } case 'S':{ add-=k; insert(m-add); if(ch[root][0]) del+=size[ch[root][0]],ch[root][0]=0; if(cnt[root]>1) { cnt[root]--; size[root]--; clear(ch[root][0]); ch[root][0]=0; } else { int old=root; root=ch[root][1]; f[root]=0; clear(old); } break; } case 'F':{ if(k<=0 || k>size[root]) puts("-1"); else printf("%d\n",key[findx(k)]+add); break; } } } printf("%d\n",del); return 0; } ```
by League丶翎 @ 2018-01-03 20:05:08


|