RT,一直 WA 80 分怎么也过不了,加上两个空的哨兵节点就过了。
没有找到代码中可能出现的访问非法地址的情况,求教/kel(下面第一份代码是 AC 的,第二份 80 分,区别在于主函数中的 build 的那行传参,以及主函数中输入 x 和 p 之后是 +=1 还是 +=2)。
AC:
#include<bits/stdc++.h>
#define Spc putchar(' ')
#define End putchar('\n')
#define For(i,il,ir) for(ll i=(il);i<=(ir);++i)
#define Fr(i,il,ir) for(ll i=(il);i<(ir);++i)
#define Forr(i,ir,il) for(ll i=(ir);i>=(il);--i)
#define fi first
#define se second
#define mk make_pair
#define pb emplace_back
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn=2e5+10;
int n,m,Q;
map<string,int> mp;
#define lc (tr[o].ch[0])
#define rc (tr[o].ch[1])
int rt,tot;
string book[maxn];
struct node{
string name;
int fa=0,sz=0,ch[2]={};
}tr[maxn];
int get(int u){ return u==tr[tr[u].fa].ch[1]; }
void addson(int ff,int u,int op){ tr[tr[u].fa=ff].ch[op]=u; }
void pushup(int o){ tr[o].sz=tr[lc].sz+tr[rc].sz+1; }
void rotate(int u){
int o=tr[u].fa,op=get(u),ffa=tr[o].fa,son=tr[u].ch[op^1];
addson(ffa,u,get(o)),addson(u,o,op^1),addson(o,son,op);
pushup(o),pushup(u);
}
int splay(int u,int v=0){
for(int o;(o=tr[u].fa)^v;rotate(u)) if(tr[o].fa^v) rotate(get(u)==get(o)?o:u);
if(!v) rt=u;
return u;
}
int kth(int o,int k){
int tmp=tr[lc].sz;
if(k<=tmp) return kth(lc,k);
else if(k>tmp+1) return kth(rc,k-1-tmp);
return splay(o);
}
void build(int &o,int l,int r,int fa)
{
int mid=l+r>>1;
o=++tot,tr[o].fa=fa,tr[o].sz=1,tr[o].name=book[mid];
if(l<mid) build(lc,l,mid-1,o);
if(mid<r) build(rc,mid+1,r,o);
pushup(o);
}
signed main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n;
For(i,1,n) cin>>book[i];book[0]=book[n+1]="null";
build(rt,0,n+1,0);//这里 build 包含哨兵
cin>>m;
For(i,1,m)
{
string s;int x;
cin>>s>>x;x+=2;// 有哨兵所以 +=2
tr[++tot].sz=1,tr[tot].name=s;
int o=kth(rt,x);
if(lc){
int pre=lc;
while(tr[pre].ch[1]) pre=tr[pre].ch[1];
splay(pre),splay(o,pre);
}
addson(o,tot,0),splay(tot);
}
cin>>Q;
while(Q--)
{
int p;cin>>p;p+=2;// 有哨兵所以 +=2
int o=kth(rt,p);
cout<<tr[o].name<<'\n';
}
return 0;
}
WA:
#include<bits/stdc++.h>
#define Spc putchar(' ')
#define End putchar('\n')
#define For(i,il,ir) for(ll i=(il);i<=(ir);++i)
#define Fr(i,il,ir) for(ll i=(il);i<(ir);++i)
#define Forr(i,ir,il) for(ll i=(ir);i>=(il);--i)
#define fi first
#define se second
#define mk make_pair
#define pb emplace_back
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn=2e5+10;
int n,m,Q;
map<string,int> mp;
#define lc (tr[o].ch[0])
#define rc (tr[o].ch[1])
int rt,tot;
string book[maxn];
struct node{
string name;
int fa=0,sz=0,ch[2]={};
}tr[maxn];
int get(int u){ return u==tr[tr[u].fa].ch[1]; }
void addson(int ff,int u,int op){ tr[tr[u].fa=ff].ch[op]=u; }
void pushup(int o){ tr[o].sz=tr[lc].sz+tr[rc].sz+1; }
void rotate(int u){
int o=tr[u].fa,op=get(u),ffa=tr[o].fa,son=tr[u].ch[op^1];
addson(ffa,u,get(o)),addson(u,o,op^1),addson(o,son,op);
pushup(o),pushup(u);
}
int splay(int u,int v=0){
for(int o;(o=tr[u].fa)^v;rotate(u)) if(tr[o].fa^v) rotate(get(u)==get(o)?o:u);
if(!v) rt=u;
return u;
}
int kth(int o,int k){
int tmp=tr[lc].sz;
if(k<=tmp) return kth(lc,k);
else if(k>tmp+1) return kth(rc,k-1-tmp);
return splay(o);
}
void build(int &o,int l,int r,int fa)
{
int mid=l+r>>1;
o=++tot,tr[o].fa=fa,tr[o].sz=1,tr[o].name=book[mid];
if(l<mid) build(lc,l,mid-1,o);
if(mid<r) build(rc,mid+1,r,o);
pushup(o);
}
signed main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n;
For(i,1,n) cin>>book[i];book[0]=book[n+1]="null";
build(rt,1,n,0);//build 去掉了哨兵
cin>>m;
For(i,1,m)
{
string s;int x;//+=1
cin>>s>>x;x++;
tr[++tot].sz=1,tr[tot].name=s;
int o=kth(rt,x);
if(lc){
int pre=lc;
while(tr[pre].ch[1]) pre=tr[pre].ch[1];
splay(pre),splay(o,pre);
}
addson(o,tot,0),splay(tot);
}
cin>>Q;
while(Q--)
{
int p;cin>>p;p++;// +=1
int o=kth(rt,p);
cout<<tr[o].name<<'\n';
}
return 0;
}