RT,有理由怀疑是 SPJ 的问题?
#include<cstdio>
#include<vector>
#include<algorithm>
std::vector<int> vec[500005];
int nxt[500005],pre[500005],a[500005],b[500005],c[500005],f[500005],g[500005];
inline int read() {
register int x=0,f=1;register char s=getchar();
while(s<'0'||s>'9') {if(s=='-') f=-1;s=getchar();}
while(s>='0'&&s<='9') {x=x*10+s-'0';s=getchar();}
return x*f;
}
inline int max(const int &x,const int &y) {return x>y? x:y;}
int main() {
freopen("lista.in.5","r",stdin);
freopen("lista.ans","w",stdout);
int n=read(),T=read();
nxt[0]=1;
for(register int i=1;i<=n+1;++i) {
nxt[i]=i+1; pre[i]=i-1;
}
while(T--) {
char op;
scanf("%c ",&op);
int x=read(),y=read();
pre[nxt[x]]=pre[x];
nxt[pre[x]]=nxt[x];
if(op=='A') {
nxt[pre[y]]=x;
pre[x]=pre[y];
nxt[x]=y;
pre[y]=x;
}
else {
pre[nxt[y]]=x;
nxt[x]=nxt[y];
pre[x]=y;
nxt[y]=x;
}
}
int tot=0;
for(register int i=1,cur=nxt[0];i<=n;++i,cur=nxt[cur]) a[i]=cur;//printf("%d ",cur); printf("\n");
for(register int i=1;i<=n;++i) f[i]=1e9+6;
for(register int i=1;i<=n;++i) {
int p=std::upper_bound(f+1,f+1+n,a[i])-f;
f[p]=a[i]; g[a[i]]=f[p-1]; //vec[p].push_back(i);
tot=max(tot,p);
}
int cur=n,qwq=0,tt=f[tot];
for(register int x=f[tot];x;x=g[x]) {
c[++qwq]=x;
}
// for(register int i=1;i<=n;++i) nxt[i]=0;
// for(register int i=tot;i>=1;--i) {
// std::sort(vec[i].begin(),vec[i].end());
// int p=0; //printf("%d %d\n",p,vec[i].size());
// for(register int j=0;j<vec[i].size();++j) {
// if(vec[i][j]<=cur) {
// p=max(p,vec[i][j]);
// }
// }
// if(i==tot) tt=a[p];
// c[++qwq]=a[p]; b[a[p]]=1; //printf("%d\n",a[p]);
// cur=p;
// }
std::reverse(c+1,c+1+qwq); printf("%d\n",n-tot);
cur=1;
for(register int i=1;i<=n;++i) {
if(i==c[cur]) {++cur; continue;}
if(c[cur]>i) {
printf("A %d %d\n",i,c[cur]);
}
else {
printf("B %d %d\n",i,tt);
tt=i;
}
}
return 0;
}