[LOJ6281]数列分块入门 5
题目大意:
给你一个长度为$n(n\leq50000)$的序列$A(0\leq A_i<2^{31})$,支持进行以下两种操作:
1.将区间$[l,r]$中所有数开方;
2.询问区间$[l,r]$的和。
思路:
分块。
因为当一个区间内的所有$A_i$都$\leq1$时,操作1对答案没有影响,因此我们可以记录每个区间是否还有操作的必要。如果还有大于$1$的数,就暴力进行操作,否则跳过。易证每个区间最多开方4次。
#include<cmath>
#include<cstdio>
#include<cctype>
#include<algorithm>
typedef long long int64;
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],bel[N],begin[N],end[N],max[N];
int64 sum[N];
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]=sqrt(val[i]);
sum[bel[l]]=max[bel[l]]=;
for(register int i=begin[bel[l]];i<=end[bel[l]];i++) {
sum[bel[l]]+=val[i];
max[bel[l]]=std::max(max[bel[l]],val[i]);
}
return;
}
for(register int i=l;bel[i]==bel[l];i++) val[i]=sqrt(val[i]);
for(register int i=r;bel[i]==bel[r];i--) val[i]=sqrt(val[i]);
for(register int i=bel[l]+;i<bel[r];i++) {
if(max[i]==) continue;
for(register int j=begin[i];j<=end[i];j++) val[j]=sqrt(val[j]);
}
for(register int i=bel[l];i<=bel[r];i++) {
if(max[i]==) continue;
sum[i]=max[i]=;
for(register int j=begin[i];j<=end[i];j++) {
sum[i]+=val[j];
max[i]=std::max(max[i],val[j]);
}
}
}
inline int64 query(const int &l,const int &r) {
int64 ret=;
if(bel[l]==bel[r]) {
for(register int i=l;i<=r;i++) ret+=val[i];
return ret;
}
for(register int i=l;bel[i]==bel[l];i++) ret+=val[i];
for(register int i=r;bel[i]==bel[r];i--) ret+=val[i];
for(register int i=bel[l]+;i<bel[r];i++) ret+=sum[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;
if(!begin[bel[i]]) begin[bel[i]]=i;
end[bel[i]]=i;
sum[bel[i]]+=val[i];
max[bel[i]]=std::max(max[bel[i]],val[i]);
}
for(register int i=;i<n;i++) {
const int opt=getint(),l=getint(),r=getint(),c=getint();
if(opt) {
printf("%lld\n",query(l,r));
} else {
modify(l,r,c);
}
}
return ;
}
[LOJ6281]数列分块入门 5的更多相关文章
- 题解——loj6281 数列分块入门5 (分块)
分块 若块内最大值为0或1,则不用再开方 然后暴力修改 可以证明,如果开方后向下取整,则最多开方4次一个数就会变成0或1 #include <cstdio> #include <cm ...
- 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 测试数据 题目描述 给出一 ...
- LOJ #6285. 数列分块入门 9-分块(查询区间的最小众数)
#6285. 数列分块入门 9 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给 ...
- LOJ #6284. 数列分块入门 8-分块(区间查询等于一个数c的元素,并将这个区间的所有元素改为c)
#6284. 数列分块入门 8 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给出 ...
随机推荐
- XML转译字符
&(逻辑与) & <(小于) < >(大于) > "(双引号) " '(单引号) ' [/size]
- django orm 之makemigrations和migrate命令
makemigrations:将模型的更改生成迁移脚本文件.模型所在的app,必须放在settings.py中的INSTALLED_APPS列表中.这个命令有以下几个常用选项: 1.app_label ...
- [译]在Linux中清空或删除大文件内容的5种方法
原文来源: https://www.tecmint.com/empty-delete-file-content-linux/ 有时,在处理Linux终端中的文件时,您可能希望清除文件的内容,而无需使用 ...
- C++寒假学习计划
课程 中国大学mooc西北工业大学c++程序设计 理由 本课程有48节,章节分类清晰,由许多小知识块组成,条例清晰便于学习,由基础开始,由浅入深,适合我这种小白. 计划 从2.8号至2.28除去2.1 ...
- v-if与v-show区别
在v-show中,元素是一直存在的,当v-show为false时,元素display:none只是隐藏了而已. v-if 作用:判断是否加载固定的内容,如果为真,则加载:为假时,则不加载. 用处:用在 ...
- JZOJ 5280 膜法师
好啰嗦......还好作者给了一句话题意,不然光看题就很耗费时间. 样例输入: 1 6 3 1 78 69 55 102 233 666 样例输出: 1 2 3 4 5 6 11 数据范围: 思路: ...
- [codeforces] 578C Weakness and Poorness || 三分
原题 题目定义了两个变量: poorness表示一个区间内和的绝对值. weakness表示一个所有区间最大的poornesss 题目要求你求一个x使得 a1 − x, a2 − x, ..., an ...
- TortoiseSVN里checkout depth各选项的含义
代表四种检出深度: 1.Fully recursive——全递归:检出完整的目录树,包含所有的文件或子目录.2.Immediate children,including folders——直接子节点, ...
- post传参部分数据丢失
tomcat获取post传的参数,只接收到前半部分参数,后半部分参数没有接收到 可能的原因是: tomcat中maxParameterCount是用来限制请求中的最大参数量,默认是10000,如果超过 ...
- [ CodeVS冲杯之路 ] P1011
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1011/ 一开始以为是道数学题,列出了一个公式 后面验证,发现只能推出第一次,后面的还需要迭代,推翻这个公式 又去瞟了一 ...