P2801 教主的魔法(分块)
区间加法,区间查询
显然就是分块辣
维护一个按块排好序的数组。
每次修改依然是整块打标记,零散块暴力。蓝后对零散块重新排序。
询问时整块二分,零散块暴力就好辣
注意细节挺多和边界问题TAT
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
inline int Min(int a,int b){return a<b?a:b;}
void read(int &x){
static char c=getchar();x=;
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') x=x*+(c^),c=getchar();
}
#define N 1000005
int n,Len,m,a[N],b[N],add[];
inline int Bel(int x){return (x-)/Len+;}
void Add(int l,int r,int v){
register int i,p;
if(Bel(l)==Bel(r)){//注意l,r在同一块内,下同
p=Bel(l)*Len;
for(i=l;i<=r;++i) a[i]+=v;
for(i=p-Len+;i<=p;++i) b[i]=a[i];
sort(b+p-Len+,b+p);
return ;
}
p=Bel(l)*Len;
for(i=l;i<=p;++i) a[i]+=v;
for(i=p-Len+;i<=p;++i) b[i]=a[i];
sort(b+p-Len+,b+p);
for(i=Bel(l)+;i<Bel(r);++i) add[i]+=v;
p=(Bel(r)-)*Len+;
for(i=p;i<=r;++i) a[i]+=v;
for(i=Min(n,p+Len);i>=p;--i) b[i]=a[i];
sort(b+p,b+Min(n,p+Len));//注意最后一块右端不超过n
}
int Ask(int l,int r,int v){
register int i,p,re=;
if(Bel(l)==Bel(r)){
for(i=l;i<=r;++i) re+=(a[i]>=v-add[Bel(l)]);
return re;
}
p=Bel(l)*Len;
for(i=l;i<=p;++i) re+=(a[i]>=v-add[Bel(l)]);
for(i=Bel(l)+;i<Bel(r);++i){
int tmp=lower_bound(b+(i-)*Len+,b+i*Len,v-add[i])-b;
re+=i*Len-tmp+(b[tmp]>=v-add[i]);//如果整块都>v-add[i],注意lower_bound找到的tmp仍指向块的开头
}
p=(Bel(r)-)*Len+;
for(i=p;i<=r;++i) re+=(a[i]>=v-add[Bel(r)]);
return re;
}
int main(){
register int i;
char opt[]; int q1,q2,q3;
read(n);read(m); Len=sqrt(n);
for(i=;i<=n;++i) read(a[i]),b[i]=a[i];
for(i=;i+Len<=n;i+=Len) sort(b+i,b+i+Len);
sort(b+i,b+n+);
while(m--){
scanf("%s%d%d%d",opt,&q1,&q2,&q3);
if(opt[]=='M') Add(q1,q2,q3);
else if(opt[]=='A') printf("%d\n",Ask(q1,q2,q3));
}return ;
}
P2801 教主的魔法(分块)的更多相关文章
- 洛谷P2801 教主的魔法 [分块,二分答案]
题目传送门 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. ...
- P2801 教主的魔法(分块入门)
两个月之前听yyr学长讲的分块,感觉是个很神奇的暴力,但到现在还是懵的一匹 #include<bits/stdc++.h> using namespace std; ; int belon ...
- 洛谷P2801 教主的魔法 分块
正解:分块 解题报告: 哇之前的坑还没填完就又写新博客? 不管不管,之前欠的两三篇题解大概圣诞节之前会再仔细想想然后重新写下题解趴,确实还挺难的感觉没有很好的理解呢QAQ还是太囫囵吞枣不求甚解了,这样 ...
- P2801 教主的魔法 (分块)
题目传送 长度为\(n(n\le 1000000)\)的数组,\(q(q\le 3000)\) 次操作.修改操作即将某个区间的值增加某个不大于1000的值,查询操作即查询某个区间比C大于等于的数有多少 ...
- 洛谷——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:求教 ...
随机推荐
- python 类组合
场景:有一辆车违章需要通知到车主 定义两个类车辆类和通知类,车辆类和通知类并没有共同点,但是要通知车主这两个类就有了关联,这时候可以把这两个类组合在一起 #!/usr/bin/python3 # -* ...
- delete 删除对象属性
删除属性要直接删.
- 解决PuTTY中文乱码
转载:http://lhdeyx.blog.163.com/blog/static/3181969720091115113716947/ 打开putty,选择 Category中的Windows--- ...
- 学习笔记 python 面向对象学习
封装: 封装是面向对象的特征之一,是对象和类概念的主要特性. 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. 继承: 继承是指这样 ...
- iOS 第三方框架-SDWebImage
iOS中著名的牛逼的网络图片处理框架.包含的功能:图片下载.图片缓存.下载进度监听.gif处理等等.用法极其简单,功能十分强大,大大提高了网络图片的处理效率.国内超过90%的iOS项目都有它的影子. ...
- H5 dom元素保存为图片
一.使用插件html2canvas:https://github.com/niklasvh/html2canvas 具体代码: 1.html <div class="test" ...
- jQuery-动画点击淡化消失
<!DOCTYPE html> <html> <head> <title> new document </title> <meta c ...
- DX9 DirectX鼠标控制程序 代码
代码实例1: // @time: 2012.3.26 // @author: jadeshu // des: DirectX鼠标控制程序 #include <Windows.h> #inc ...
- [1]windows 内核情景分析---说明
本文说明:这一系列文章(笔记)是在看雪里面下载word文档,现转帖出来,希望更多的人能看到并分享,感谢原作者的分享精神. 说明 本文结合<Windows内核情景分析>(毛德操著).< ...
- 16. 3Sum Closest(双指针)
Given an array nums of n integers and an integer target, find three integers in nums such that the s ...