loj6278 数列分块入门题2
题意:支持区间加,询问区间中元素排名
维护两个域。一个域维护原序列,一个域维护快内排序序列。
每次修改后更新快内排序序列。
修改时O(sqrt(n)log(sqrt(n)))
询问时O(sqrt(n)log(sqrt(n)))
大概是这个量级吧
#include <bits/stdc++.h>
using namespace std; int bl[],bla,a[],a0[],b[],bi[],n;
int t1,t2,t3,t4; void init() {
bla=sqrt(n);
for (int i=;i<=n;i++)
bl[i]=(i-)/bla+,
bi[i]=(i-)%bla+;
for (int l=;l<=n;l+=bla) {
for(int i=bl[l]*bla-bla+;i<=bl[l]*bla;i++)
a[i]=a0[i];
sort(a+bl[l]*bla-bla+,a+bl[l]*bla+);
}
} void add(int l,int r,int c){
if(bl[l]==bl[r]) {
for(int i=l;i<=r;i++)
a0[i]+=c;
for(int i=bl[l]*bla-bla+;i<=bl[l]*bla;i++)
a[i]=a0[i];
sort(a+bl[l]*bla-bla+,a+bl[l]*bla+);
}
else {
for(int i=l;i<=bl[l]*bla;i++)
a0[i]+=c;
for(int i=bl[l]*bla-bla+;i<=bl[l]*bla;i++)
a[i]=a0[i];
sort(a+bl[l]*bla-bla+,a+bl[l]*bla+);
for(int i=bl[r]*bla-bla+;i<=r;i++)
a0[i]+=c;
for(int i=bl[r]*bla-bla+;i<=bl[r]*bla;i++)
a[i]=a0[i];
sort(a+bl[r]*bla-bla+,a+bl[r]*bla+);
for(int i=bl[l]+;i<bl[r];i++)
b[i]+=c;
}
} int query(int l,int r,long long c){
int ans=;
if(bl[l]==bl[r]) {
for(int i=l;i<=r;i++)
ans+=(a0[i]<c-b[bl[l]]);
}
else {
for(int i=l;i<=bl[l]*bla;i++)
ans+=(a0[i]<c-b[bl[l]]);
for(int i=bl[r]*bla-bla+;i<=r;i++)
ans+=(a0[i]<c-b[bl[r]]);
for(int i=bl[l]+;i<bl[r];i++)
ans+=lower_bound(a+i*bla-bla+,a+i*bla+,c-b[i])-(a+i*bla-bla+);
}
return ans;
} void printblock(){
/*for(int i=1;i<=n/bla+(n%bla)?1:0;i++) {
printf("block %d : %d\n",i,b[i]);
printf(" a0: ");
for(int j=1;j<=bla;j++) printf("%d ",a0[i*bla-bla+j]);
printf("\n");
printf(" a: ");
for(int j=1;j<=bla;j++) printf("%d ",a[i*bla-bla+j]);
printf("\n");
}*/
} int main(){
ios::sync_with_stdio(false);
cin>>n;
for(int i=;i<=n;i++)
cin>>a0[i];
init();
printblock();
for(int i=;i<=n;i++) {
cin>>t1>>t2>>t3>>t4;
if(t1==){
add(t2,t3,t4);
}
else {
printf("%d\n",query(t2,t3,t4*t4));
}
printblock();
}
}
loj6278 数列分块入门题2的更多相关文章
- loj6277 数列分块入门题1
裸题分块. #include <bits/stdc++.h> using namespace std; ],b[],n,m,t1,t2,t3,t4,sq; int main(){ ios: ...
- [LOJ6278]数列分块入门 2
题目大意: 给你一个长度为$n(n\leq 50000)$的序列$A$,支持进行以下两种操作: 1.将区间$[l,r]$中所有数加上$c$: 2.询问区间$[l,r]$中小于$c^2$的数的个数.思路 ...
- [loj6278]数列分块入门2
做法1 以$K$为块大小分块,并对每一个块再维护一个排序后的结果,预处理复杂度为$o(n\log K )$ 区间修改时将整块打上标记,散块暴力修改并归并排序,单次复杂度为$o(\frac{n}{K}+ ...
- 题解——loj6278 数列分块入门2 (分块)
查询小于k的值 注意lower_bound一定要减去查找的起始位置得到正确的位置 调了快两天 淦 #include <cstdio> #include <algorithm> ...
- 数列分块入门九题(三):LOJ6283~6285
Preface 最后一题我一直觉得用莫队是最好的. 数列分块入门 7--区间乘法,区间加法,单点询问 还是很简单的吧,比起数列分块入门 7就多了个区间乘. 类似于线段树,由于乘法的优先级高于加法,因此 ...
- 数列分块入门九题(二):LOJ6280~6282
Preface 个人感觉这中间的三题是最水的没有之一 数列分块入门 4--区间加法,区间求和 这个也是很多数据结构完爆的题目线段树入门题,但是练分块我们就要写吗 修改还是与之前类似,只不过我们要维护每 ...
- 数列分块入门九题(一):LOJ6277~6279
Preface 分块,一个神奇的暴力算法.可以把很多\(O(n^2)\)的数据结构题的暴力优化到常数极小的\(O(n\sqrt n)\).当一些毒瘤题无法用线段树,主席树,平衡树,树状数组...... ...
- LOJ6285 数列分块入门9(分块)
昨天对着代码看了一晚上 然后今天终于在loj上过了 数列分块入门9题撒花★,°:.☆( ̄▽ ̄)/$:.°★ . 然后相当玄学 块的大小调成\(\sqrt{n}\)会TLE,改成150就过了 啧 然后就 ...
- 数列分块入门1-9 By hzwer
声明 持续更新,因为博主也是正在学习分块的知识,我很菜的,菜的抠$jio$ 写在前面 分块是个很暴力的算法,但却比暴力优秀的多,分块算法的时间复杂度一般是根号的,他的主要思想是将一个长度是$n$的数列 ...
随机推荐
- StackExchange.Redis 之 String 类型示例
String类型很简单,就不做示例演示了,这里只贴出Helper类 /// <summary> /// 判断key是否存在 /// </summary> /// <par ...
- 百度大脑发布“AI开发者‘战疫’守护计划”,AI支援抗疫再升级
面对新冠肺炎疫情,AI开发者们正在积极运用算法.算力.软件等“武器”助力抗疫.针对开发者们在疫情防控期间的开发与学习需求,2月6日,百度大脑推出“AI开发者‘战疫’守护计划”, 正在进行疫情防控相关应 ...
- JS中变量、作用域的本质,定义及使用方法
全局作用域和局部作用域 全局作用域 局部作用域:函数作用域 全局作用域在全局和局部都可以访问到,局部作用域只能在局部被访问到 var name="cyy"; function fn ...
- CF #623 div.2
序 话说,总有人认为我是黑别人电脑的(雾??其实,我不黑电脑,我黑手机. T1 此题巨水,比较四个面积就就好了.. /* make by ltao */ #include <iostream&g ...
- mysql-主从备份问题小结
一:防火墙 常用命令 firewall-cmd --state 或 systemctl status firewalld # 查看状态 systemctl start firewalld# 启动 sy ...
- C# monitor keyboard and mouse actions based on MouseKeyHook.
1.Install-package MouseKeyHook 2. using Gma.System.MouseKeyHook; using System; namespace ConsoleApp1 ...
- LNMP+HTTPS
title: "Lnmp + Https" date: 2019-08-28T16:18:20+08:00 draft: true --- 注:我的linux的ip地址为192.1 ...
- opencv —— copyMakeBorder 扩充图像边界
扩充图像边界:copyMakeBorder 函数 在图像处理过程中,因为卷积算子有一定大小,所以就会导致图像一定范围的边界不能被处理,这时就需要将边界进行适当扩充. void copyMakeBord ...
- [TJOI2008] 小偷
TJOI2008小偷 题目背景 一位著名的小偷进入了一个充满宝石的储藏室,这个储藏室是由一连串房间构成的,房间的标号从0开始,想进入第i个房间就必须从第i-1个房间进入,如图: 题目描述 上图为三个房 ...
- C# sqlite 事务提交多个语句,提升插入速度
private SQLiteConnection connection; private SQLiteCommand command; private SQLiteTransaction transa ...