[LOJ6278]数列分块入门 2
题目大意:
给你一个长度为$n(n\leq 50000)$的序列$A$,支持进行以下两种操作:
1.将区间$[l,r]$中所有数加上$c$;
2.询问区间$[l,r]$中小于$c^2$的数的个数。
思路:
分块。
对于整块的数据打标记,零散的数据直接修改。同时维护同一块中从小到大的顺序,统计时对于同一块中的数二分答案,零散的数直接统计。
#include<cmath>
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<functional>
inline int getint() {
register char ch;
register bool neg=false;
while(!isdigit(ch=getchar())) if(ch=='-') neg=true;
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return neg?-x:x;
}
const int N=;
int val[N],s[N],tag[N],bel[N],begin[N],end[N];
inline bool cmp(const int &a,const int &b) {
return val[a]+tag[bel[a]]<val[b]+tag[bel[b]];
}
inline void modify(const int &l,const int &r,const int &c) {
if(bel[l]==bel[r]) {
for(register int i=l;i<=r;i++) val[i]+=c;
std::sort(&s[begin[bel[l]]],&s[end[bel[l]]]+,cmp);
return;
}
for(register int i=l;bel[i]==bel[l];i++) val[i]+=c;
std::sort(&s[begin[bel[l]]],&s[end[bel[l]]]+,cmp);
for(register int i=r;bel[i]==bel[r];i--) val[i]+=c;
std::sort(&s[begin[bel[r]]],&s[end[bel[r]]]+,cmp);
for(register int i=bel[l]+;i<bel[r];i++) tag[i]+=c;
}
inline int query(const int &l,const int &r,const int &c) {
int ret=;
val[]=c*c;
if(bel[l]==bel[r]) {
for(register int i=l;i<=r;i++) {
if(val[i]+tag[bel[i]]<val[]) ret++;
}
return ret;
}
for(register int i=l;bel[i]==bel[l];i++) {
if(val[i]+tag[bel[i]]<val[]) ret++;
}
for(register int i=r;bel[i]==bel[r];i--) {
if(val[i]+tag[bel[i]]<val[]) ret++;
}
for(register int i=bel[l]+;i<bel[r];i++) {
ret+=std::lower_bound(&s[begin[i]],&s[end[i]]+,,cmp)-&s[begin[i]];
}
return ret;
}
int main() {
const int n=getint(),block=sqrt(n);
for(register int i=;i<=n;i++) {
val[i]=getint();
bel[i]=i/block;
s[i]=i;
if(!begin[bel[i]]) begin[bel[i]]=i;
end[bel[i]]=i;
}
for(register int i=;i<=bel[n];i++) {
std::sort(&s[begin[i]],&s[end[i]]+,cmp);
}
for(register int i=;i<n;i++) {
const int opt=getint(),l=getint(),r=getint(),c=getint();
if(opt) {
printf("%d\n",query(l,r,c));
} else {
modify(l,r,c);
}
}
return ;
}
[LOJ6278]数列分块入门 2的更多相关文章
- [loj6278]数列分块入门2
做法1 以$K$为块大小分块,并对每一个块再维护一个排序后的结果,预处理复杂度为$o(n\log K )$ 区间修改时将整块打上标记,散块暴力修改并归并排序,单次复杂度为$o(\frac{n}{K}+ ...
- 题解——loj6278 数列分块入门2 (分块)
查询小于k的值 注意lower_bound一定要减去查找的起始位置得到正确的位置 调了快两天 淦 #include <cstdio> #include <algorithm> ...
- loj6278 数列分块入门题2
题意:支持区间加,询问区间中元素排名 维护两个域.一个域维护原序列,一个域维护快内排序序列. 每次修改后更新快内排序序列. 修改时O(sqrt(n)log(sqrt(n))) 询问时O(sqrt(n) ...
- LOJ6277~6285 数列分块入门
Portals 分块需注意的问题 数组大小应为,因为最后一个块可能会超出的范围. 当操作的区间在一个块内时,要特判成暴力修改. 要清楚什么时候应该+tag[t] 数列分块入门 1 给出一个长为的数列, ...
- 数列分块入门九题(三):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就过了 啧 然后就 ...
- LOJ 6277:数列分块入门 1(分块入门)
#6277. 数列分块入门 1 内存限制:256 MiB时间限制:100 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计讨论 3 测试数据 题目描述 给出一 ...
随机推荐
- ClassNotFoundException: http.nio.NHttpClientEventHandle
解决方案是打开maven仓库中的jar包看看报错的类所对应版本的类存在不存在,若不存在就换个版本的jar包
- Hastable和Dictionary以及ArrayList和(List,LinkedList,数组)的区别
Hastable和Dictionary的区别:(键值对) 1:单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分. 2:多线程程序中推荐使用 Hashtabl ...
- (原)Unreal 渲染模块 渲染流程
@author:白袍小道 浏览分享随缘,评论不喷亦可. 扯淡部分: 在temp中,乱七八糟的说了下大致的UE过程.下面我们还是稍微别那么任性,一步步来吧. UE渲染模块牵扯到场景遍历. ...
- zkCli.sh客户端其他命令简介
quit 退出 connect host:port 连接到其他ZooKeeper服务器 close 关闭连接 history 操作指令历史 redo 重复执行某个指令, 使用格式为 redo id, ...
- 【BZOJ1179】[Apio2009]Atm (tarjan+SPFA)
显而易见的tarjan+spfa...不解释了 ; type edgetype=record toward,next:longint; end; var edge1,edge2:..maxn] of ...
- 使用PowerShell登陆多台Windows,测试DCAgent方法
目标: 需要1台PC用域账户远程登陆10台PC,每台登陆后的PC执行发送敏感数据的操作后,再logoff. 在DCAgent服务器上,查看这10个用户每次登陆时,DCAgent是否能获取到登陆信息(I ...
- DHTMLX 表格组件(dhtmlxGrid )使用介绍
String sql = select {s.*} from t_student s where s.age22; SQLQuery slqQuery = session.createSQLQuery ...
- 《R语言实战》读书笔记--第三章 图形初阶(二)
3.4添加文本.自定义坐标轴和图例 很多作图函数可以设置坐标轴和文本标注.比如标题.副标题.坐标轴标签.坐标轴范围等.需要注意的是并不是所有的绘图函数都有上述的参数,需要进行验证.可以将一些默认的参数 ...
- 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
转载自:http://blog.csdn.net/v_july_v/article/details/8203674/ 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说: ...
- Codeforces 938.B Run For Your Prize
B. Run For Your Prize time limit per test 1 second memory limit per test 256 megabytes input standar ...