分块算法:

分块就是对暴力方法的一种优化:                          _

假设我们总共的序列长度为n,然后我们把它切成√n 块,然后把每一块里的东西当成一个整体来看,
完整块:被操作区间完全覆盖的块
不完整块:操作区间不完全覆盖的块

在对区间的询问中,对于完整块我们就去找维护这个块的数组。比如我们要找[l,r]这个区间中所有数的和,那么我们再把这n个数分块之后肯定要找一个数组去记录一下每一块中所有数的和(如果按照暴力的方式肯定是从l到r遍历,而分块对暴力方法的优化就是在完整块上不需要去遍历)。

对于不完整块的询问,那就遍历这个不完整块就可以了

其实和线段树很相似,分块的实际代码比线段树要简单些!

复杂度:O( nsqrt( n ) ) + O( nsqrt( m ) )   (n是序列长度,m是查询区间次数

题目:

很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。



不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。

Input本题目包含多组测试,请处理到文件结束。

在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目。

学生ID编号分别从1编到N。

第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩。

接下来有M行。每一行有一个字符 C (只取'Q'或'U') ,和两个正整数A,B。

当C为'Q'的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。

当C为'U'的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。

Output对于每一次询问操作,在一行里面输出最高成绩。Sample Input

  1. 5 6
  2. 1 2 3 4 5
  3. Q 1 5
  4. U 3 6
  5. Q 3 4
  6. Q 4 5
  7. U 2 9
  8. Q 1 5

Sample Output

  1. 5
  2. 6
  3. 5
  4. 9

Hint

  1. Huge input,the C function scanf() will work better than cin

分析:

题意很清晰,按照对分块的理解我们就应该找一个数组去维护一下分块后每一块的区间最大值

具体分块看代码:

  1. 1 #include<stdio.h>
  2. 2 #include<string.h>
  3. 3 #include<iostream>
  4. 4 #include<algorithm>
  5. 5 #include<math.h>
  6. 6 using namespace std;
  7. 7 const int maxn=200005;
  8. 8 int n,m,a[maxn],block,num,l[maxn],r[maxn],maxx[maxn],belong[maxn];
  9. 9 //l数组决定分块后每一块区间的左端点,r数组决定分块后每一块区间的右端点
  10. 10 //belong数组决定这一个位置属于哪一个块
  11. 11 //maxx数组就是维护分块后区间最大值的
  12. 12 //num代表一共有多少块
  13. 13 void build()
  14. 14 {
  15. 15 block=sqrt(n);
  16. 16 num=n/block;
  17. 17 for(int i=1; i<=num; ++i)
  18. 18 {
  19. 19 l[i]=block*(i-1)+1;
  20. 20 r[i]=block*i;
  21. 21 }
  22. 22 r[num]=n;
  23. 23
  24. 24 for(int i=1; i<=num; ++i)
  25. 25 {
  26. 26 int ans=0;
  27. 27 for(int j=l[i]; j<=r[i]; ++j)
  28. 28 {
  29. 29 ans=max(ans,a[j]);
  30. 30 belong[j]=i;
  31. 31 }
  32. 32 maxx[i]=ans;
  33. 33 }
  34. 34 }
  35. 35 int query(int x,int y)
  36. 36 {
  37. 37 int ans=0;
  38. 38 if(belong[x]==belong[y])
  39. 39 {
  40. 40 for(int i=x; i<=y; ++i)
  41. 41 {
  42. 42 ans=max(ans,a[i]);
  43. 43 }
  44. 44 }
  45. 45 else
  46. 46 {
  47. 47 for(int i=x; i<=r[belong[x]]; i++) ans=max(ans,a[i]); //对于不完整块要遍历
  48. 48 for(int i=belong[x]+1; i<belong[y]; i++) //完整块直接访问维护数组maxx就完了
  49. 49 ans=max(ans,maxx[i]);
  50. 50 for(int i=l[belong[y]]; i<=y; i++) ans=max(ans,a[i]); //对于不完整块要遍历
  51. 51 }
  52. 52 return ans;
  53. 53 }
  54. 54 void update(int x,int y)
  55. 55 {
  56. 56 maxx[belong[x]]=max(maxx[belong[x]],y);
  57. 57 a[x]=y; //更新的时候维护最大值数组要更新且原位置也要更新
  58. 58 }
  59. 59 int main()
  60. 60 {
  61. 61 int x,y;
  62. 62 char ch[5];
  63. 63 while(~scanf("%d%d",&n,&m))
  64. 64 {
  65. 65 for(int i=1;i<=n;++i) scanf("%d",&a[i]);
  66. 66 build();
  67. 67 while(m--)
  68. 68 {
  69. 69 scanf("%s%d%d",ch,&x,&y);
  70. 70 if(ch[0]=='Q')
  71. 71 {
  72. 72 printf("%d\n",query(x,y));
  73. 73 }
  74. 74 else
  75. 75 {
  76. 76 update(x,y);
  77. 77 }
  78. 78 }
  79. 79 }
  80. 80 return 0;
  81. 81 }

分块 && 例题 I Hate It HDU - 1754的更多相关文章

  1. hdu 1754 Ihate it

    I Hate It Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit St ...

  2. hdu 1754 I Hate It (splay tree伸展树)

    hdu 1754 I Hate It 其实我只是来存一下我的splay模板的..请大牛们多多指教 #include<stdio.h> #include<string.h> #i ...

  3. hdu 1754 线段树(Max+单点修改)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  4. hdu 1754 I Hate It (线段树功能:单点更新和区间最值)

    版权声明:本文为博主原创文章.未经博主同意不得转载.vasttian https://blog.csdn.net/u012860063/article/details/32982923 转载请注明出处 ...

  5. HDOJ(HDU).1754 I Hate It (ST 单点替换 区间最大值)

    HDOJ(HDU).1754 I Hate It (ST 单点替换 区间最大值) 点我挑战题目 题意分析 从题目中可以看出是大数据的输入,和大量询问.基本操作有: 1.Q(i,j)代表求区间max(a ...

  6. HDU 1754——I Hate It——————【线段树单点替换、区间求最大值】

    I Hate It Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit St ...

  7. 线段树(单点更新) HDU 1754 I Hate It

    题目传送门 /* 线段树基本功能:区间最大值,修改某个值 */ #include <cstdio> #include <cstring> #include <algori ...

  8. hdu 1754 I Hate It 线段树 点改动

    // hdu 1754 I Hate It 线段树 点改动 // // 不多说,裸的点改动 // // 继续练 #include <algorithm> #include <bits ...

  9. hdu 1754 I Hate It (模板线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=1754 I Hate It Time Limit: 9000/3000 MS (Java/Others)    M ...

随机推荐

  1. 断言封装整合到requests封装中应用(纠错False,Result循环,tag测试)

    检查json_key_value: 检查: requests.py # -*- coding: utf-8 -*-#@File :demo_04.py#@Auth : wwd#@Time : 2020 ...

  2. 【Linux】iptables的内核模块问题大坑!

    系统环境 CentOS 6.5 今天本来可以平静的度过一天,正品味着下午茶的美好,突然接到防火墙iptables的报警. 进入到服务器中,执行下面的命令查看,结果报错 /etc/init.d/ipta ...

  3. ALV中的fieldcat详解

    字段目录是用来控制ALV显示的网格中每个字段的属性的,比如字段的顺序,对齐方式,可编辑状态,颜色,等等.常用的字段如下: Row_pos:    默认值为0,可选值为1.2.3,既最大分3级别显示 c ...

  4. 02--Docker配置阿里云镜像加速器

    1.登录阿里云控制台,在产品与服务中收索 "容器镜像服务" 2.点击镜像加速器,CentOS 3.在路径 /etc/docker/daemon.json 下配置加速器地址 4.重新 ...

  5. STL_list容器

    一.List简介 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. 链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每 ...

  6. Tensorflow-线性回归与手写数字分类

    线性回归 步骤 构造线性回归数据 定义输入层 设计神经网络中间层 定义神经网络输出层 计算二次代价函数,构建梯度下降 进行训练,获取预测值 画图展示 代码 import tensorflow as t ...

  7. pytest:通过scope控制fixture的作用范围

    一.fixture里面有个参数scope,通过scope可以控制fixture的作用范围,根据作用范围大小划分:session>module>class>function,具体作用范 ...

  8. 华为路由配置IPSec

    用该方法配置后用抓包工具抓取的就看不到两个通讯点的IP,而显示的是加密点的IP. 原文:https://www.cnblogs.com/yangyang1988/p/11559819.html

  9. 如何将python中pip源设置为国内源

    1.Windows Python的学习过程中,往往会学习到很多库,而安装各类库的时候,往往不尽人意,下载速度从几KB到十几KB.甚至下载到一半还超时报错.这都是因为pip源是访问国外的官方源,如果需要 ...

  10. tcpdump安装与参数详解

    Centos7安装Tcpdump 对于大部分的Linux操作系统,已经默认安装了tcpdump,可以通过以下命令查看: [root@localhost local]# tcpdump --versio ...