正题

题目链接:https://www.luogu.com.cn/problem/P2801


题目大意

nnn个数字,要求支持

  1. 区间加上一个数字www
  2. 询问一个区间内不小于www的数的个数

解题思路

考虑分块,对于块内我们维护一个排序后的数组,查询时直接在整个块中二分答案即可。修改就暴力修改然后排序。

时间复杂度O(Qnlog⁡n)O(Q\sqrt n\log n)O(Qn​logn)


codecodecode

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1e6+10;
int n,m,T,a[N],v[N],pos[N];
int L[N],R[N],lazy[N];
void Reset(int x){for(int i=L[x];i<=R[x];i++)a[i]+=lazy[x],v[i]=a[i];sort(v+L[x],v+R[x]+1);lazy[x]=0;return;
}
void seq_qer(){for(int i=1;i<=T;i++)L[i]=R[i-1]+1,R[i]=i*T;if(R[T]!=n)L[++T]=R[T]+1,R[T]=n;for(int i=1;i<=T;i++)for(int j=L[i];j<=R[i];j++)pos[j]=i;for(int i=1;i<=T;i++)Reset(i);
}
int Ask(int l,int r,int w){int q=pos[l],p=pos[r],ans=0;if(q==p){for(int i=l;i<=r;i++)ans+=(a[i]+lazy[p]>=w);return ans;}for(int i=l;i<=R[q];i++)ans+=(a[i]+lazy[q]>=w);for(int i=L[p];i<=r;i++)ans+=(a[i]+lazy[p]>=w);for(int i=q+1;i<p;i++){if(v[R[i]]+lazy[i]<w)ans+=R[i]-L[i]+1;else ans+=R[i]+1-(lower_bound(v+L[i],v+R[i]+1,w-lazy[i])-v);}return ans;
}
void Change(int l,int r,int w){int q=pos[l],p=pos[r],ans=0;if(q==p){for(int i=l;i<=r;i++)a[i]+=w;Reset(p);return;}for(int i=l;i<=R[q];i++)a[i]+=w;Reset(q);for(int i=L[p];i<=r;i++)a[i]+=w;Reset(p);for(int i=q+1;i<p;i++)lazy[i]+=w;return;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&a[i]);T=sqrt(n);seq_qer();while(m--){printf("%d ",n);for(int i=1;i<=n;i++)printf("%d ",v[i]);char op[3];int l,r,w;scanf("%s %d %d %d",op,&l,&r,&w);if(op[0]=='M')Change(l,r,w);else printf("%d\n",Ask(l,r,w));}return 0;
}

P2801-教主的魔法【分块,二分】相关推荐

  1. Bzoj 3343: 教主的魔法(分块+二分答案)

    3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MB Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息 ...

  2. 【bzoj3343】教主的魔法 (分块 + 二分)

    传送门(权限题) 题目分析 题意为:给定一个数列,修改和查询两种操作,修改每次给定一个区间,区间的所有元素都加上一个给定值,查询询问一段区间的数权值大于等于给定值的数有多少个. 首先对原序列分块,然后 ...

  3. P2801 教主的魔法(分块入门)

    两个月之前听yyr学长讲的分块,感觉是个很神奇的暴力,但到现在还是懵的一匹 #include<bits/stdc++.h> using namespace std; const int m ...

  4. 洛谷-P2801 教主的魔法 分块

    题目 题目链接 题意 修改:将一个区间内所有的数+C. 查询:查询一个区间内>C的数字有多少个. 题解 很经典的分快算法题目. 将数列分块以后,对块内的元素进行排序. 当我们要做修改操作的时候: ...

  5. luogu P2801 教主的魔法

    luogu P2801 教主的魔法 谜之分块 初学分块,找题练练手 大概分块示意图: 分块大法好! std: #include<bits/stdc++.h> using namespace ...

  6. BZOJ——3343: 教主的魔法 || 洛谷—— P2801 教主的魔法

    http://www.lydsy.com/JudgeOnline/problem.php?id=3343  ||  https://www.luogu.org/problem/show?pid=280 ...

  7. [luoguP2801] 教主的魔法(二分 + 分块)

    传送门 以为对于这类问题线段树都能解决,分块比线段树菜,结果培训完才知道线段树是一种特殊的分块方法,有的分块的题线段树不能做,看来分块还是有必要学的. 对于这个题,先分块,然后另开一个数组对于每个块内 ...

  8. P2801 教主的魔法

    算是分块第一题了吧,抄题解过的. 简化版的题意:给你n个数的序列,支持区间加的修改,同时支持查询区间内大于等于w的数字的多少. 分块题的基本标志就是:xjb查询,普通修改.(来自qsc大佬的一句话) ...

  9. [Luogu P2801]教主的魔法

    题意就是让我们维护一个数据结构,可以实现区间修改和区间查询多少个数大于等于给定值.这个据说线段树可以写但是我并没有想到qwq,于是我使用了"优雅的暴力"--分块. 分块做法十分显然 ...

  10. bzoj 3343 教主的魔法 分块

    修改直接对整块打标记,两边暴力. 查询需要保证每个整块有序,所以在修改时排序就好啦 #include<cstdio> #include<cstring> #include< ...

最新文章

  1. 深度学习vs机器学习 | 这些本质区别你知道多少?
  2. Segment Routing — SRv6 — 网络架构与应用场景
  3. 9月7日学习内容整理:内置函数
  4. 中文数据集有奖公开征集
  5. g5420 win7集显驱动_台式机装WIN7?雷我已经趟完了
  6. 《妖猫传》大唐盛世背后那些事
  7. 结对项目--wordCount
  8. html静态页面留言板,html静态留言板
  9. xpraid安装_在Win2003/XP安装光盘中集成RAID驱动 不用软驱装RAID/SATA/SAS驱动
  10. ESET NOD32
  11. 域服务器安全策略应用,ad域服务器组策略命令
  12. 软件测试思想者 - 再识王阳明
  13. 辽宁计算机专业大学排名及分数线,辽宁一本大学排名及分数线2021
  14. 2021年秋招面经分享·地平线【芯片设计研发工程师】
  15. idea 中ctrl+shift+数字的作用
  16. 背景渐变色,兼容IE
  17. v–meca仿真软件下载_进入工作软件–简介
  18. 2022-04-30前端周报 巴厘岛项目交接.md
  19. 电子商务 实训三:电子商店策划实训
  20. php人像分割 人像抠图 证件照换底色 在线制作证件照API

热门文章

  1. 和flag_不怕立Flag,就怕没有Flag
  2. 新增一个主键自增长_MyBatis 示例-主键回填
  3. java 视频监控 分屏ui_视频监控网页ActiveX视频分屏播放控件开发
  4. [MySQL基础]MySQL语法规范介绍
  5. MongoDB 分片
  6. oracle sql execute elapsed time,SQL ordered by Elapsed Time 脚本
  7. liunx版mysql服务无法启动_linux环境下mysql无法启动
  8. python实现辗转相除法求最大公约数和最小公倍数
  9. word List32
  10. word List 08