由不勤劳的图书管理员带入了分块的坑,深深地被其暴力与优雅所征服。分块的实质就是将暴力块状封装起来,一整块的部分就一整块处理,零碎的部分就怎么暴力怎么来。因为分块大小的原因,限制了零碎部分数据的数量级,所以复杂度得以保证。

1.教主的魔法:可以算得上是一个分块的板子题。对于每一个块内sort排序,保存id值。对于修改,块内的找到点暴力修改之后重新排序,一整个块的不改变相对大小关系,所以直接外部记录累加的值。查询也一样,块外暴力,块内二分查找。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define maxn 2000000
#define maxb 1050
int n, q, B, sum[maxb], a[maxn], cnt[maxb];
struct node
{
int v, id;
}c[maxb][maxb]; int read()
{
int x = ;
char c;
c = getchar();
while(c < '' || c > '') c = getchar();
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x;
} bool cmp(node a, node b)
{
return a. v < b.v;
} void Vio_C(int b, int x, int w)
{
c[b][x].v += w;
} void Change(int L, int R, int W)
{
int a = L / B, b = R / B;
if(a == b)
{
for(int i = ; i <= cnt[a]; i ++)
if(c[a][i].id >= L && c[a][i].id <= R) Vio_C(a, i, W);
sort(c[a] + , c[a] + cnt[a] + , cmp);
     return 0;
}
for(int i = ; i <= cnt[a]; i ++)
if(c[a][i].id >= L) Vio_C(a, i, W);
sort(c[a] + , c[a] + cnt[a] + , cmp);
for(int i = ; i <= cnt[b]; i ++)
if(c[b][i].id <= R) Vio_C(b, i, W);
sort(c[b] + , c[b] + cnt[b] + , cmp);
for(int i = a + ; i < b; i ++)
sum[i] += W;
} int check(int b, int C)
{
C -= sum[b];
int ans = cnt[b] + , l = , r = cnt[b];
while(l <= r)
{
int mid = (l + r) >> ;
if(c[b][mid].v >= C) ans = mid, r = mid - ;
else l = mid + ;
}
return cnt[b] - ans + ;
} void Query(int L, int R, int C)
{
int a = L / B, b = R / B;
int ans = ;
if(a == b)
{
C -= sum[a];
for(int i = ; i <= cnt[a]; i ++)
if(c[a][i].id >= L && c[a][i].id <= R && c[a][i].v >= C) ans ++;
printf("%lld\n", ans);
return;
}
for(int i = ; i <= cnt[a]; i ++)
if(c[a][i].id >= L && c[a][i].v + sum[a] >= C) ans ++;
for(int i = ; i <= cnt[b]; i ++)
if(c[b][i].id <= R && c[b][i].v + sum[b] >= C) ans ++;
for(int i = a + ; i < b; i ++)
ans += check(i, C);
printf("%lld\n", ans);
return;
} signed main()
{
n = read(), q = read();
B = sqrt(n);
for(int i = ; i <= n; i ++)
{
a[i] = read(); int block = i / B;
c[block][++ cnt[block]].v = a[i];
c[block][cnt[block]].id = i;
if(((i / B) != (i + ) / B) || i == n)
sort(c[block] + , c[block] + cnt[block] + , cmp);
}
for(int i = ; i <= q; i ++)
{
char c; cin >> c;
int L = read(), R = read(), W = read();
if(c == 'M') Change(L, R, W);
else Query(L, R, W);
}
return ;
}

2.不勤劳的图书管理员

这题首先注意到交换a,b的位置,只会影响到a,b之间的数。在一段区间里,a对杂乱值的贡献是多少?不难发现=在a之前且应当在a之后的书本杂乱值之和+v[a]*前面书本的个数。所以我们对每一个块使用两个树状数组,一个纪录个数,一个记录页数的前缀和,块内的利用树状数组快速查询,块外的暴力枚举计算即可。

因为此题代码是Kuai的(那个时候还不会写分块),所以就不贴代码啦。

【算法】分块——教主的魔法&不勤劳的图书管理员的更多相关文章

  1. 【bzoj4889】: [Tjoi2017]不勤劳的图书管理员 分块-BIT

    [bzoj4889]: [Tjoi2017]不勤劳的图书管理员 题目大意:给定一个序列(n<=50000),每个数有一个编码ai(ai<=50000)和权值vi(vi<=100000 ...

  2. 【BZOJ4889】[Tjoi2017]不勤劳的图书管理员 分块+树状数组

    [BZOJ4889][Tjoi2017]不勤劳的图书管理员 题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让 ...

  3. 【loj2639】[Tjoi2017]不勤劳的图书管理员

    #2639. 「TJOI2017」不勤劳的图书管理员 题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产 ...

  4. 【BZOJ4889】不勤劳的图书管理员(树套树)

    [BZOJ4889]不勤劳的图书管理员(树套树) 题面 又是权限题,烦死了 洛谷真好 题解 分开考虑每一次交换产生的贡献. 假设交换\((x,y)\) 检查\(x\)与\(y\)对于区间\([x+1, ...

  5. 洛谷P3759 - [TJOI2017]不勤劳的图书管理员

    Portal Description 给出一个\(1..n(n\leq5\times10^4)\)的排列\(\{a_n\}\)和数列\(\{w_n\}(w_i\leq10^5)\),进行\(m(m\l ...

  6. [P3759][TJOI2017]不勤劳的图书管理员(分块+树状数组)

    题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生 这两本书页数的和的厌烦度.现在有n本被打乱顺序的书 ...

  7. 【bzoj4889】[Tjoi2017]不勤劳的图书管理员 树状数组+分块+二分

    题目描述(转自洛谷) 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生这两本书页数的和的厌烦度.现在有n本被打 ...

  8. [TJOI2017]不勤劳的图书管理员(分块+树状数组)

    有一个数组开大会MLE开小会RE的做法:就是树套树,即树状数组套主席树,这种方法比较暴力,然而很遗憾它不能通过,因为其时空复杂度均为O(nlog2n). 想到一种不怎么耗内存,以时间换空间,分块!单次 ...

  9. luogu3759 [TJOI2017]不勤劳的图书管理员

    分块+权值逆序对 #include <algorithm> #include <iostream> #include <cstdio> #include <c ...

随机推荐

  1. 使用Jcrop-canvas画布-制作前端图像裁剪

    写在前面 –公司有这个需求,安排调查 –目前各大网站都是采用的-前端做裁剪返回坐标-由后端来做到裁剪 –而使用html-canvas画布可以直接前端裁剪并返回base64流-ajax可以直接下载保存 ...

  2. python爬取豆瓣流浪地球影评,生成词云

    代码很简单,一看就懂. (没有模拟点击,所以都是未展开的) 地址: https://movie.douban.com/subject/26266893/reviews?rating=&star ...

  3. C语言Windows程序开发—TextOut函数介绍【第02天】

    (一)TextOut函数的参数介绍: BOOL TextOut ( //如果函数调用成功,返回TRUE,否则,返回FALSE HDC hdc, //用于显示字符串的控件ID int nXStart, ...

  4. 20145202马超《网络对抗》Exp3免杀 进阶

    木马化正常软件,如通过改变机器指令.实现可免杀免防火墙提示的后门. 继上次实验3所做的代码在主函数里面加上一行调用就可以 改各种属性,这里我参考了郝浩同学的博客 最后我还是遇到了问题 后来发现虽然有那 ...

  5. CSS3不一样的下拉选择框

    本例中包含两个下拉选择框的动画示例,本例中并未使用select标签.本例中第一个案例也可用于标题.导航栏等位置. 案例一: html布局 <div class="content&quo ...

  6. easyui 验证动态添加和删除问题

    $.extend($.fn.validatebox.methods, { remove: function(jq, newposition){ return jq.each(function(){ $ ...

  7. Hibernate-ORM:04.Hibernate中的get()和load()

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客会讲如何用get()或load()查询单个对象和对缓存的简单操作,以及他俩的区别和相同(前面有的那些配 ...

  8. spring、spring-data-redis整合使用

    一.Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 从2010年3月15日起,Redis的开发工作由VMwa ...

  9. Android PopupWindow 疑难杂症之宽度WRAP_CONTENT

    一直以来都觉得 Android 中的 PopupWindow 不好用.主要有以下两点:1.宽度不好控制2.位置不好控制 今天单说第1点. 由于应用有好几种国家的语言,加上各设备宣染效果不完全一样,对p ...

  10. vux用法

    其实官网写的很详细了 但是好多时候没有仔细看的耐心 下面基本也是vux官网步骤: 很多人需要$t未定义问题 其实按着官网来就能解决这个报错: 如果你遇到 $t 报错问题,请不要开 issue,升级 v ...