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$的数列 ...
随机推荐
- Django3的安装以及web项目的创建
cmd 直接输入:pip install -i https://pypi.douban.com/simple django 2.检测是否安装成功:用到的命令:import django ,检测版本 ...
- PMP--1.6 项目经理
本节都是理论的东西,可以在管理没有思路的或者管理陷入困境的时候当做提升或解决问题的思路来看. 一.项目经理 1. 项目经理.职能经理与运营经理的区别 (1)职能经理专注于对某个职能领域或业务部门的管理 ...
- Python——面向对象,简易学生信息管理系统
一.概述 1.1涉及到的知识点 项目开发:创建项目,创建包,导入包: 面向对象:静态方法,继承,内置函数,自定义函数: 数据类型:列表,字典,字符串.列表.字典的转换和自动生成导向: 异常处理:捕获异 ...
- java 企业 网站源码 模版 屏幕自适应 有前后台 springmvc SSM 生成静态化
前台: 支持四套模版, 可以在后台切换 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以访问 ...
- 【redis】基于redis实现分布式并发锁
基于redis实现分布式并发锁(注解实现) 说明 前提, 应用服务是分布式或多服务, 而这些"多"有共同的"redis"; (2017-12-04) 笑哭, 写 ...
- 整理了Linux常用命令变量
查看信息命令 ls 查看当前目录下面的所有文件 -a 显示所有文件(包括隐藏文件) -l 显示所有文件(包括文件的详细信息) 格式: ls 参数 目录路径(绝对/相对) cd 切换目录 格式: cd ...
- vuex的state选项rootState.js
说明:本文做为vuex学习详细解(主页目录 配置主页:vuex学习配置详解(目录rootState.js文件如下 作用声明 vuex的state选项常量,并导出默认为state /** * 此文件除声 ...
- css3基础-文本与字体+转换+过渡+动画+案例
Css3文本与字体 文本阴影 h1 { text-shadow: 5px 5px 5px red; } word-break换行: h1:nth-child(1) { word-break: no ...
- css的网页布局案例
常见行布局: 导航使用position:fixed固定住 导航会脱离文档流,不占据空间 导致下面的元素上移,因此需要将下面的元素的padding-top设置成导航的高度 <!DOCTYPE ht ...
- day7 基础数据类型&集合&深浅拷贝
基础数据类型汇总: #!/usr/bin/env python # -*- coding:utf-8 -*- ''' str int ''' # str s = ' a' print(s.isspac ...