pb_ds 求调

P6136 【模板】普通平衡树(数据加强版)

wrkwrkwrk @ 2023-07-23 15:02:17

#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp> 
#include<ext/pb_ds/tree_policy.hpp> 
using namespace __gnu_pbds;
using namespace std;
namespace NYNAMESPACE{;
tree<pair<int,int>,null_type,less<pair<int,int>>,rb_tree_tag,tree_order_statistics_node_update>l;
int cnt=-0,inf=(1ll<<30);
int main(){
    ios::sync_with_stdio(false);
    int n,m;
    cin>>n>>m; 
    for(int i=1;i<=n;i++){
        int c;
        cin>>c;
        l.insert({c,cnt++});
    }
    int la=0,an=0;;
    while(m--){
        int op,x;
        cin>>op>>x;
        x^=la;
        if(op==1){
            l.insert({x,cnt++});
        }
        if(op==2){
            l.erase(*l.lower_bound({x,0}));
        }
        if(op==3){
            int ans=l.order_of_key(*l.lower_bound({x,0}))+1;
            la=ans;
            an^=ans;
        } 
        if(op==4){
            int ans=(*l.find_by_order(x-1)).first;
            la=ans;
            an^=ans;
        }
        if(op==5){
            auto a=l.lower_bound({x,0});a--;
            int ans=(*a).first;
            la=ans;
            an^=ans;
        }
        if(op==6){
            auto a=l.upper_bound({x,inf});
            int ans=(*a).first;
            la=ans;
            an^=ans;
        }
    }
    cout<<an;
    return 0;
}
}
signed main(){
    return NYNAMESPACE::main();
}

普通版可过。这里72pts


by Terrible @ 2023-07-23 16:38:32

@wrkwrkwrk

问题出在 op==3 操作上,如果它给定的查找数是一个比所有数都大的数,你的程序会搜到end结点,导致最后的ans==1

在普通版,按照出题人的意思,一个数有排名的前提是,这个数参与排名,这个数必须存在在现有的这堆数中。

与之不同的是,本题的数可以不在现有这堆数里面,进而大于这里的所有数都理所应当。

关于一个数的排名的前提是否是它在这些数里面?

这个话题是有争议的。值得肯定的是,两种解释方式都是可行的,普通版的数据表达的含义会更局限一些,如果能够处理后一种解释就能处理前一种,普通版的数据更具有普适性。


by wrkwrkwrk @ 2023-07-23 16:44:06

@Terrible 通过了,谢谢。


by Terrible @ 2023-07-23 16:58:07

注:

排名定义为比当前数小的数的个数 +1

不是对排名的完整定义,只能说它明确了对于排名的数值表示,或者说只是在数值之上给出了定义。就好比我们会说大象是长鼻子的动物,而不会说大象定义为长鼻子的动物,从而得到所有长鼻子都是大象这一荒谬的结论。但是如果我只是在给大象打做一个属性分类,我定义大象是长鼻子的动物,大象.属性={鼻子:长,生物属性:动物,……},是在一些标签上定义了填什么。

上面这句话理解成是对于排名的定义,在实质上是架空“排名”的一般含义的。如果我们仍然认为“排名”是一个从历史中走来的词语,凝结了我们对于语言的认识,那就不能允许这种粗俗的行径。如果有人认为,只要这么写了,就算做是定义,就应当摒弃它所有之前的印记,使得它在概念上得到“涅槃重生”,这究根到底是一种唯意识论,是意识支配现实的。


|