我的pbds怎么好好的?
```cpp
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/priority_queue.hpp>
#include <ext/pb_ds/trie_policy.hpp>
#define endl '\n'
#define For(it,c) for(__typeof(c.begin()) it=c.begin();it!=c.end();it++)
using namespace std;
using namespace __gnu_pbds;
namespace use_hash
{
typedef gp_hash_table<string,int> gp_map;
typedef tree<pair<int,int>,null_type,less<pair<int,int> >,rb_tree_tag,tree_order_statistics_node_update> rb_tree;
const int MAX_N=500005;
int n,val[MAX_N],cnt,tot;
gp_map mp;
string ss[MAX_N];
rb_tree T;
pair<int,int> get_val(int x)
{
return make_pair(-val[x],x);
}
int main()
{
cin>>n;
char c;
string s;
int tp;
while(n--)
{
cin>>c>>s;
if(c=='+')
{
if(mp[s])
{
tp=mp[s];
T.erase(get_val(tp));
tot--;
}
mp[s]=++cnt;
cin>>val[cnt];
T.insert(get_val(cnt));
tot++;
ss[cnt]=s;
}
else if(c=='?' && !isdigit(s[0]))
{
int x=mp[s];
cout<<T.order_of_key(get_val(x))+1<<endl;
}
else
{
int x=0;
for(int i=0;i<(int)s.size();i++)
{
x=(x<<3)+(x<<1)+(s[i]^48);
}
tp=min(tot,x+9);
for(int i=x-1;i<tp;i++)
{
cout<<ss[T.find_by_order(i)->second]<<' ';
}
cout<<endl;
}
}
return 0;
}
}
namespace use_tree
{
typedef tree<pair<int,int>,null_type,greater<pair<int,int> >,rb_tree_tag,tree_order_statistics_node_update> rb_tree;
rb_tree T,TE;
int n,m,k,s,q,ans;
string str;
int main()
{
cin>>n>>m;
while(n--)
{
cin>>str>>k;
if(str=="I")
{
k+=s;
if(k>=m)T.insert(make_pair(k,n));
}
else if(str=="A")
{
m-=k;
s-=k;
}
else if(str=="S")
{
m+=k;
s+=k;
T.split(make_pair(m,-1),TE);
ans+=TE.size();
}
else if(str=="F")
{
if(k>(int)T.size())cout<<-1<<endl;
else cout<<T.find_by_order(k-1)->first-s<<endl;
}
}
cout<<ans<<endl;
return 0;
}
}
namespace use_trie//P3879
{
typedef trie<string,null_type,trie_string_access_traits<>,pat_trie_tag,trie_prefix_search_node_update> pat_trie;
const int MAX_N=10005;
pat_trie Trie[MAX_N];
int n,m;
string str[MAX_N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int L;
cin>>L;
for(int j=0;j<L;j++)
{
string s;
cin>>s;
Trie[i].insert(s);
}
}
cin>>m;
for(int i=1;i<=m;i++)cin>>str[i];
for(int i=1;i<=m;i++)
{
string s=str[i];
for(int j=1;j<=n;j++)
{
if(Trie[j].find(s)!=Trie[j].end())cout<<j<<" ";
}
cout<<endl;
}
return 0;
}
}
namespace use_heap//P3377
{
typedef __gnu_pbds::priority_queue<pair<int,int>,greater<pair<int,int> >,pairing_heap_tag> heap;
const int MAX_N=100005;
bool used[MAX_N];
heap q[MAX_N];
int n,m;
int fa[MAX_N];
int find(int i)
{
return fa[i]==i?i:fa[i]=find(fa[i]);
}
void unite(int u,int v)
{
fa[find(u)]=find(v);
}
bool same(int u,int v)
{
return find(u)==find(v);
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
fa[i]=i;
int x;
cin>>x;
q[i].push(make_pair(x,i));
}
while(m--)
{
int opt;
cin>>opt;
if(opt==1)
{
int u,v;
cin>>u>>v;
if(same(u,v))continue;
if(used[u] || used[v])continue;
q[find(u)].join(q[find(v)]);
unite(v,u);
}
else
{
int x;
cin>>x;
if(used[x])
{
cout<<-1<<endl;
continue;
}
int f=find(x);
pair<int,int> t=q[f].top();
q[f].pop();
cout<<t.first<<endl;
used[t.second]=true;
}
}
return 0;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
use_hash::main();
return 0;
}
```
by Smile_Cindy @ 2019-06-02 10:52:51
@[Alpha](/space/show?uid=87058) 我手写的平衡树(捂脸)。。。
by zzy2333 @ 2019-06-02 10:54:45
是我自己的问题,数据没有问题。。。再看看怎么回事吧
by zzy2333 @ 2019-06-02 11:18:06
@[zzy2333](/space/show?uid=118058) 可能 有问题 我多splay 了几次就wa了,可能 又不平衡导致爆栈了?
by chdy @ 2019-08-20 13:58:46
这 wa 的就很迷了
by chdy @ 2019-08-20 13:58:56
@[chdy](/space/show?uid=59688) 我的是读入的问题,开始用getchar读结果双倍经验数据没行末空格,这题有,然后就爆炸,换成scanf就A了。
by zzy2333 @ 2019-08-20 14:19:29