hdoj 1754 I hate it

http://acm.hdu.edu.cn/showproblem.php?pid=1754 题意:给定一个区间,有m组操作,操作可以是改变单点,或者查询区间最大值。对于每组查询,输出。 思路:分块。这篇博客说得很不错。http://www.cnblogs.com/sweetsc/archive/2012/08/15/2639395.html

  1/* ***********************************************
  2Author :111qqz
  3Created Time :2015年12月15日 星期二 11时25分17秒
  4File Name :code/hdu/1754.cpp
  5************************************************ */
  6
  7#include <cstdio>
  8#include <cstring>
  9#include <iostream>
 10#include <algorithm>
 11#include <vector>
 12#include <queue>
 13#include <set>
 14#include <map>
 15#include <string>
 16#include <cmath>
 17#include <cstdlib>
 18#include <ctime>
 19#define fst first
 20#define sec second
 21#define lson l,m,rt<<1
 22#define rson m+1,r,rt<<1|1
 23#define ms(a,x) memset(a,x,sizeof(a))
 24typedef long long LL;
 25#define pi pair < int ,int >
 26#define MP make_pair
 27
 28using namespace std;
 29const double eps = 1E-8;
 30const int dx4[4]={1,0,0,-1};
 31const int dy4[4]={0,-1,1,0};
 32const int inf = 0x3f3f3f3f;
 33const int N=2E5+7;
 34int a[N];
 35int mx[N];
 36int n ,m;
 37int magic;
 38
 39void pre()
 40{
 41    magic = int(sqrt(n));
 42    ms(mx,-1); //把i%magic去掉试试。
 43    for ( int i = 0 ; i <n ; i++ )  //从0开始比较方便。
 44    {
 45//	if (a[i]>mx[i/magic])
 46//	    mx[i/magic] = a[i];
 47	mx[i/magic] = max(mx[i/magic],a[i]);
 48    }
 49
 50}
 51
 52int query( int l,int r)
 53{
 54    int ret = a[l];
 55    for ( int j = l ; j <= r;)
 56    {
 57	if (j%magic==0&&j+magic-1<=r)
 58	{
 59	    ret = max(ret,mx[j/magic]);
 60	 //   if (mx[j/magic]>ret) ret= mx[j/magic];
 61	    j+= magic;
 62	}
 63	else  //首尾两段不够magic的部分直接暴力
 64	{
 65	    ret = max(a[j],ret);
 66	    //if (a[j]>ret) ret = a[j];
 67	    j++;
 68	}
 69    }
 70    return ret;
 71}
 72
 73void update( int x,int delta)
 74{
 75    a[x] = delta;
 76    int l = x/magic*magic;
 77    int r = l+magic;  //找到x对应的哪个块。
 78    for ( int i = l ; i < r ; i++)
 79    {
 80	//	if (i%magic==0||a[i]>mx[i/magic]) mx[i/magic] = a[i];
 81	    mx[i/magic] = max(mx[i/magic],a[i]);
 82    }
 83}
 84
 85int main()
 86{
 87	#ifndef  ONLINE_JUDGE 
 88	freopen("code/in.txt","r",stdin);
 89  #endif
 90
 91	while (scanf("%d%d",&n,&m)!=EOF)
 92	{
 93//	    ms(a,0);
 94//	    ms(mx,0);
 95	    for ( int i = 0 ; i < n ; i++) scanf("%d",&a[i]);
 96	    getchar();
 97	    pre();
 98	    while (m--)
 99	    {
100		char opt;
101		scanf("%c ",&opt);
102		if (opt=='Q')
103		{
104		    int l,r;
105		    scanf("%d%d",&l,&r);
106		    getchar();
107		    printf("%d\n",query(l-1,r-1));
108		}
109		else
110		{
111		    int x,delta;
112		    scanf("%d%d",&x,&delta);
113		    getchar(); //又忘记读掉回车符了.....
114		    update(x-1,delta);
115		}
116	    }
117
118	}
119
120  #ifndef ONLINE_JUDGE  
121  fclose(stdin);
122  #endif
123    return 0;
124}