社区讨论
100分 最后一点TLE,求调
P5076【深基16.例7】普通二叉树(简化版)参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @m5s9k6y2
- 此快照首次捕获于
- 2025/01/11 22:10 去年
- 此快照最后确认于
- 2025/11/04 11:44 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
const long long N = 1000001;
long long n,root,sum,opt,x;
struct Node {
long long l,r,s,v,d;
Node(long long l,long long r,long long s,long long v)
: l(l),r(r),s(s),v(v),d(1){}
Node(){}
}t[N];
inline void update(long long root){
t[root].s = t[t[root].l].s + t[t[root].r].s + t[root].d;
}
long long r(long long x,long long root){
if(root){
if(x < t[root].v){
return r(x,t[root].l);
}
if(x > t[root].v){
return r(x,t[root].r) + t[t[root].l].s + t[root].d;
}
return t[t[root].l].s + t[root].d;
}
return 1;
}
long long kth(long long x,long long root){
if(x <= t[t[root].l].s){
return kth(x,t[root].l);
}
if(x <= t[t[root].l].s + t[root].d){
return t[root].v;
}
return kth(x - t[t[root].l].s - t[root].d,t[root].r);
}
void insert(long long x,long long & root){
if(x < t[root].v){
if(!t[root].l){
t[t[root].l = ++sum] = Node(0,0,1,x);
}else{
insert(x,t[root].l);
}
}else if(x > t[root].v){
if(!t[root].r){
t[t[root].r = ++sum] = Node(0,0,1,x);
}else{
insert(x,t[root].r);
}
}else{
t[root].d++;
}
update(root);
}
int main(){
cin >> n;
long long cnt = 0;
t[root = ++sum] = Node(0,0,1,2147483647);
while(n--){
cin >> opt >> x;
cnt++;
if(opt == 1){
cout << r(x,root) << endl;
}else if(opt == 2){
cout << kth(x,root) << endl;
}else if(opt == 3){
cout << kth(r(x,root) - 1,root) << endl;
}else if(opt == 4){
cout << kth(r(x + 1,root),root) << endl;
}else{
cnt--;
insert(x,root);
}
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...