1. 程式人生 > >[HDOJ1754]I Hate It(分塊)

[HDOJ1754]I Hate It(分塊)

using cnblogs names eof sca 鏈接 include ons code

題目鏈接: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(分塊)