hdu 5057 块状链表

没有插入和删除操作...

所以还是很好写的,分块暴力就好了。

  1 #include <iostream>
  2 #include <cstring>
  3 #include <cstdio>
  4 #include <cmath>
  5 using namespace std;
  6
  7 const int N = 400;
  8 const int M = 11;
  9 int b[N * N];
 10 int cnt[N][M][M];
 11 int w[M];
 12 int h[M];
 13 int n, m, ps;
 14
 15 void init()
 16 {
 17     w[0] = 1;
 18     for ( int i = 1; i < M - 1; i++ )
 19     {
 20         w[i] = w[i - 1] * 10;
 21     }
 22 }
 23
 24 int judge( int val, int d, int p )
 25 {
 26     if ( val / w[d - 1] % 10 == p ) return 1;
 27     return 0;
 28 }
 29
 30 void update( int cur, int val, int f )
 31 {
 32     for ( int i = 1; i < M; i++ )
 33     {
 34         h[i] = val % 10;
 35         val = val / 10;
 36     }
 37     for ( int i = 1; i < M; i++ )
 38     {
 39         cnt[cur][i][h[i]] += f;
 40     }
 41 }
 42
 43 void modify( int pos, int val )
 44 {
 45     int cur = pos / ps;
 46     update( cur, b[pos], -1 );
 47     b[pos] = val;
 48     update( cur, b[pos], 1 );
 49 }
 50
 51 int query( int l, int r, int d, int p )
 52 {
 53     int cur = l / ps, ncur = r / ps;
 54     int ans = 0;
 55     for ( int i = cur + 1; i <= ncur - 1; i++ )
 56     {
 57         ans += cnt[i][d][p];
 58     }
 59     if ( cur != ncur )
 60     {
 61         cur = ( cur + 1 ) * ps;
 62         for ( int j = l; j < cur; j++ )
 63         {
 64             ans += judge( b[j], d, p );
 65         }
 66         ncur = ncur * ps;
 67         for ( int j = ncur; j <= r; j++ )
 68         {
 69             ans += judge( b[j], d, p );
 70         }
 71     }
 72     else
 73     {
 74         for ( int j = l; j <= r; j++ )
 75         {
 76             ans += judge( b[j], d, p );
 77         }
 78     }
 79     return ans;
 80 }
 81
 82 int main ()
 83 {
 84     init();
 85     int t;
 86     scanf("%d", &t);
 87     while ( t-- )
 88     {
 89         scanf("%d%d", &n, &m);
 90         ps = 350;
 91         memset( cnt, 0, sizeof(cnt) );
 92         for ( int i = 0; i < n; i++ )
 93         {
 94             scanf("%d", b + i);
 95             update( i / ps, b[i], 1 );
 96         }
 97         while ( m-- )
 98         {
 99             char op[2];
100             scanf("%s", op);
101             if ( op[0] == ‘S‘ )
102             {
103                 int x, y;
104                 scanf("%d%d", &x, &y);
105                 x--;
106                 modify( x, y );
107             }
108             else
109             {
110                 int l, r, d, p;
111                 scanf("%d%d%d%d", &l, &r, &d, &p);
112                 l--;
113                 r--;
114                 printf("%d\n", query( l, r, d, p ));
115             }
116         }
117     }
118     return 0;
119 }
时间: 2024-08-29 19:34:39

hdu 5057 块状链表的相关文章

hdu 1754 块状链表 单点修改+单点查询

经典的线段树题目,也可以用块状链表做. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cmath> 5 using namespace std; 6 7 const int N = 200000; 8 const int M = 800; 9 int n, m, tot; 10 11 int max( int a, int b ) 12 { 13 retu

hdu 4391 块状链表区间操作lazy技巧

块状链表太强大了,也可以实现和线段树一样的lazy操作来提高效率. 每个块维护自己块的信息. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cmath> 5 #include <map> 6 using namespace std; 7 8 const int M = 400; 9 int b[M][M]; 10 int n, m, ps; 1

【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

【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

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 2887 块状链表

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

【BZOJ1500】【块状链表】SuperMemo

Description Input 输入文件的第1行包含两个数N和M,N表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一条命令,格式参见问题描述中的表格. Output 对于输入数据中的GET-SUM和MAX-SUM操作,向输出文件依次打印结果,每个答案(数字)占一行. Sample Input 9 8 2 -6 3 5 1 -5 -3 6 3 GET-SUM 5 4 MAX-SUM INSERT 8 3 -5 7 2 DELETE 12

【块状链表】AutSky_JadeK的块状链表模板+总结(STL版)

Part 1.块状链表.   定位 插入 删除 数组 O(1) O(n) O(n) 链表 O(n) O(1) O(1) 对于线性表的以上常见操作来说,数组和链表都无法有效地解决.但是,若我们将链表的每个节点存成一个数组,使得链表里每个节点的数据拼接起来就是原先的线性表中的内容(即块状链表),并且数组的大小合适的话,以上的操作都能比较好地解决了.根据均值不等式,若每个块的大小定为sqrt(n)左右最优,此时块数也是sqrt(n)左右,易证.以下是块状链表的基础操作的思想.复杂度和代码. 一.声明.