BZOJ 3343:教主的魔法(分块)

【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=3343

【题目大意】

  给出一个数列,有区间加法操作,询问区间大于等于c的数字个数

【题解】

  我们将数据分块,区间加法等价于各个块整块加法以及首位部分的个体加法,
  由于要查询区间大于等于c的数字个数,
  因此我们在每个块发生相对大小变动的时候对块内元素映射进行一次排序,
  因为每次只有最左和最右的块相对大小发生变动,因此修改操作仍为O(sqrt(n))
  查询时我们二分查找每个块中满足大小的个数,查询复杂度O(sqrt(n)log(sqrt(n)))
  总复杂度O(qsqrt(n)log(sqrt(n))。

【代码】

#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int n,m,q,block;
const int N=1000010;
int a[N],b[N],pos[N],add[N];
void Sortblock(int x){
    int l=(x-1)*block+1,r=min(x*block,n);
    for(int i=l;i<=r;i++)b[i]=a[i];
    sort(b+l,b+r+1);
}
int find(int x,int v){
    int l=(x-1)*block+1,r=min(x*block,n);
    int R=r;
    while(l<=r){
        int mid=(l+r)>>1;
        if(b[mid]<v)l=mid+1;
        else r=mid-1;
    }return R-l+1;
}
void update(int x,int y,int v){
    if(pos[x]==pos[y]){for(int i=x;i<=y;i++)a[i]+=v;}
    else{
        for(int i=x;i<=pos[x]*block;i++)a[i]+=v;
        for(int i=(pos[y]-1)*block+1;i<=y;i++)a[i]+=v;
    }Sortblock(pos[x]);Sortblock(pos[y]);
    for(int i=pos[x]+1;i<pos[y];i++)add[i]+=v;
}
int query(int x,int y,int v){
    int res=0;
    if(pos[x]==pos[y]){for(int i=x;i<=y;i++)if(a[i]+add[pos[i]]>=v)res++;}
    else{
        for(int i=x;i<=pos[x]*block;i++)if(a[i]+add[pos[i]]>=v)res++;
        for(int i=(pos[y]-1)*block+1;i<=y;i++)if(a[i]+add[pos[i]]>=v)res++;
    }for(int i=pos[x]+1;i<pos[y];i++)res+=find(i,v-add[i]);
    return res;
}
int main(){
    while(~scanf("%d%d",&n,&q)){
        block=int(sqrt(n));
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            pos[i]=(i-1)/block+1;
            b[i]=a[i];
        }
		if(n%block)m=n/block+1;
        else m=n/block;
        for(int i=1;i<=m;i++)Sortblock(i);
        for(int i=1;i<=q;i++){
            char op[5];
            int x,y,v;
            scanf("%s%d%d%d",op,&x,&y,&v);
            if(op[0]==‘M‘)update(x,y,v);
            else printf("%d\n",query(x,y,v));
        }
    }return 0;
}
时间: 2024-10-11 16:17:31

BZOJ 3343:教主的魔法(分块)的相关文章

bzoj 3343: 教主的魔法 分块

3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MB Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W.(虽然L=R时并不符合区间的书写规范,但我们可以认为是单独增加第L

BZOJ 3343: 教主的魔法 [分块]【学习笔记】

3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1172  Solved: 526[Submit][Status][Discuss] Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)

Bzoj 3343: 教主的魔法

3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1444  Solved: 653[Submit][Status][Discuss] Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)

BZOJ 3343教主的魔法

Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W.(虽然L=R时并不符合区间的书写规范,但我们可以认为是单独增加第L(R)个英雄的身高) CYZ.光哥和ZJQ等人不信教主的邪,于是他们有时候会问WD闭区间 [L, R] 内

【BZOJ-3343】教主的魔法 分块

3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 950  Solved: 414[Submit][Status][Discuss] Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内

[BZOJ3343] 教主的魔法|分块

3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 601  Solved: 259[Submit][Status][Discuss] Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内

Luogu 2801 教主的魔法 | 分块模板题

Luogu 2801 教主的魔法 | 分块模板题 我犯的错误: 有一处l打成了1,还看不出来-- 缩小块大小De完bug后忘了把块大小改回去就提交--还以为自己一定能A了-- #include <cstdio> #include <cstring> #include <algorithm> #include <set> using namespace std; typedef long long ll; #define space putchar(' ')

【BZOJ】3343: 教主的魔法

Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W.(虽然L=R时并不符合区间的书写规范,但我们可以认为是单独增加第L(R)个英雄的身高) CYZ.光哥和ZJQ等人不信教主的邪,于是他们有时候会问WD闭区间 [L, R] 内

BZOI——3343: 教主的魔法 || 洛谷—— P2801 教主的魔法

http://www.lydsy.com/JudgeOnline/problem.php?id=3343  ||  https://www.luogu.org/problem/show?pid=2801 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全

教主的魔法[分块+二分]

题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W.(虽然L=R时并不符合区间的书写规范,但我们可以认为是单独增加第L(R)个英雄的身高) CYZ.光哥和ZJQ等人不信教主的邪,于是他们有时候会问WD闭区间 [L, R] 内有多少英雄身高