HDU 3436 Queue-jumpers Splay

题意:给你一串序列,不断的将一个数 取出来放在最前面,不断的询问 rank位  和 数的rank,

解题思路:

1)线段树 + 树状数组(需要离散化)

2)Splay ,我把抽出来的建树,所以不是那么方便,可以离散化直接建树,这样会方便一点。

解题代码:

  1 // File Name: hdu3436.pb_ds.cpp
  2 // Author: darkdream
  3 // Created Time: 2015年04月07日 星期二 14时26分13秒
  4 
  5 #include<vector>
  6 #include<list>
  7 #include<map>
  8 #include<set>
  9 #include<deque>
 10 #include<stack>
 11 #include<bitset>
 12 #include<algorithm>
 13 #include<functional>
 14 #include<numeric>
 15 #include<utility>
 16 #include<sstream>
 17 #include<iostream>
 18 #include<iomanip>
 19 #include<cstdio>
 20 #include<cmath>
 21 #include<cstdlib>
 22 #include<cstring>
 23 #include<ctime>
 24 #include<ext/pb_ds/tree_policy.hpp>
 25 #include<ext/pb_ds/assoc_container.hpp>
 26 #define maxn 100005
 27 
 28 #define LL long long
 29 
 30 using namespace __gnu_pbds;
 31 using namespace std;
 32 tree<int,int,greater<int>,rb_tree_tag,tree_order_statistics_node_update> mp; 
 33 int T; 
 34 int n , q;
 35 char str[10];
 36 int tmp ; 
 37 struct SplayTree{
 38     int sz[maxn];
 39     int ch[maxn][2];
 40     int pre[maxn];
 41     int root ,top1,top2;
 42     int ss[maxn],que[maxn];
 43     inline void Rotate(int x ,int f){
 44           int y = pre[x];
 45           push_down(y);
 46           push_down(x);
 47           ch[y][!f] = ch[x][f];
 48           pre[ ch[x][f] ] = y ;
 49           pre[x] = pre[y];
 50           if(pre[x])  ch[pre[y]][ch[pre[y]][1] == y] = x; 
 51           ch[x][f] = y ; 
 52           pre[y] = x; 
 53           push_up(y);
 54     }
 55     inline void Splay(int x ,int goal){
 56         push_down(x);
 57         while(pre[x] != goal){
 58             if(pre[ pre[x] ] == goal){
 59                 Rotate(x,ch[pre[x]][0] == x);    
 60             } else {
 61                 int y = pre[x],z = pre[y];
 62                 int f = (ch[z][0] == y);
 63                 if(ch[y][f] == x){
 64                     Rotate(x,!f),Rotate(x,f);
 65                 } else{
 66                     Rotate(y,f), Rotate(x,f);
 67                 }
 68             }
 69         }
 70         push_up(x);
 71         if(goal == 0 ) root = x; 
 72     }
 73     inline void RotateTo(int k ,int goal){
 74         int x = root;
 75         push_down(x);
 76         while(sz[ch[x][0]] != k ){
 77             if(k < sz[ch[x][0]]){
 78                 x = ch[x][0];
 79             }else{
 80                 k -=(sz[ch[x][0]] + 1);
 81                 x = ch[x][1];
 82             }
 83             push_down(x);
 84         }
 85         Splay(x,goal);
 86     }
 87     inline void NewNode(int &x ,int key,int val){
 88         if(top2) x = ss[--top2];
 89         else x = ++top1;
 90         ch[x][0] = ch[x][1] = pre[x] = 0 ; 
 91         sz[x] = 1; 
 92         keys[x]= key; 
 93         vals[x] = val ; 
 94     }
 95     inline void push_down(int x){
 96     
 97     }
 98     inline void push_up(int x){
 99        sz[x] = 1 + sz[ch[x][1]] + sz[ch[x][0]];
100     }
101     inline void init(){
102         ch[0][0] = ch[0][1] = pre[0] = sz[0] = 0 ; 
103         root = top1 = 0 ; 
104         NewNode(root,0,0);
105         NewNode(ch[root][1],1e9,0);
106         sz[root] = 2; 
107         pre[ch[root][1]] = root;
108 
109     }
110     inline pair<int,int> find(int key)
111     {
112         int x = root ;  
113         int k = 0 ; 
114         for(;;)
115         {
116            if(key == keys[x])
117            {
118                pair<int,int> ans =  make_pair(vals[x],k+sz[ch[x][0]]);
119                Splay(x,0);
120                return ans; 
121            }
122            bool f = (key > keys[x]);
123            if(ch[x][f] == 0 )
124            {
125              pair<int,int> ans = make_pair(-1,k + sz[ch[x][0]] - (!f));   
126              Splay(x,0);
127              return ans ;
128 
129            }else{
130              if(f)
131                 k += (sz[ch[x][0]] + 1); 
132              x = ch[x][f];
133            }
134         }
135     }
136     inline void insert(int key,int val){
137         int x = root;     
138         int k = 0 ; 
139         for(;;)
140         {
141             if(key == keys[x])
142             {
143                 mp.erase(mp.find(vals[x]));
144                 vals[x] = val;      
145                 Splay(x,0);
146                 return; 
147             }
148             int f = (key > keys[x]);
149             if(ch[x][f] == 0 )
150             {
151                 NewNode(ch[x][f],key,val);
152                 pre[ch[x][f]] = x; 
153                 Splay(ch[x][f],0);
154                 return;
155             }else{
156                x = ch[x][f];
157             }
158         }
159     }
160     inline int  findrank(int site){    
161         int x = root ;
162         int k = 0 ; 
163         int szmp= mp.size();
164         int ans = site;  
165         int p  = root;
166         for(; x!= 0 ;)
167         {
168            int tmp = szmp + keys[x] - (k + sz[ch[x][0]]) + 1;    
169            if(tmp > site)
170            {
171                x = ch[x][0];
172            }else{
173               ans = keys[x] + (site - (tmp) + 1) ;  
174               p = x; 
175               k += (sz[ch[x][0]] + 1);
176               x = ch[x][1];
177            }
178         }
179         Splay(p,0);
180         return ans;   
181     }
182     int vals[maxn];
183     int keys[maxn];
184 
185 }spt;
186 int main(){
187    scanf("%d",&T);
188    for(int CA = 1; CA <= T ; CA++)
189    {
190       mp.clear();
191       spt.init();
192       printf("Case %d:\n",CA);
193       scanf("%d %d",&n,&q);
194       for(int i= 1;i <= q;i ++)
195       {
196         scanf("%s %d",str,&tmp);
197         if(str[0] == 'T'){
198             spt.insert(tmp,i);
199             mp[i] = tmp ; 
200          }else if(str[0] == 'Q'){
201             pair<int ,int > tt = spt.find(tmp);
202             if(tt.first != -1 )
203               printf("%ld\n",mp.order_of_key(tt.first) + 1);
204             else{
205               printf("%ld\n",mp.size()-tt.second + tmp);     
206             }
207         }else{
208             if(tmp <= mp.size()){
209                 printf("%d\n",mp.find_by_order(tmp-1)->second);
210             }else{
211                 printf("%d\n",spt.findrank(tmp)); 
212             }
213         }
214       }
215    }
216 return 0;
217 }
View Code

 

转载于:https://www.cnblogs.com/zyue/p/4408856.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值