首页 > 代码库 > [HDOJ1754]I Hate It(分块)

[HDOJ1754]I Hate It(分块)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754

题意:老题了,现场赛总是有很多题,虽然想不到正解,但是服务器都比较劲,用分块暴力可能会过。分块这东西一直知道,但是从来没写过没练过,比较难的题用分块做的特点就是思路简单,但是代码比较复杂。

这题很简单。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int maxn = 200200;
 5 int n, m, sz;
 6 int a[maxn], b[maxn];
 7 char cmd[5];
 8 
 9 int query(int l, int r) {
10     int ret = a[l];
11     for(int i = l; i <= r;) {
12         if(i % sz == 0 && i + sz <= r) {
13             ret = max(ret, b[i/sz]);
14             i += sz;
15         }
16         else ret = max(ret, a[i++]);
17     }
18     return ret;
19 }
20 
21 void update(int pos, int val) {
22     a[pos] = val;
23     int l = pos / sz * sz, r = l + sz;
24     for(int i = l; i <= r; i++) b[i/sz] = max(b[i/sz], a[i]);
25 }
26 
27 int main() {
28     // freopen("in", "r", stdin);
29     int x, y;
30     while(~scanf("%d%d",&n,&m)) {
31         sz = (int)sqrt(n);
32         for(int i = 0; i < n; i++) {
33             scanf("%d", &a[i]);
34         }
35         memset(b, 0, sizeof(b));
36         for(int i = 0; i < n; i++) {
37             b[i/sz] = max(b[i/sz], a[i]);
38         }
39         while(m--) {
40             scanf("%s%d%d",cmd,&x,&y);
41             if(cmd[0] == Q) printf("%d\n", query(--x, --y));
42             else update(--x, y);
43         }
44     }
45     return 0;
46 }

 

[HDOJ1754]I Hate It(分块)