BZOJ 3343 教主的魔法(分块)
题意:
有一个1e6的数组,t次操作:将[l,r]内的值增加w,或者查询[l,r]内的值大于等于add的
思路:
分块,块大小为sqrt(n),每次只需要暴力头尾两块,中间的整块打标记,
对于查询查操作,块内排序然后二分即可
复杂度O(T(sqrt(n)+sqrt(n)logn))
代码:
可以弄两个数组对应着写,会比我这样stl乱写快一倍
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<vector>
#include<map> #define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lc root<<1
#define rc root<<1|1
//#define lowbit(x) ((x)&(-x)) using namespace std; typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef pair<ll,ll> PLL; const db eps = 1e-;
const int mod = 1e9+;
const int maxn = 1e6+;
const int maxm = 2e6+;
const int inf = 0x3f3f3f3f; //const db pi = acos(-1.0); struct node{
int id;
ll v;
};
int n, q;
vector<node>blc[maxn];
int block;
bool cmp(node a, node b){
return a.v<b.v;
}
ll add[maxn];
int main(){
scanf("%d %d", &n, &q);
int block = (int)sqrt(n);
for(int i = ; i < n; i++){
node tmp;
tmp.id = i;
scanf("%lld", &tmp.v);
blc[i/block].pb(tmp);
}
for(int i = ; i <= (n-)/block; i++){
sort(blc[i].begin(), blc[i].end(), cmp);
}
while(q--){
char op[];
int x, y;
ll w;
scanf("%s",op+);
scanf("%d %d %lld", &x, &y, &w);
x--;y--;
int bx = x/block;
int by = y/block;
if(op[]=='M'){
if(bx==by){
for(int i = ; i < (int)blc[bx].size(); i++){
node a = blc[bx][i];
if(a.id>=x&&a.id<=y)blc[bx][i].v+=w;
}
sort(blc[bx].begin(), blc[bx].end(),cmp);
}
else{
int rx = min(n-, (bx+)*block-);
int ly = by*block;
for(int i = ; i < (int)blc[bx].size(); i++){
int id = blc[bx][i].id;
if(id>=x&&id<=y)blc[bx][i].v+=w;
}sort(blc[bx].begin(), blc[bx].end(),cmp);
for(int i = ; i < (int)blc[by].size(); i++){
int id = blc[by][i].id;
if(id>=x&&id<=y)blc[by][i].v+=w;
}sort(blc[by].begin(), blc[by].end(),cmp);
for(int i = bx+; i < by; i++){
add[i]+=w;
}
}
}
else{
int ans = ;
if(bx==by){
for(int i = ; i < (int)blc[bx].size(); i++){
int id = blc[bx][i].id;
if(id>=x&&id<=y&&blc[bx][i].v+add[bx]>=w)ans++;
}
}
else{
for(int i = ; i < (int)blc[bx].size(); i++){
int id = blc[bx][i].id;
if(id>=x&&id<=y&&blc[bx][i].v+add[bx]>=w)ans++;
}
for(int i = ; i < (int)blc[by].size(); i++){
int id = blc[by][i].id;
if(id>=x&&id<=y&&blc[by][i].v+add[by]>=w)ans++;
}
//printf("--%d\n",ans);
for(int i = bx+; i < by; i++){
ll x = w-add[i];
int l = ;
int r = block-;
int pos = block;
while(l<=r){
int mid = (l+r)>>;
if(blc[i][mid].v>=x){
pos = mid;
r = mid-;
}
else l = mid+;
}
ans+=block-pos;
}
}
printf("%d\n",ans);
}
}
return ;
}
/*
5 3
1 2 3 4 5
A 1 5 4
M 3 5 1
A 1 5 4 5 7
3 1 4 2 5
A 1 5 4
M 3 5 1
M 3 5 2
A 1 5 4
M 1 1 3
A 1 5 4
A 1 5 10 5 3
3 1 4 2 5
A 1 5 10
M 1 5 2
A 1 5 10
*/
BZOJ 3343 教主的魔法(分块)的更多相关文章
- BZOJ 3343: 教主的魔法(分块+二分查找)
BZOJ 3343: 教主的魔法(分块+二分查找) 3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1172 Solved: ...
- BZOJ 3343: 教主的魔法 [分块]【学习笔记】
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1172 Solved: 526[Submit][Status][Discus ...
- Bzoj 3343: 教主的魔法(分块+二分答案)
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MB Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息 ...
- Bzoj 3343: 教主的魔法 分块,二分
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 821 Solved: 364[Submit][Status][Discuss ...
- bzoj 3343 教主的魔法 分块
修改直接对整块打标记,两边暴力. 查询需要保证每个整块有序,所以在修改时排序就好啦 #include<cstdio> #include<cstring> #include< ...
- BZOJ——3343: 教主的魔法 || 洛谷—— P2801 教主的魔法
http://www.lydsy.com/JudgeOnline/problem.php?id=3343 || https://www.luogu.org/problem/show?pid=280 ...
- BZOJ 3343教主的魔法
Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的 ...
- bzoj 3343: 教主的魔法
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 924 Solved: 402[Submit][Status][Discuss] Descriptio ...
- [bzoj] 3343 教主的魔法 || 带修改分块
原题 长度为n的序列,有两种操作: 1.[l,r]区间每个数+w 2.询问[l,r]区间有多少个数>c 记录lazy数组即可. #include<cstdio> #include&l ...
随机推荐
- kubernetes-dashboard部署
参考资料: kubernetes官方文档 官方GitHub 创建访问用户 解决chrome无法访问dashboard 官方部署方法如下: kubectl apply -f https://raw.gi ...
- linux修改环境变量的三种方法【转】
[环境变量配置的三个方法] 如想将一个路径加入到$PATH中,可以像下面这样做: 1. 控制台中,不赞成使用这种方法,因为换个shell,你的设置就无效了,因此这种方法仅仅是临时使用,以后要使用的时 ...
- 金三银四,磨砺锋芒;剑指大厂,扬帆起航(2020年最全大厂WEB前端面试题精选)上
金三银四,磨砺锋芒:剑指大厂,扬帆起航(2020年最全大厂WEB前端面试题精选)上 引言 元旦匆匆而过,2020年的春节又接踵而来,大家除了忙的提着裤子加班.年底冲冲冲外,还有着对于明年的迷茫和期待! ...
- 容器环境的JVM内存设置最佳实践
Docker和K8S的兴起,很多服务已经运行在容器环境,对于java程序,JVM设置是一个重要的环节.这里总结下我们项目里的最佳实践. Java Heap基础知识 默认情况下,jvm自动分配的heap ...
- 《C# 爬虫 破境之道》:第一境 爬虫原理 — 第三节:WebResponse
第二节中,我们介绍了WebRequest,它可以帮助我们发送一个请求,不过正所谓“来而不往非礼也”,对方收到我们的请求,不给点回复,貌似不太合适(不过,还真有脸皮厚的:P). 接下来,就重点研究一下, ...
- __call__ 方法
对象() 或 类()() 调用 __call__里面的方法 class Call: def __call__(self, *args, **kwargs): print("Hello __c ...
- python条件与循环-循环
1 while语句 while用于实现循环语句,通过判断条件是否为真,来决定是否继续执行. 1.1 一般语法 语法如下: while expression: suite_to_repeat 1.2 计 ...
- mongo 的 中文社区的 文档还是 挺不错的
英文文档也奉上: http://api.mongodb.com/csharp/2.2/html/T_MongoDB_Bson_Serialization_Attributes_BsonIdAttrib ...
- FreeImage 结合 VB6 使用技巧
1.图片(Bitmap)改变为32位使用FreeImage_ConvertColorDepth函数.图片半透明绘制需要图片(Bitmap)是32位的. 2.图片(Bitmap)的半透明绘制使用函数:F ...
- mysql --->mysql 外键总结
mysql 外键总结 1.设置外键MySQL ERROR 1005 错误 MySQL ERROR 1005 (主要是约束不一样导致的)例如: 1.两表外键的引用类型不一样,如主键是int外键是char ...