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 ;
}

UESTC 1324:卿学姐与公主(分块)的更多相关文章

  1. UESTC 1324 卿学姐与公主 分块板子

    #include<iostream> #include<cmath> using namespace std; ; //表示当前数在哪一块里面 int belong[maxn] ...

  2. UESTC - 1324 卿学姐与公主

    题目链接 某日,百无聊赖的卿学姐打开了某11区的某魔幻游戏 在这个魔幻的游戏里,生活着一个美丽的公主,但现在公主被关押在了魔王的城堡中. 英勇的卿学姐拔出利刃冲向了拯救公主的道路. 走过了荒野,翻越了 ...

  3. CDOJ 1324 卿学姐与公主 分块

    题目地址 分块模板 #include<cstdio> #include<algorithm> #include<math.h> using namespace st ...

  4. CDOJ 1324 卿学姐与公主(分块)

    CDOJ 1324 卿学姐与公主(分块) 传送门: UESTC Online Judgehttp://acm.uestc.edu.cn/#/problem/show/1324 某日,百无聊赖的卿学姐打 ...

  5. cdoj 1324 卿学姐与公主 线段树裸题

    卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit St ...

  6. cdoj1324卿学姐与公主

    地址:http://acm.uestc.edu.cn/#/problem/show/1324 卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memo ...

  7. A - 卿学姐与公主(线段树+单点更新+区间极值)

    A - 卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  8. 卿学姐与公主 UESTC - 1324 分块模板题

    题意:http://acm.uestc.edu.cn/#/problem/show/1324 中文题,自己看喽. 题解:分块模板,update时顺便更新块属性.ask时先判掉belong[l]==be ...

  9. CDOJ 1292 卿学姐种花 暴力 分块 线段树

    卿学姐种花 题目连接: http://acm.uestc.edu.cn/#/problem/show/1292 Description 众所周知,在喵哈哈村,有一个温柔善良的卿学姐. 卿学姐喜欢和她一 ...

随机推荐

  1. Android 动画具体解释Frame动画 (Drawable Animation)

    Frame动画像gif画画,通过一些静态的图片,以实现动画效果. Android sdk该AnimationDrawable就是专门针对Frame动画,当然Frame动画也可在java代码或者xml中 ...

  2. PostgreSQL9.3:JSON 功能增强 根据PQ中文论坛francs 给出的东西结合自己的摸索总结下

     在 PostgreSQL 9.2 版本中已经支持 JSON 类型,不过支持的操作非常有限,仅支持以下函数   array_to_json(anyarray [, pretty_bool]) row_ ...

  3. 在IOS开发中使用GoogleMaps SDK

    一.申请一个免费的API KEY要使用GoogleMaps SDK,必须要为你的应用申请一个API KEY,API Key可以让你监视你的应用调用api的情况.api key是免费的,你可以在任何调用 ...

  4. wpf窗体定位

    原文:wpf窗体定位 据WPF外包小编了解,通常,不需要在屏幕上明确定位窗口.而是简单地将WindowState属性设置为Normal,并忽略其他所有细节.另一方面,很少会将WindowStartup ...

  5. WPF 数据模板DataType属性的使用,不用指定ItemTemplate

    <Window x:Class="CollectionBinding.MainWindow"        xmlns="http://schemas.micros ...

  6. C++中构造函数能调用虚函数吗?(答案是语法可以,输出错误),但Java里居然可以

    环境:XPSP3 VS2005 今天黑总给应聘者出了一个在C++的构造函数中调用虚函数的问题,具体的题目要比标题复杂,大体情况可以看如下的代码: class Base { public: Base() ...

  7. 16.09 working note

    这个月最主要任务是linux shell script学习. 其次是继续spring源码学习. 其余时间C.C++和Java学习. 01 9月第一天,9点多才到家.做道简单的oj题练习下.因为简单,所 ...

  8. 使用 GNU autotools 改造一个软件项目

    使用 GNU autotools 改造一个软件项目 及永刚 jungle@soforge.com 2006 年 3 月 24 日  版本:0.3 本文不是一篇规范的教程,而是用一个软件项目作为例子,演 ...

  9. 《解读window核心编程》 之 进程

    1.         进程是执行文件的运行时形态.包括两部分:内核数据(对应内核对象).地址空间(包括执行文件代码和栈堆等动态内存). 2.         把VC的“系统-子系统”值删除掉,即不指定 ...

  10. windows-qt 使用mingw编译c++boost并使用

    一.boost是一个准标准库,相当于STL的延续和扩充,它的设计理念和STL比较接近,都是利用泛型让复用达到最大化.不过对比STL,boost更加实用.STL集中在算法部分,而boost包含了不少工具 ...