
Lv.1
鸿鹄一再高举 天地睹方圆【第61期社区星】
签名:猫站肯定不会上的了,留了两个2021年退喵时最后的作品。 有老友可以来qq:2309193203找我。
在 【岛3教程】有了存档功能,跑酷再也不虐了! 中回复
2021-08-25T19:34:17 点赞:3
在 帖子标题:【kitten注册破千万啦】参与活动,拿欢庆福利 中回复
I wish codemao no water posts, no advertising and more academic style in the future!
2021-08-28T21:45:25 点赞:1
在 帖子标题:【kitten注册破千万啦】参与活动,拿欢庆福利 中回复
我觉得工作室应该放小鹿、月狼、PTG、ZCH、跃动、宇軒、TFT、帅哥、疯癫这些老牌三级的工作室好,现在除了CJP都是新加入的
2021-08-28T21:51:18 点赞:8
在 如何在社区证明自己是大佬? 中回复
#include<bits/stdc++.h>
#define endl ('\n')
using namespace std;
const int maxn = 1e6 + 1e2;
int root,q,size_,t[maxn][2],key[maxn],siz[maxn];
void insert(int &u,int x){
if(u == 0){
u = ++size_,key[u] = x,siz[u] = 1;
t[u][0] = t[u][1] = 0;
return;
}
int d = (x > key[u]);
insert(t[u][d],x);
siz[u]++;
}
void erase(int &u,int x){
if(u == 0) return;
if(key[u] == x){
if(t[u][0] == 0 || t[u][1] == 0){
u = t[u][0] + t[u][1];
}
else {
int v = t[u][1];
while(t[v][0]){
v = t[v][0];
}
key[u] = key[v];
erase(t[u][1],key[u]);
siz[u]--;
}
return;
}
int d = (x > key[u]);
erase(t[u][d],x);
siz[u]--;
}
int find(int u,int k){
int s = siz[t[u][0]];
if(k < s) return find(t[u][0],k);
if(k == s) return key[u];
return find(t[u][1],k - s - 1);
}
int order(int u,int x){
if(u == 0) return 0;
if(x <= key[u]) return order(t[u][0],x);
return siz[t[u][0]] + 1 + order(t[u][1],x);
}
int qq(int root,int x){
return find(root,order(root,x) - 1);
}
int hj(int root,int x){
return find(root,order(root,x + 1));
}
int vec[maxn], sz;
void dfs(int u) {
if(t[u][0]) dfs(t[u][0]);
vec[sz++] = key[u];
if(t[u][1]) dfs(t[u][1]);
}
int build(int l,int r){
int u = ++size_,mid = (l + r) / 2;
key[u] = vec[mid],siz[u] = 1,t[u][0] = t[u][1] = 0;
if(l < mid) t[u][0] = build(l, mid - 1),siz[u] += siz[t[u][0]];
if(r > mid) t[u][1] = build(mid + 1, r),siz[u] += siz[t[u][1]];
return u;
}
int rebuild(int root){
if(!root) return 0;
sz = 0;
dfs(root);
size_ = 0;
return build(0,sz - 1);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
insert(root,-2147483647);
insert(root,2147483647);
cin>>q;
int kkk = sqrt(q);
for(int i = 1;i <= q;i++){
if(i % kkk == 0) root = rebuild(root);
int k,x;
cin>>k>>x;
if(k == 1) insert(root,x);
if(k == 2) erase(root,x);
if(k == 3) cout<<order(root,x)<<endl;
if(k == 4) cout<<find(root,x)<<endl;
if(k == 5) cout<<qq(root,x)<<endl;
if(k == 6) cout<<hj(root,x)<<endl;
}
return 0;
}
2021-08-30T08:41:15 点赞:0