建立:
开始设0,1表示左端点和右端点,e[]用来存节点的值,l[]用来存节点右节点的序号,r[]用来存左节点的序号。
插入:
函数定义为在第k个数的右边插入值为x的数
一共需要更改四条路径:idx(要插入的数的编码)的左边是k, idx的右边是k的右边
k的右边是idx,k的右边的左边是idx。
看起来很绕,其实挺直接的, 就是将k右边的数以k为参考用l,r描述出来
删除:
使k的右边的左边是k的左边,k的左边的右边是k的右边就可以了。可以想象成越过数拉绳子
注意:
idx的初始值是2,如果是0的话,循环输出会没有尽头。
#includeusing namespace std; const int N = 100010; int e[N], l[N], r[N]; int idx = 2; void insert(int k, int x){ // cout << "**"; e[idx] = x; r[idx] = r[k], l[r[k]] = idx; l[idx] = k, r[k] = idx ++; //cout << "**"; return; } void del(int k){ l[r[k]] = l[k], r[l[k]] = r[k]; //cout << "**"; return; } int main(){ int m; cin >> m; l[1] = 0, r[0] = 1; while(m --){ string line; cin >> line; int x, k; if(line == "L"){ cin >> x; insert(0, x); } else if(line == "R"){ cin >> x; insert(l[1], x); } else if(line == "IL"){ cin >> k >> x; insert(l[k + 1], x); } else if(line == "IR"){ cin >> k >> x; insert(k + 1, x); } else{ cin >> k; del(k + 1); } } for(int i = r[0]; i != 1; i = r[i]) cout << e[i] << ' '; return 0; }



