uva 12003 块状链表

先分块。对于查询,块内排好序二分,对于修改,直接暴力,注意需要维护原来的有序性,不断和块内相邻元素交换即可。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <cmath>
 6 using namespace std;
 7
 8 const int N = 300000;
 9 const int M = 650;
10 int a[N];
11 int b[M][M];
12 int n, m, u, ps, num;
13
14 void modify( int pos, int val )
15 {
16     int cur = pos / ps;
17     if ( cur < num - 1 )
18     {
19         int p = lower_bound( b[cur], b[cur] + ps, a[pos] ) - b[cur];
20         while ( p + 1 < ps && b[cur][p + 1] < val )
21         {
22             b[cur][p] = b[cur][p + 1];
23             p++;
24         }
25         while ( p - 1 >= 0 && b[cur][p - 1] > val )
26         {
27             b[cur][p] = b[cur][p - 1];
28             p--;
29         }
30         b[cur][p] = val;
31     }
32     a[pos] = val;
33 }
34
35 void update( int l, int r, int v, int p )
36 {
37     int cur = l / ps, ncur = r / ps, k = 0;
38     if ( cur != ncur )
39     {
40         for ( int i = cur + 1; i <= ncur - 1; i++ )
41         {
42             k += lower_bound( b[i], b[i] + ps, v ) - b[i];
43         }
44         for ( int i = l; i < ( cur + 1 ) * ps; i++ )
45         {
46             if ( a[i] < v ) k++;
47         }
48         for ( int i = ncur * ps; i <= r; i++ )
49         {
50             if ( a[i] < v ) k++;
51         }
52     }
53     else
54     {
55         for ( int i = l; i <= r; i++ )
56         {
57             if ( a[i] < v ) k++;
58         }
59     }
60     modify( p, u * 1ll * k / ( r - l + 1 ) );
61 }
62
63 int main ()
64 {
65     while ( scanf("%d%d%d", &n, &m, &u) != EOF )
66     {
67         ps = 600;
68         for ( int i = 0; i < n; i++ )
69         {
70             scanf("%d", &a[i]);
71             b[i / ps][i % ps] = a[i];
72         }
73         num = ( n + ps - 1 ) / ps;
74         for ( int i = 0; i < num - 1; i++ )
75         {
76             sort( b[i], b[i] + ps );
77         }
78         while ( m-- )
79         {
80             int l, r, v, p;
81             scanf("%d%d%d%d", &l, &r, &v, &p);
82             l--, r--, p--;
83             update( l, r, v, p );
84         }
85         for ( int i = 0; i < n; i++ )
86         {
87             printf("%d\n", a[i]);
88         }
89     }
90     return 0;
91 }
时间: 2024-08-04 01:47:39

uva 12003 块状链表的相关文章

uva 11988 块状链表

其实链表就可以搞定,不过分析一下感觉块链也可以过,就套模板试了一下,果然没有让我失望,看来我写的块链还是不错的,哈哈. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 6 const int M = 100001; 7 const int N = 500; 8 char text[M]; 9 char b[N][N]; 10 int sz[N]

uva 11990 块状链表

想了想树套树比较难写,于是块链试一下,2秒左右过了. 1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 #include <cmath> 6 using namespace std; 7 8 typedef long long ll; 9 const int INF = 9999999; 10 const int N =

uva 12003 Array Transformer (块状数组)

大白书上的393页. 一直在原数组上乱搞.其实要用另外一个数组记录块. 原数组是不能变的. 注意好原数组和块数组的关系,细心一点处理边界.还是不难的. #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #define maxn 300005 #define SIZE 600 using namespace std; int a[maxn]; int bl

【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

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

poj 2887 块状链表

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