您的位置:首页 > 其它

块状链表

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掉了,写的太暴力了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: