诡异报错

回复帖子

@Froggy 2019-03-15 19:45 回复

写splay时诡异报错:

#include<iostream>
#include<cstdio>
using namespace std;
#define N 80010
inline int read(){
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-')f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=(x<<3)+(x<<1)+c-'0';c=getchar();
    }
    return x*f;
}
struct node{
    int ch[2],siz,fa,data,id;
}t[N];
int cnt=0,root,n,m;
int pos[N];
void up(int k){
    t[k].siz=t[t[k].ch[0]].siz+t[t[k].ch[1]].siz+1;
    pos[t[t[k].ch[0]].id]=t[k].ch[0];
    pos[t[t[k].ch[1]].id]=t[k].ch[1];
}
int get(int k){
    return t[t[k].fa].ch[1]==k;
}
void rorate(int k){
    int fa=t[k].fa,gfa=t[fa].fa;
    int d1=get(k),d2=get(fa);
    t[fa].ch[d1]=t[k].ch[d1^1];
    t[t[k].ch[d1^1]].fa=fa;
    t[gfa].ch[d2]=k;
    t[k].fa=gfa;
    t[fa].fa=k;
    t[k].ch[d1^1]=fa;
    up(fa);
    up(k);
}
void splay(int k,int goal){
    while(t[k].fa!=goal){
        int fa=t[k].fa,gfa=t[fa].fa;
        int d1=get(k),d2=get(fa);
        if(gfa!=goal){
            if(d1==d2)rorate(fa);
            else rorate(k);
        }
        rorate(k);
    }
    pos[t[k].id]=k;
    if(goal==0)root=k;
}
void insert(int data,int id){
    int k=root,fa=0;
    while(k&&t[k].data!=data){
        fa=k;
        k=t[k].ch[t[k].data<data];
    }
    k=++cnt;
    if(fa)t[fa].ch[t[fa].data<data]=k;
    pos[id]=k;
    t[k].data=data;
    t[k].id=id;
    t[k].siz=1;
    t[k].fa=fa;
    t[k].ch[0]=t[k].ch[1]=0;
    splay(k,0);
}
int get_rank(int data){
    splay(data,0);
    return t[t[root].ch[0]].siz;
}
int kth(int rank){
    int k=root;
    while(1){
        int son=t[k].ch[0];
        if(rank<=t[son].siz)k=son;
        else if(rank>t[son].siz+1){
            rank-=t[son].siz+1;
            k=t[k].ch[1];
        }
        else return k;
    }
}
int get_pre(int data){
    splay(pos[data],0);
    int k=root;
    k=t[k].ch[0];
    while(t[k].ch[1]){
        k=t[k].ch[1];
    }   
    for(int j=0;j<20;j++){//为什么会报错?? 
        cout<<t[j].fa<" "<<t[j].ch[0]<<" "<<t[j].ch[1]<<" "<<t[j].id<<endl;
    }
    return k;
}
int get_suf(int data){
    splay(pos[data],0);
    int k=root;
    k=t[k].ch[1];
    while(t[k].ch[0]){
        k=t[k].ch[0];
    }
    return k;
}
void change(int k,int p){
    splay(k,0);
    k=root;
    if(!t[k].ch[p])return;
    if(!t[k].ch[p^1]){
        t[k].ch[p^1]=t[k].ch[p];
        t[k].ch[p]=0;
    }
    else{
        k=t[k].ch[p^1];
        while(t[k].ch[p])k=t[k].ch[p];
        t[t[root].ch[p]].fa=k;
        t[k].ch[p]=t[root].ch[p];
        t[root].ch[p]=0;
        splay(t[k].ch[p],0);
    }
}
int main(){
    n=read();m=read();
    for(int i=1;i<=n;i++){
        int x=read();
        insert(i,x);
    }
    for(int i=1;i<=m;i++){
        string s;
        int x;
        cin>>s>>x;
        if(s=="Top"){
            change(pos[x],0);
        }
        else if(s=="Bottom"){
            change(pos[x],1);
        }
        else if(s=="Insert"){
            int y=read();
            if(y==-1){
                int pre=get_pre(x);
                cout<<pre<<endl;
                cout<<pos[x]<<" "<<pos[t[pre].id]<<endl;
                swap(pos[x],pos[t[pre].id]);
                swap(t[pre].id,t[pos[x]].id);
                //swap(t[pre].data,t[pos[x]].data);

            }
            else if(y==1){
                int suf=get_suf(x);
                swap(pos[x],pos[t[suf].id]);
                swap(t[suf].id,t[pos[x]].id);
            }

        }
        else if(s=="Ask"){
            cout<<get_rank(pos[x])<<endl;
        }
        else if(s=="Query"){
            cout<<t[kth(x)].id<<endl;
        }
    }
    return 0;
}

求助...

95 31 [Error] invalid operands of types 'const char [2]' and 'int' to binary 'operator<<'
@Steve_braveman 2019-03-15 19:53 回复

@Froggy 。。。。。

cout<<t[j].fa < " "<<t[j].ch[0]<<" "<<t[j].ch[1]<<" "<<t[j].id<<endl;

@huanghaox1212 2019-03-15 19:54 回复
for(int j=0;j<20;j++){//为什么会报错?? 
        cout<<t[j].fa<<" "<<t[j].ch[0]<<" "<<t[j].ch[1]<<" "<<t[j].id<<endl;
    }