hdu1754 区间查询+点修改 分块模板
2016-01-27 23:21
218 查看
题意
就是有区间查询最大值,和点置数思路
题很裸,用线段树当然很简单~这里想练练分块。。其实是,因为用分块写了个别的题结果T了。。。不想让这段代码废了。。就找来这题水一水,测试一下分块写的对不对。。。以后就当个小模板吧。。。
实现
#include <bits/stdc++.h> using namespace std; const int maxn = 2e5 + 5; const int B = 447; //桶大小 int bucket[maxn / B + 3]; //从0开始存 int a[maxn]; int n,m; inline void init(){ memset(bucket,0,sizeof(bucket)); for (int i=0;i<n;i++){ int b = i / B; bucket[b] = max(a[i], bucket[b]); } } //[l, r) int query(int l,int r){ int tl = l, tr = r; int ret = 0; while (tl < tr && tl % B !=0){ ret = max(ret, a[tl]); tl++; } while (tl < tr && tr % B != 0){ tr--; ret = max(ret, a); } while (tl < tr){ int b = tl / B; ret = max(ret, bucket[b]); tl += B; } return ret; } void add(int i, int x){ int b = i / B; a[i] += x; bucket[b] = max(bucket[b], a[i]); } int main(){ while (cin>>n>>m){ for (int i=0;i<n;i++) { scanf("%d",&a[i]); } init(); for (int i=0;i<m;i++){ char tmp; int l,r; getchar(); tmp = getchar(); scanf("%d%d",&l,&r); if (tmp == 'Q'){ printf("%d\n",query(l-1,r)); } else{ add(l-1,r-a[l-1]); } } } return 0; } 相关文章推荐
- Android自定义属性格式
- oracle with as介绍
- 以Attention Model为例谈谈两种研究创新模式
- spring mvc 的jpa JpaRepository数据层 访问方式汇总
- spring AOP
- 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-06-激活函数
- 初次体验完美easy ui 1.4.4
- R语言 dplyr传递参数
- poj_2945 Find the Clones (Trie树 内存分配)
- 18.逻辑运算符
- Swipe JS – 移动WEB页面内容触摸滑动类库
- Java程序在命令行下编译运行打Jar包
- 一些C++库
- 数据库中多对多的关系设计
- 5.7 Components — Sending Actions From Components to Your Application
- java基础面试题
- 17.闭区间和半开区间
- 【Linux】xargs命令用法详解
- 屏幕适配
- qt 的一个bug