分块算法:

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

假设我们总共的序列长度为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

5 6
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 2 9
Q 1 5

Sample Output

5
6
5
9

Hint

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

分析:

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

具体分块看代码:

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

    前言 好东西要分享,之前一直在使用wkhtmltopdf进行pdf文件的生成,常用的方式就是先安装wkhtmltopdf,然后在程序中用命令的方式将对应的html生成pdf文件,简单而且方便:但重复的 ...

  2. Core3.1 微信v3 JSAPI支付

    1.前言 "小魏呀,这个微信支付还要多久?","快了快了老板,就等着最后一步了...","搞快点哈,就等着上线呢","...... ...

  3. 【高并发】ReadWriteLock怎么和缓存扯上关系了?!

    写在前面 在实际工作中,有一种非常普遍的并发场景:那就是读多写少的场景.在这种场景下,为了优化程序的性能,我们经常使用缓存来提高应用的访问性能.因为缓存非常适合使用在读多写少的场景中.而在并发场景中, ...

  4. 5V充12.6V三节锂电池,5V升压12.6V的电路图

    三串锂电池的充电电压是三串锂电池的最高电压值,就是12.6V了.5V充12.6V是5V给三串锂电池充电.如笔记本的USB口5V给三串锂电池充电,如5V的适配器或者手机充电器插上数据线给三串锂电池充电电 ...

  5. 关于Mysql数据库建库字符集utf8mb4下,排序规则utf8mb4_bin和utf8mb4_general_ci选择造成的查询匹配大小写问题

    场景描述: 项目采用了分库模式进行不同业务的开发,在共有的功能模块进行设计的时候采用主从库,或者各分库之中存在同样的库表结构,在使用过程中做库表同步的时候一定要保证库表所在的数据库的字符集和编码格式是 ...

  6. 彻底解决小程序无法触发SESSION问题

    一.首先找到第一次发起网络请求的地址,将服务器返回set-cookie当全局变量存储起来 wx.request({ ...... success: function(res) { console.lo ...

  7. 使用 tke-autoscaling-placeholder 实现秒级弹性伸缩

    背景 当 TKE 集群配置了节点池并启用了弹性伸缩,在节点资源不够时可以触发节点的自动扩容 (自动买机器并加入集群),但这个扩容流程需要一定的时间才能完成,在一些流量突高的场景,这个扩容速度可能会显得 ...

  8. 盼望着,盼望着。它终于来了!!!剪辑Windows PC测试版!

    盼望着,盼望着.它终于来了!!!剪辑Windows PC测试版! 喜欢短视频抖音的小伙伴们,是不是都对手机抖音剪映操作不是很满意.期待WINDOWS电脑版剪映的来临.在此之前只有MAC版本,不能满足广 ...

  9. HTTPS学习(一):准备知识

    div.example { background-color: rgba(229, 236, 243, 1); color: rgba(0, 0, 0, 1); padding: 0.5em; mar ...

  10. 【Coredump】调试之旅

    测试反馈,core了. 拿到环境,发现6和11,一个是重复释放,一个是非法指针. 用GDB一挂 ,发现 1 GNU gdb (GDB) 7.5 2 Copyright (C) 2012 Free So ...