求助板子题,关于 splay 的哨兵
查看原帖
求助板子题,关于 splay 的哨兵
252664
Twig_K楼主2024/12/3 19:21

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;
}
2024/12/3 19:21
加载中...