首页 > 代码库 > 【平衡树】【pb_ds】 bzoj1861 [Zjoi2006]Book 书架
【平衡树】【pb_ds】 bzoj1861 [Zjoi2006]Book 书架
需要用数组记录编号为i的书的位置,和位置i处的书的编号。
Code:
1 #include<cstdio> 2 #include<ext/pb_ds/assoc_container.hpp> 3 #include<ext/pb_ds/tree_policy.hpp> 4 using namespace std; 5 using namespace __gnu_cxx; 6 using namespace __gnu_pbds; 7 tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> T; 8 typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>::iterator ITER; 9 //往bzoj上交时,请将null_type改成null_mapped_type10 int Pos[100001],Val[500001],a,x,n,m;11 char op[7];12 int main()13 {14 scanf("%d%d",&n,&m);15 for(int i=1;i<=n;i++)16 {17 scanf("%d",&Val[i+100000]);18 Pos[Val[i+100000]]=i+100000;19 T.insert(i+100000);20 }21 for(int i=1;i<=m;i++)22 {23 scanf("%s",op);24 if(op[0]==‘T‘)25 {26 scanf("%d",&a);27 int tmp=*T.find_by_order(0);28 T.erase(T.lower_bound(Pos[a]));29 Pos[a]=tmp-1;30 Val[tmp-1]=a;31 T.insert(tmp-1);32 }33 else if(op[0]==‘B‘)34 {35 scanf("%d",&a);36 int tmp=*T.find_by_order(n-1);37 T.erase(T.lower_bound(Pos[a]));38 Pos[a]=tmp+1;39 Val[tmp+1]=a;40 T.insert(tmp+1);41 }42 else if(op[0]==‘I‘)43 {44 scanf("%d%d",&a,&x);45 if(x==0)46 continue;47 ITER it=T.lower_bound(Pos[a]);48 ITER it_Beside=it;49 if(x==1)50 it_Beside++;51 else52 it_Beside--;53 swap(Val[*it],Val[*it_Beside]);54 swap(Pos[Val[*it]],Pos[Val[*it_Beside]]);55 }56 else if(op[0]==‘A‘)57 {58 scanf("%d",&a);59 printf("%d\n",T.order_of_key(Pos[a]));60 }61 else62 {63 scanf("%d",&a);64 printf("%d\n",Val[*T.find_by_order(a-1)]);65 }66 }67 return 0;68 }
【平衡树】【pb_ds】 bzoj1861 [Zjoi2006]Book 书架
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。