块状链表
2016-05-17 08:59
253 查看
#include<iostream> #include<cstdio> #include<cmath> #include<vector> using namespace std; struct node{ struct node *next; vector<int>list; node(){ next=NULL; list.clear(); } }*h=new node; int sqrtn; void Get(node *p){ if(!p)return; for(int i=0;i<p->list.size();i++) printf("%d ",p->list[i]); if(p->next)Get(p->next); } void Merge(node *p,node *q){ for(int i=0;i<q->list.size();i++) p->list.push_back(q->list[i]); p->next=q->next; } void Insert(int x,node *p){ if(p->next && p->list.size()+p->next->list.size()) Merge(p,p->next); int L=0,R=p->list.size(); while(L<R){ int Mid=(L+R)/2; if(x>p->list[Mid])L=Mid+1; else R=Mid; } if(L==p->list.size()){ if(!p->next)p->list.push_back(x); else Insert(x,p->next); } else{ int x1=p->list[p->list.size()-1]; for(int i=p->list.size()-1;i>=L+1;i--) p->list[i]=p->list[i-1]; p->list[L]=x; p->list.push_back(x1); } if(p->list.size()>=sqrtn){ node *q=new node; if(p->next) q->next=p->next; p->next=q; int mid=p->list.size()/2,list_size=p->list.size(); for(int i=mid+1;i<list_size;i++) q->list.push_back(p->list[i]); for(int i=mid+1;i<list_size;i++) p->list.pop_back(); } return; } void Delete(int x,node *p){ if(p->list.empty() || x>p->list[p->list.size()-1]){ Delete(x,p->next); return; } int L=0,R=p->list.size(); while(L<R){ int Mid=(L+R)/2; if(x>p->list[Mid])L=Mid+1; else R=Mid; } int i; for(i=L;i<p->list.size()-1;i++) p->list[i]=p->list[i+1]; p->list.pop_back(); if(p->next && p->list.size()+p->next->list.size()) Merge(p,p->next); return; } int Search(int x,node *p){ if(!p)return 0; int k; if(p->list.empty() || x>p->list[p->list.size()-1]){ k=Search(x,p->next); if(!k)return 0; else return k+p->list.size(); } int L=0,R=p->list.size(); while(L<R){ int Mid=(L+R)/2; if(x>p->list[Mid])L=Mid+1; else R=Mid; } if(p->list[L]==x)return L+1; else return 0; } void Out(){ Get(h); puts(""); } int main(){ int n,k,i; scanf("%d",&n); sqrtn=(int)sqrt(n); for(i=0;i<n;i++){ scanf("%d",&k); Insert(k,h); } Out(); scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",&k); Delete(k,h); } Out(); scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",&k); printf("%d ",Search(k,h)); } return 0; }快排T掉了,写的太暴力了
相关文章推荐
- (礼拜二log)java 构建层级关系的递归算法
- host切换神器 firfox hostadmin
- 解决Error running app: Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled.
- LeetCode 143. Reorder List
- OpenGL矩阵变换
- 摇一摇
- 计步器
- 图片转为NSDasta
- CoreLocation Authorization in iOS8+
- tomcat 下 发布项目路径
- java 类和对象2
- SICP ex2-29
- 解析Java中PriorityQueue优先级队列结构的源码及用法
- 经纬度对应的距离
- iOS实现自定义的弹出视图(popView)
- 81. Search in Rotated Sorted Array
- Angularjs中的事件广播 ―全面解析$broadcast,$emit,$on
- 世界各国国家代码简称 - 备用
- java编码规范及优化总结
- 实现登录和注册透明,仿猎趣登录和注册界面实现