poj 2828 块状链表

这个题是真正可以体现出块状链表的优点。数组定位快但是插入慢,而链表插入快却定位慢。块状链表正是结合了数组和链表的优点将定位和插入的复杂度变成了sqrt(n)。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5
 6 const int N = 750;
 7 int b[N][N];
 8 int sz[N];
 9 int next[N];
10 int ps;
11 int bl;
12
13 void init()
14 {
15     bl = 1;
16     ps = 550;
17     memset( sz, 0, sizeof(sz) );
18     memset( next, -1, sizeof(next) );
19 }
20
21 void spilt( int cur )
22 {
23     int tmp = next[cur];
24     int ncur = next[cur] = bl++;
25     next[ncur] = tmp;
26     for ( int i = sz[cur] / 2; i < sz[cur]; i++ )
27     {
28         b[ncur][sz[ncur]++] = b[cur][i];
29     }
30     sz[cur] = sz[cur] / 2;
31 }
32
33 void insert( int pos, int val )
34 {
35     int cur = 0, p = sz[cur];
36     while ( p < pos + 1 && next[cur] != -1 )
37     {
38         cur = next[cur];
39         p += sz[cur];
40     }
41     if ( p < pos + 1 )
42     {
43         b[cur][sz[cur]++] = val;
44     }
45     else
46     {
47         p -= sz[cur];
48         pos -= p;
49         for ( int j = sz[cur] - 1; j >= pos; j-- )
50         {
51             b[cur][j + 1] = b[cur][j];
52         }
53         b[cur][pos] = val;
54         sz[cur]++;
55     }
56     if ( sz[cur] > ps ) spilt(cur);
57 }
58
59 int main ()
60 {
61     int n;
62     while ( scanf("%d", &n) != EOF )
63     {
64         init();
65         for ( int i = 0; i < n; i++ )
66         {
67             int pos, val;
68             scanf("%d%d", &pos, &val);
69             insert( pos, val );
70         }
71         int cnt = 0;
72         for ( int i = 0; i != -1; i = next[i] )
73         {
74             for ( int j = 0; j < sz[i]; j++ )
75             {
76                 printf("%d", b[i][j]);
77                 cnt++;
78                 if ( cnt != n )
79                 {
80                     putchar(‘ ‘);
81                 }
82                 else
83                 {
84                     putchar(‘\n‘);
85                 }
86             }
87         }
88     }
89     return 0;
90 }
时间: 2024-10-20 05:28:41

poj 2828 块状链表的相关文章

poj 2887 块状链表

块状链表第一题,懒得写成链表形式的,所以写成了静态链表. 思想还是很简单的,就是进行分块查找和插入,和建立索引有点像,复杂度是根号的,实现起来比较容易,由于这个题插入操作不多,所以没有写split函数, 因为没有删除操作,所以也没有写union函数,随后有空再补上吧. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cmath> 5 using namesp

poj 3468 块状链表 区间修改+区间查询

经典的线段树题目,也可以用块链来做. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cmath> 5 using namespace std; 6 7 typedef __int64 ll; 8 const ll M = 400; 9 ll b[M][M]; 10 ll add[M]; 11 ll sum[M]; 12 ll n, m, ps; 13 14

【POJ2887】【块状链表】Big String

Description You are given a string and supposed to do some string manipulations. Input The first line of the input contains the initial string. You can assume that it is non-empty and its length does not exceed 1,000,000. The second line contains the

【BZOJ2741】【块状链表+可持久化trie】FOTILE模拟赛L

Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj),其中l<=i<=j<=r. 为了体现在线操作,对于一个询问(x,y): l = min ( ((x+lastans) mod N)+1 , ((y+lastans) mod N)+1 ).r = max ( ((x+lastans) mod N)+1 , ((y+last

poj 2828 Buy Tickets 【线段树点更新】

题目:poj 2828 Buy Tickets 题意:有n个人排队,每个人有一个价值和要插的位置,然后当要插的位置上有人时所有的人向后移动一位当这个插入到这儿,如果没有直接插进去. 分析:分析发现直接插入移动的话花时间太多,我们可不可以用逆向思维.从后往前来,因为最后一个位置是肯定能确定的,而其他的则插入空的第某个位置. 比如第一组样例: 4 0 77 1 51 1 33 2 69 开始时候位置都为空 编号0 1 2 3 首先从最后一个来2 69 第二个位置空,则可以直接放 然后编号变为0 1

poj 2828 Buy Tickets

Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 13277   Accepted: 6595 Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get up early and join a long queue- The Lunar New Year wa

c++之路进阶——块状链表(弹飞绵羊)

2333 弹飞绵羊 2010年省队选拔赛湖南 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Description Lostmonkey发明了一种超级反弹装置.为了在绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿一条直线摆放 n个反弹装置,并按从前往后的方式将反弹装置依次编号为 0 到 n-1,对 0≤i≤n-1,为第 i 个反弹装置设定了初始弹力系数 ki,当绵羊落到第 i 个反弹装置上时,它将被往后

c++之路——块状链表(教主的魔法)

F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser  gryz2016 Logout 捐赠本站 Notice:由于本OJ建立在Linux平台下,而许多题的数据在Windows下制作,请注意输入.输出语句及数据类型及范围,避免无谓的RE出现. 3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 711  Solved: 309[Submit][Stat

POJ 2828 Buy Tickets (线段树)

题目大意: 排队有人插队,每一次都插到第 i 个人的后面. 最后输出顺序. 思路分析: 你会发现,如果反向处理的话,你就知道这个人是第几个了. 那么问题一下子就简化了. 就是在线段树上找第几个空位置就行了. #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <vector> #define lson num<<1