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 提交提交记录统计测试数据讨论 题目描述 给出一个 ...
随机推荐
- 2015南阳CCPC C - The Battle of Chibi DP树状数组优化
C - The Battle of Chibi Description Cao Cao made up a big army and was going to invade the whole Sou ...
- 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 数据库连接不释放测试 连接池 释放连接 关闭连接 有关 redis-py 连接池会导致服务器产生大量 CLOSE_WAIT 的再讨论以及一个解决方案
import pymysqlfrom redis import Redisimport time h, pt, u, p, db = '192.168.2.210', 3306, 'root', 'n ...
- Application.StartupPath获取执行文件路径substring()取特定长度字符串取得根目录
Application.StartupPath获取执行文件路径substring()取特定长度字符串取得根目录 2012-07-20 10:48 257人阅读 评论(0) 收藏 举报 path usi ...
- Makefile 实际用例分析(二) ------- 比较通用的一种架构
之前已经讲了这一篇文章:Makefile实际用例分析(一)-----比较通用的一种架构 现在这篇其实和那个差的不是很多,只是在布局上有些差别(这个makefile也是论坛上一起讨论过的,囧,忘了哪个论 ...
- Android开发中常用的一些小技巧(转载)
http://www.jb51.net/article/61135.htm Activity.startActivities() 常用于在应用程序中间启动其他的Activity. TextUtils. ...
- JavaScript 中String和int互相转换
在javascript里怎么样才能把int型转换成string型 (1) var num = 0; a = x.toString(); (2) var x = 0; a = x + ...
- 手动安装jar包到Maven本地仓库
接手别人的一个项目,Maven工程,导入后,某些jar包找不到,然后从同事那复制Maven本地仓库的文件夹到我的电脑,发现依旧找不到.问题大致总结为:本地maven仓库存在jar,但是依然报Missi ...
- bzoj1433[ZJOI2009]假期的宿舍(匈牙利)
1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2544 Solved: 1074 [Submit][St ...
- codevs1085数字游戏(环形DP+划分DP )
1085 数字游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单, ...
- Gym - 101982A 2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) A. Exam
题面 题意:你和朋友一起做了n道判断题,现在你知道你们两的答案,也知道你朋友对了k个,问你至少对了几个 题解:假设你和朋友n个答案都一样,那你是不是也对了k个,假设你和朋友有1个答案不一样,是不是,你 ...