P2801 教主的魔法 (分块)
长度为\(n(n\le 1000000)\)的数组,\(q(q\le 3000)\) 次操作。修改操作即将某个区间的值增加某个不大于1000的值,查询操作即查询某个区间比C大于等于的数有多少个
我们用一个数组\(add[i]\)来表示第\(i\)段增量,如果查询区间完全包含第\(i\)段,那么就相当于是在原数组中查找大于等于\(C-add[i]\)的数,怎么找?排序后二分找。而对于左右不完整的那部分,直接暴力查询就可以。
对于修改操作。整段的直接增加增量,不完整的直接修改原数组,然后重新排序即可。
假设一段长度为\(t\) 则复杂度\(O(C(t+{nlog(t)\over t}))\)
#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
int a[N],b[N],be[N],L[N],R[N],add[N];
char op[3];
int l,r,x;
int n,m;
void change(int l,int r,int x){
int p = be[l],q = be[r];
if(p == q){
for(int i=l;i<=r;i++)a[i] += x;
for(int i=L[p];i<=R[p];i++)b[i] = a[i];
sort(b+L[p],b+R[p]+1);
}
else{
for(int i=p+1;i<=q-1;i++)add[i] += x;
for(int i=l;i<=R[p];i++)a[i] += x;
for(int i=L[p];i<=R[p];i++)b[i] = a[i];
sort(b+L[p],b+R[p]+1);
for(int i=L[q];i<=r;i++)a[i] += x;
for(int i=L[q];i<=R[q];i++)b[i] = a[i];
sort(b+L[q],b+R[q]+1);
}
}
void solve(int l,int r,int x){
int res = 0;
int p = be[l],q = be[r];
if(p == q){
for(int i=l;i<=r;i++){
if(a[i] + add[p] >= x)res++;
}
printf("%d\n",res);return;
}
else{
for(int i=p+1;i<=q-1;i++){
res += (R[i]-L[i]+1) - (lower_bound(b+L[i],b+R[i]+1,x-add[i]) - (b+L[i]));
}
for(int i=l;i<=R[p];i++)if(a[i] + add[p] >= x)res++;
for(int i=L[q];i<=r;i++)if(a[i] + add[q] >= x)res++;
printf("%d\n",res);return ;
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),b[i] = a[i];
int t = sqrt(n);
for(int i=1;i<=t;i++){
L[i] = (i - 1) * t + 1;
R[i] = i * t;
}
if(R[t] < n)t++,L[t] = R[t-1] + 1,R[t] = n;
for(int i=1;i<=t;i++)for(int j=L[i];j<=R[i];j++)be[j] = i;
for(int i=1;i<=t;i++){
sort(b+L[i],b+R[i]+1);
}
while(m--){
scanf("%s%d%d%d",op,&l,&r,&x);
if(op[0] == 'M')change(l,r,x);
else solve(l,r,x);
}
return 0;
}
P2801 教主的魔法 (分块)的更多相关文章
- 洛谷P2801 教主的魔法 [分块,二分答案]
题目传送门 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. ...
- P2801 教主的魔法(分块入门)
两个月之前听yyr学长讲的分块,感觉是个很神奇的暴力,但到现在还是懵的一匹 #include<bits/stdc++.h> using namespace std; ; int belon ...
- 洛谷P2801 教主的魔法 分块
正解:分块 解题报告: 哇之前的坑还没填完就又写新博客? 不管不管,之前欠的两三篇题解大概圣诞节之前会再仔细想想然后重新写下题解趴,确实还挺难的感觉没有很好的理解呢QAQ还是太囫囵吞枣不求甚解了,这样 ...
- P2801 教主的魔法(分块)
P2801 教主的魔法 区间加法,区间查询 显然就是分块辣 维护一个按块排好序的数组. 每次修改依然是整块打标记,零散块暴力.蓝后对零散块重新排序. 询问时整块二分,零散块暴力就好辣 注意细节挺多和边 ...
- 洛谷——P2801 教主的魔法(线段树or分块)
P2801 教主的魔法 (1) 若第一个字母为“M”,则紧接着有三个数字L.R.W.表示对闭区间 [L, R] 内所有英雄的身高加上W. (2) 若第一个字母为“A”,则紧接着有三个数字L.R.C.询 ...
- 洛谷 P2801 教主的魔法 解题报告
P2801 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.--.N. ...
- Luogu 2801 教主的魔法 | 分块模板题
Luogu 2801 教主的魔法 | 分块模板题 我犯的错误: 有一处l打成了1,还看不出来-- 缩小块大小De完bug后忘了把块大小改回去就提交--还以为自己一定能A了-- #include < ...
- BZOJ 3343: 教主的魔法(分块+二分查找)
BZOJ 3343: 教主的魔法(分块+二分查找) 3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1172 Solved: ...
- P2801 教主的魔法 (线段树)
题目 P2801 教主的魔法 解析 成天做水题 线段树,第一问区间加很简单 第二问可以维护一个区间最大值和一个区间最小值,若C小于等于区间最小值,就加上区间长度,若C大于区间最大值,就加0 ps:求教 ...
随机推荐
- 计算机考研真题 ZOJ问题
题目描述 对给定的字符串(只包含'z','o','j'三种字符),判断他是否能AC. 是否AC的规则如下: 1. zoj能AC: 2. 若字符串形式为xzojx,则也能AC,其中x可以是N个'o' 或 ...
- 浅谈JVM垃圾回收
JVM内存区域 要想搞懂啊垃圾回收机制,首先就要知道垃圾回收主要回收的是哪些数据,这些数据主要在哪一块区域. Java8和Java8之前的相同点有很多. 都有虚拟机栈,本地方法栈,程序计数器,这三个是 ...
- 总结下MySql优化。防止数据灾难的发生。
在PHP开发中用到的数据库中MySql是最牛逼的数据库,没有之一--^_^ 相比Sqlite个人最喜欢的特性就是"支持多线程,充分利用 CPU 资源",不像Sqlite那样,动不动 ...
- 惠普电脑(HP PHILIPS系列)安装ubuntu后无法连接WIFI解决方案(手动安装8821CE驱动)
一步一步来, 先说环境: 我的电脑是HP PHILIPS系列,ubuntu版本是16.04 背景: win10安装ubuntu后发现无法连接wifi(但win10系统可以连接WIFI),在ubuntu ...
- python—base64
今天在写题时,执行脚本又报错了 脚本如下 #! /usr/bin/env python3 # _*_ coding:utf-8 _*_ import base64 # 字典文件路径 dic_file_ ...
- 三种梯度下降算法的区别(BGD, SGD, MBGD)
前言 我们在训练网络的时候经常会设置 batch_size,这个 batch_size 究竟是做什么用的,一万张图的数据集,应该设置为多大呢,设置为 1.10.100 或者是 10000 究竟有什么区 ...
- C# 中的动态类型
翻译自 Camilo Reyes 2018年10月15日的文章 <Working with the Dynamic Type in C#> [1] .NET 4 中引入了动态类型.动态对象 ...
- bean与map之间的转化
import java.util.HashMap; import java.util.Map; import org.apache.commons.beanutils.BeanUtils; impor ...
- CF625E Frog Fights
有\(n\)只青蛙在一个长度为\(m\)的环上打架:每只青蛙有一个初始位置\(p_i\),和一个跳跃数值\(a_i\).从\(1\)号青蛙开始按序号循环行动,每次若第\(i\)只青蛙行动,则它会向前跳 ...
- kettle数据质量统计
1.利用Kettle的"分组","JavaScript代码","字段选择"组件,实现数据质量统计.2.熟练掌握"JavaScrip ...