块状链表(acm暑期培训)

题目链接: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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值