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
不是对排名的完整定义,只能说它明确了对于排名的数值表示,或者说只是在数值之上给出了定义。就好比我们会说大象是长鼻子的动物,而不会说大象定义为长鼻子的动物,从而得到所有长鼻子都是大象这一荒谬的结论。但是如果我只是在给大象打做一个属性分类,我定义大象是长鼻子的动物,大象.属性={鼻子:长,生物属性:动物,……}
,是在一些标签上定义了填什么。
上面这句话理解成是对于排名的定义,在实质上是架空“排名”的一般含义的。如果我们仍然认为“排名”是一个从历史中走来的词语,凝结了我们对于语言的认识,那就不能允许这种粗俗的行径。如果有人认为,只要这么写了,就算做是定义,就应当摒弃它所有之前的印记,使得它在概念上得到“涅槃重生”,这究根到底是一种唯意识论,是意识支配现实的。