http://acm.uestc.edu.cn/#/problem/show/1324

题意:……

思路:卿学姐的学习分块例题。

分块是在线处理区间问题的类暴力算法,复杂度O(n*sqrt(n)),把给出的n个点的信息分成sqrt(n)个块,每个块有sqrt(n)个元素,然后去处理操作。

从块的左边扫到块的右边复杂度最多是O(sqrt(n)),然后扫过所有的块复杂度最多是O(sqrt(n))。

(画的好丑= =)

这个图一个一个区间代表一个块。比如这里我们要处理[L,R]的问题,那么从L扫到属于L的块的右边界复杂度最多O(sqrt(n)),从不属于L的块扫到不属于R的块最多sqrt(n)个块,因此复杂度最多O(sqrt(n)),再从属于R的块的左边界扫到R,复杂度也是最多O(sqrt(n)),因此,总的复杂度是O(sqrt(n))。

很美妙的处理啊。

 #include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 100010
typedef long long LL; int sz, num, l[N], r[N], belong[N], n;
LL a[N], block[N]; void Build() {
sz = sqrt(n); // 每个块的大小
num = n / sz; if(n % sz) num++; // 块的数量,如果n有剩余,那么要分多一个块
for(int i = ; i <= num; i++)
l[i] = (i - ) * sz + , r[i] = i * sz; // 每个块在数组的[l, r]区间,即块的管辖范围
r[num] = n;
for(int i = ; i <= n; i++)
belong[i] = (i - ) / sz + ; // 第i个元素属于第belong[i]个块
} void Update(int id, int w) {
a[id] += w;
block[belong[id]] = max(block[belong[id]], a[id]);
} LL Query(int L, int R) {
LL ans = ;
if(belong[L] == belong[R]) // 如果属于同一个块,暴力扫,复杂度最大sqrt(n)
for(int i = L; i <= R; i++) ans = max(ans, a[i]);
else { // 如果不属于同一个块
for(int i = L; i <= r[belong[L]]; i++) ans = max(ans, a[i]); // 暴力把左边扫到左边的块的右边界
for(int i = belong[L] + ; i <= belong[R] - ; i++) ans = max(ans, block[i]); // 暴力扫不属于左边和右边的块
for(int i = l[belong[R]]; i <= R; i++) ans = max(ans, a[i]); // 暴力从属于右边的快的左边界扫到右边
}
return ans;
} int main() {
int q;
while(~scanf("%d%d", &n, &q)) {
memset(block, , sizeof(block));
memset(a, , sizeof(a));
Build();
while(q--) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
if(a == ) Update(b, c);
else printf("%lld\n", Query(b, c));
}
}
return ;
}

最新文章

  1. php实现设计模式之 策略模式
  2. jQuery 2.0.3 源码分析Sizzle引擎 - 解析原理
  3. Coursera Machine Learning : Regression 简单回归
  4. BurpSuite抓App数据包的方法
  5. printf打印
  6. Mongodb集群配置(sharding with replica set)
  7. 已解决】Sublime中运行带input或raw_input的Python代码出错:EOFError: EOF when reading a line(转)
  8. JAVASCRIPT的一些知识点梳理
  9. Oracle Create DBLink
  10. On Memory Leaks in Java and in Android.
  11. virtualenv创建虚拟环境
  12. HDOJ 1384 差分约束
  13. 创建简单的响应式HTML5模版
  14. FreeRTOS初步认识
  15. XML文档读取-DOM4j
  16. C#保留2位小数的做法
  17. Java CAS 原理分析
  18. 1#Two Sum(qsort用法)
  19. R12.2常用手册
  20. 账户和联系人 Accounts and Contacts 译

热门文章

  1. 在Docker中创建Mongo容器的后续设置
  2. XF 导航页面
  3. jquery表单过滤器
  4. Android之运行时相机权限和联系人权限获取
  5. VS生成Cordova for Android应用之Gradle
  6. android adb socket 通信
  7. 创建dll动态链接库,并使用java调用
  8. Android零基础入门第69节:ViewPager快速实现引导页
  9. CDC-更改数据捕获存储过程 (Transact-SQL)-学习
  10. Windows下获取逻辑cpu数量和cpu核数量