题目链接:http://poj.org/problem?id=2828
题意:大家就是买票插队的意思,比如说在第0个位置第一次有人了,下次别人要插第0的位置,之前的那个第0的位置就要让给他,导致后面的整个队伍都要进行移动,插队可耻。。。。
#include<vector>
#include<cstdio>#include<cstring>
using namespace std;
const int maxn=10009;
const int maxlen=409;
struct node
{
vector<int > block[maxn];
int next[1000],top;
node()
{
clear();
}
void clear()
{
top=1;
memset(next,0,sizeof(next));
memset(block,0,sizeof(block));
}
int get(int id,int index)
{
if(id==0)
return -1;
if(block[id].size()>index)
return block[id][index];
else
get(next[id],index-block[id].size());
}
void insert(int id,int index,int value)
{
if(id==0)
return ;
if(index<=block[id].size())
{
block[id].insert(block[id].begin()+index,value);
if(block[id].size()>maxlen)
split(id);
}
else
{
insert(next[id],index-block[id].size(),value);
}
}
void split(int id)
{
top++;
int siz=block[id].size()/2;
block[top].assign(block[id].begin() + siz,block[id].end());
block[id].resize(siz);
next[top]=next[id];
next[id]=top;
}
void print()
{
int p=1;
int flag=0;
while(p)
{
for(int x=0;x<block[p].size();x++)
{
if(x==0&&flag==0)
{
flag=1;
printf("%d",block[p][x]);
}
else
printf(" %d",block[p][x]);
}
p=next[p];
}
puts("");
}
}arr;
int main()
{
int n,pos,val;
while(~scanf("%d",&n))
{
arr.clear();
while(n--)
{
scanf("%d%d",&pos,&val);
arr.insert(1,pos,val);
}
arr.print();
}
return 0;
}