社区讨论
求助
P3369【模板】普通平衡树参与者 4已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @m515uzcj
- 此快照首次捕获于
- 2024/12/23 22:57 去年
- 此快照最后确认于
- 2025/11/04 12:25 4 个月前
CPP
CPP
#include<bits/stdc++.h>
using namespace std;
namespace trie{
int b[5000000],t[5000000][2],tot=0;
void insert(int x,int s){
int p=0,c=pow(2,30);
for(int i=30;i>=0;i--){
int ch=(x/c)%2;
if(!t[p][ch]) t[p][ch]=++tot,b[tot]=0,t[tot][0]=0,t[tot][1]=0;
p=t[p][ch],b[p]+=s,c/=2;
}
}
int find1(int x,int tt){
int p=0,c=pow(2,30),ans=0;
for(int i=30;i>=0;i--){
int ch=(x/c)%2;
if(ch==1) ans+=b[t[p][0]];
p=t[p][ch],c/=2;
}
return tt?ans+1:ans+b[p];
}
int find2(int x){
int p=0,ans=0;
for(int i=30;i>=0;i--){
if(b[t[p][0]]>=x) ans*=2,p=t[p][0];
else ans=ans*2+1,x-=b[t[p][0]],p=t[p][1];
}
return ans;
}
}
int num=1e7;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
int op,x;
cin>>op>>x;
if(op==1) trie::insert(x+num,1);
if(op==2) trie::insert(x+num,-1);
if(op==3){
trie::insert(x+num,1);
cout<<trie::find1(x+num,1)<<endl;
trie::insert(x+num,-1);
}
if(op==4) cout<<trie::find2(x)-num<<endl;
if(op==5){
trie::insert(x+num,1);
cout<<trie::find2(trie::find1(x+num,1)-1)-num<<endl;
trie::insert(x+num,-1);
}
if(op==6){
trie::insert(x+num+1,1);
int u=trie::find1(x+num+1,1);
trie::insert(x+num+1,-1);
cout<<trie::find2(u)-num<<endl;
}
}
}
CPP
#include<bits/stdc++.h>
using namespace std;
namespace trie{
int b[5000000],t[5000000][2],tot=0;
void insert(int x,int s){
int p=0,c=pow(2,30);
for(int i=30;i>=0;i--){
int ch=(x/c)%2;
if(!t[p][ch]) t[p][ch]=++tot,b[tot]=0,t[tot][0]=0,t[tot][1]=0;
p=t[p][ch],b[p]+=s,c/=2;
}
}
int find1(int x,int tt){
int p=0,c=pow(2,30),ans=0;
for(int i=30;i>=0;i--){
int ch=(x/c)%2;
if(ch==1) ans+=b[t[p][0]];
p=t[p][ch],c/=2;
}
return tt?ans+1:ans+b[p];
}
int find2(int x){
int p=0,ans=0;
for(int i=30;i>=0;i--){
if(b[t[p][0]]>=x) ans*=2,p=t[p][0];
else ans=ans*2+1,x-=b[t[p][0]],p=t[p][1];
}
return ans;
}
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
int op,x;
cin>>op>>x;
if(op==1) trie::insert(x,1);
if(op==2) trie::insert(x,-1);
if(op==3){
trie::insert(x,1);
cout<<trie::find1(x,1)<<endl;
trie::insert(x,-1);
}
if(op==4) cout<<trie::find2(x)<<endl;
if(op==5){
trie::insert(x,1);
cout<<trie::find2(trie::find1(x,1)-1)<<endl;
trie::insert(x,-1);
}
if(op==6){
trie::insert(x+1,1);
int u=trie::find1(x+1,1);
trie::insert(x+1,-1);
cout<<trie::find2(u)<<endl;
}
}
}
为啥操作时(下面代码)不加上常数时WA了一个点,加上后(上面代码)AC了。
回复
共 5 条回复,欢迎继续交流。
正在加载回复...