【题目描述】

给出一个长为 n 的数列,以及 n 个操作,操作涉及区间加法,询问区间内小于某个值 x 的元素个数

【输入格式】

第一行输入一个数字 n。

第二行输入 n 个数字,第 i 个数字为 ai,以空格隔开。

接下来输入 n 行询问,每行输入四个数字 opt、l、r、c,以空格隔开。

若 opt=0,表示将位于 [l,r] 的之间的数字都加 c。

若 opt=1,表示询问位于 [l,r] 中小于 c^2 的数字的个数

【输出格式】

对于每次询问,输出一行一个数字表示答案。

【样例】

样例输入
4
1 2 2 3
0 1 3 1
1 1 3 2
1 1 4 1
1 2 3 2

样例输出
3
0
2

【数据范围与提示】

对于 100% 的数据,1<=n<=50000,-2^31<=other,ans<=2^31-1。

【源代码】

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#define EPS 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
const int MOD = 1E9+7;
const int N = 100000+5;
const int dx[] = {-1,1,0,0,-1,-1,1,1};
const int dy[] = {0,0,-1,1,-1,1,-1,1};
using namespace std;
int n;
int block,sum;//block为块的长度,sum为块的个数
int a[N];//存放数列元素
int pos[N],tag[N];//pos记录第i个元素在第几个块中,tag为操作标记
int ans[N];//维护整块和
vector<int> v[N];
void init(){block=sqrt(n);//块的长度sum=n/block;//块个数if(n%block)sum++;for(int i=1;i<=n;i++){pos[i]=(i-1)/block+1;//第i个元素在第几块中v[pos[i]].push_back(a[i]);//保存每个数分块的序号}for(int i=1;i<=sum;i++)//对整块进行排序sort(v[i].begin(),v[i].end());
}
void resort(int x){v[pos[x]].clear();for(int i=(pos[x]-1)*block+1;i<=min(pos[x]*block,n);i++)v[pos[x]].push_back(a[i]);sort(v[pos[x]].begin(),v[pos[x]].end());
}
void update(int L,int R,int x){for(int i=L;i<=min(pos[L]*block,R);i++)//左边的边角料a[i]+=x;resort(L);//对不完整块排序if(pos[L]!=pos[R]){//存在右区间才遍历,防止重复计算for(int i=(pos[R]-1)*block+1;i<=R;i++)//右边的边角料a[i]+=x;resort(R);//对不完整块排序}for(int i=pos[L]+1;i<=pos[R]-1;i++)//中间的整块tag[i]+=x;
}
int query(int L,int R,int x){int res=0;for(int i=L;i<=min(pos[L]*block,R);i++)//左边的边角料if(a[i]+tag[pos[i]]<x)res++;if(pos[L]!=pos[R])//存在右区间才遍历,防止重复计算for(int i=(pos[R]-1)*block+1;i<=R;i++)//右边的边角料if(a[i]+tag[pos[i]]<x)res++;for(int i=pos[L]+1;i<=pos[R]-1;i++){//中间的整块进行二分查找int temp=x-tag[i];res+=lower_bound(v[i].begin(),v[i].end(),temp)-v[i].begin();}return res;
}
int main(){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);init();for(int i=1;i<=n;i++){int op;int left,right,x;scanf("%d",&op);scanf("%d%d%d",&left,&right,&x);if(op==0)update(left,right,x);else if(op==1)printf("%d\n",query(left,right,x*x));}return 0;
}

数列分块入门 2(LibreOj-6278)相关推荐

  1. 「分块」数列分块入门1 – 9

    ACM模板 放暑假了,回归!!! 自己不会写暴力,而且好久没写代码了,于是学学分块的优雅暴力~ 「分块入门-LibreOJ」 「分块」数列分块入门1 – 9 by hzwer 数列简单分块问题实际上有 ...

  2. 数列分块入门 (1 ~ 7)

    分块 6277. 数列分块入门 1 分块思想 我们把每m个元素分成一块,所以我们总共的块数就是n/mn / mn/m块,一般情况下我们取m=nm = \sqrt{n}m=n​.对于区间加操作,我们可以 ...

  3. LOJ——#6277. 数列分块入门 1

    ~~推荐播客~~ 「分块」数列分块入门1 – 9 by hzwer 浅谈基础根号算法--分块 博主蒟蒻,有缘人可直接观摩以上大佬的博客... #6277. 数列分块入门 1 题目大意: 给出一个长为 ...

  4. 【分块入门】LOJ 数列分块入门 1 - 9 (学习更新……)

    dl题解 _「分块」数列分块入门1 – 9 by hzwer LOJ #6277. 数列分块入门 1 题意:给出一个长为n的数列,以及n个操作,操作涉及区间加法,单点查值. 时间限制:100ms 分块 ...

  5. #6279. 数列分块入门 3(区间修改,查询权值前驱)

    #6279. 数列分块入门 3 这是使用hzwer建议的set写的分块代码,set自动排序,支持二分查找,但是常数较大,比我下面写的用vector实现的分块慢了三倍,空间大了10倍. #include ...

  6. LOJ 数列分块入门6

    LOJ 数列分块入门6 题目: 题目 题解: 我都不懂这题为什么要用分块... ... 直接vector就好了... 但是如果有区间修改的话就不行了.所以这题是启示我们也可以动态分块.具体就是每次插入 ...

  7. LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)

    #6280. 数列分块入门 4 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 题目描述 给出一个长为 ...

  8. 数列分块入门(套题)(loj6277,loj6278,loj6279,loj6280,loj6281,loj6282,loj6283,loj6284,loj6285)

    前言 zjoi考差了,码一些分块题缓解一下心情 壹 数列分块入门 1[loj6277] 题目大意:区间加,单点查 直接分块,区间加时完全覆盖的块打tag,边界块暴力重构 块大小设为n\sqrt nn​ ...

  9. 「分块系列」数列分块入门3 解题报告

    数列分块入门3 题意概括 区间加法,区间求前驱. 写在前面 这题的方法与分块2方法极其类似,建议自行解决. 正题 和上一题类似,但是二分不是用来计数的,而是用来求小于c的最大值的.然后对于不完整快,将 ...

  10. #6277. 数列分块入门 1

    题目链接:https://loj.ac/problem/6277 学习博客:http://hzwer.com/8053.html #6277. 数列分块入门 1 内存限制:256 MiB时间限制:10 ...

最新文章

  1. 京东金融App收集用户敏感信息?致歉来了
  2. Ubuntu 64bit 安装 ulipad4.1
  3. Indy10中IdMappedPortTCP的用法
  4. 征战蓝桥 —— 2014年第五届 —— C/C++A组第8题——地宫取宝
  5. 【测试点0分析】1009 Product of Polynomials (25 分)
  6. Android--简单开发和使用ContentProvider数据共享
  7. windows怎么打开python_windows怎么打开Python
  8. 【Flink】Flink UI 查看 subtask在相应的机器上的调度时间
  9. java jre32下载_JRE7 32位官方下载
  10. 从零实现 SPI_flash(W25Q256)
  11. 谎言,统计数据和供应商
  12. Hibernate——缓存
  13. 红魔5S游戏手机与努比亚watch闪耀ChinaJoy
  14. setdbprefs matlab,matlab数据导入与导出
  15. 如何启动单线程实现多线程效果及保证安全?
  16. 谷歌地图开发使用记录 Google Maps
  17. 关于链表的逆序排列!
  18. 在MFC中手动添加消息处理函数PreTranslateMessage
  19. 火车站信号自动语音播报系统的设计
  20. 如何用光盘安装服务器系统教程,光盘、硬盘怎么安装系统(图文教程)

热门文章

  1. hadoop示例源码位置
  2. JavaEE实战班第十二天
  3. Java 面试 80% 的人都会踩这些坑,你知道几种?
  4. 不就是SELECT COUNT语句吗,竟然能被面试官虐的体无完肤
  5. 原创 | 一文了解那些和Spring Bean有关的那些注解!
  6. 当我们在谈数字化转型的时候,我们在谈什么?
  7. 开源资讯- Jeecg 在线聊天MQ插件发布
  8. 多台tomcat服务的session共享 memcached与redis
  9. mybatis+spring mvc 完美整合方案 查询,保存,更新,删除自动生成
  10. Linux系统:centos7下搭建ZooKeeper3.4中间件,常用命令总结