[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 }