LOJ 6278 数列分块入门2

【题解】
分块。块内排序。块内二分出第一个大于等于c的数。
#include<cstdio>
#include<algorithm>
#include<cmath>
#define N 500010
#define rg register
using namespace std;
int n,m,opt,l,r,c,block,bl[N],tag[N];
struct rec{
int data,pos;
}a[N];
inline int read(){
int k=0,f=1; char c=getchar();
while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
return k*f;
}
inline bool cmp(rec x,rec y){return x.data<y.data;}
inline int find(int pos,int x){
int l=(pos-1)*block+1,r=pos*block, ll=l;
while(l<r){
int mid=(l+r+1)>>1;
if(a[mid].data<x) l=mid;
else r=mid-1;
}
if(a[l].data>=x) return 0;
return l-ll+1;
}
int main(){
n=read(); block=sqrt(n);
for(rg int i=1;i<=n;i++) a[i].data=read(),a[i].pos=i;
for(rg int i=1;i<=n;i++) bl[i]=(i-1)/block+1;
for(rg int i=1;i<=block+1;i++) sort(a+(i-1)*block+1,a+min(i*block,n)+1,cmp);
for(rg int j=1;j<=n;j++){
if((opt=read())==0){
l=read(); r=read(); c=read();
int st=bl[l]+1,ed=bl[r]-1;
for(rg int i=st;i<=ed;i++) tag[i]+=c;
if(bl[l]==bl[r]){
int x=(bl[l]-1)*block+1,y=min(bl[l]*block,n);
for(rg int i=x;i<=y;i++) if(a[i].pos>=l&&a[i].pos<=r) a[i].data+=c;
sort(a+x,a+y+1,cmp);
continue;
}
int x=(bl[l]-1)*block+1,y=min(bl[l]*block,n);
for(rg int i=x;i<=y;i++)
if(a[i].pos>=l) a[i].data+=c;
sort(a+x,a+y+1,cmp);
x=(bl[r]-1)*block+1,y=min(bl[r]*block,n);
for(rg int i=x;i<=y;i++)
if(a[i].pos<=r) a[i].data+=c;
sort(a+x,a+y+1,cmp);
}
else{
l=read(); r=read(); c=read(); c*=c;
int st=bl[l]+1,ed=bl[r]-1,ans=0;
for(rg int i=st;i<=ed;i++) ans+=find(i,c-tag[i]);
if(bl[l]==bl[r]){
for(rg int i=(bl[l]-1)*block+1;i<=bl[l]*block;i++)
if(a[i].pos>=l&&a[i].pos<=r&&a[i].data+tag[bl[l]]<c) ans++;
printf("%d\n",ans); continue;
}
int x=(bl[l]-1)*block+1,y=min(bl[l]*block,n);
for(rg int i=x;i<=y;i++)
if(a[i].pos>=l&&a[i].data+tag[bl[l]]<c) ans++;
x=(bl[r]-1)*block+1,y=min(bl[r]*block,n);
for(rg int i=x;i<=y;i++)
if(a[i].pos<=r&&a[i].data+tag[bl[r]]<c) ans++;
printf("%d\n",ans);
}
}
return 0;
}
LOJ 6278 数列分块入门2的更多相关文章
- LOJ #6278. 数列分块入门 2-分块(区间加法、查询区间内小于某个值x的元素个数)
#6278. 数列分块入门 2 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 6 题目描述 给出 ...
- LOJ#6278. 数列分块入门 2
在一个区间上进行操作,一种操作是某个小区间都加上c,另一个查找这个区间内大于c*c的数 我们可以另外开一个数组在保存a中的每个分块内的相对值,然后每次对a加值,并把a的值赋给b,不同的是b内的各个分块 ...
- LOJ——#6277. 数列分块入门 1
~~推荐播客~~ 「分块」数列分块入门1 – 9 by hzwer 浅谈基础根号算法——分块 博主蒟蒻,有缘人可直接观摩以上大佬的博客... #6277. 数列分块入门 1 题目大意: 给出一个长为 ...
- LOJ #6285. 数列分块入门 9-分块(查询区间的最小众数)
#6285. 数列分块入门 9 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给 ...
- LOJ #6284. 数列分块入门 8-分块(区间查询等于一个数c的元素,并将这个区间的所有元素改为c)
#6284. 数列分块入门 8 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给出 ...
- LOJ #6283. 数列分块入门 7-分块(区间乘法、区间加法、单点查询)
#6283. 数列分块入门 7 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给出 ...
- LOJ #6282. 数列分块入门 6-分块(单点插入、单点查询、数据随机生成)
#6282. 数列分块入门 6 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 1 题目描述 给出 ...
- LOJ #6281. 数列分块入门 5-分块(区间开方、区间求和)
#6281. 数列分块入门 5 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 5 题目描述 给出 ...
- LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)
#6280. 数列分块入门 4 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 题目描述 给出一个 ...
随机推荐
- Prevent the "split brain" by configuring the majority of nodes
## Prevent the "split brain" by configuring the majority of nodes (total number of nodes / ...
- 【Unity】用Shader编程实现3D红心
有些形状,即使没有3D美术设计师提供模型,也能够用代码生成. 对于想保持原创性不想借用他人模型的独立开发人员来说,这无非是一个非常重要的途径. 今天献给大家的是用Shader编程实现的一颗红心,寄托下 ...
- Ajax之XMLHttpRequst对象
XMLHttpRequest对象提供客户端与Http服务器异步通信的协议.通过该协议,Ajax可以使页面像桌面应用程序一样,只同服务器进行数据层的交换,而不用每次都刷新页面,也不用每次将数据处理工作提 ...
- SignalR -- server push 利器
实际上关于SignalR的介绍网上有很多,这里不做过多赘述,我们来看下官方网站的描述. [摘录自http://signalr.net/] What is ASP.NET SignalR ASP.NET ...
- 杂项:LDAP
ylbtech-杂项:LDAP 1.返回顶部 1. LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP.它是基于X. ...
- codeforces round #416 div2
A:暴力模拟 #include<bits/stdc++.h> using namespace std; int a, b; int main() { scanf("%d%d&qu ...
- C++ 指针 部分
基本知识:在内存中的每个字节都有一个编号,这就是“地址”,相当于旅馆中的房间号.记住,内存单元的地址和内存单元的内容是两个不同的概念. 程序在编译之后,就已经将变量名转换成变量地址,对变量值的存取都是 ...
- 创建 /dev/video0 节点 (转载)
转自:http://blog.csdn.net/linuxmake/article/details/8208464 最近做摄像头驱动,发现没有 /dev/video0节点,经过查看发现是内核编译时没有 ...
- IOS上微信在输入框弹出键盘后,页面不恢复,下方有留白,有弹窗弹出时页面内容感应区域错位
问题说明: ios中,键盘的弹起,页面会往上挪动,使输入框展示在页面中间,键盘隐藏页面会下挪恢复原状. 在微信移动端,ios页面不恢复,下方有留白. 收起键盘的瞬间,如果有弹窗弹出,此时时页面内容应区 ...
- Android Jetpack - 使用 Navigation 管理页面跳转
在今年的 IO 大会上,发布了一套叫 Android Jetpack 的程序库.Android Jetpack 里的组件大部分我们都接触过了,其中也有一些全新的组件,其中一个就是 Navigation ...