#6281. 数列分块入门 5
题目链接:https://loj.ac/problem/6281
题目描述
给出一个长为 nn 的数列 a_1\ldots a_na1…an,以及 nn 个操作,操作涉及区间开方,区间求和。
输入格式
第一行输入一个数字 nn。
第二行输入 nn 个数字,第 ii 个数字为 a_iai,以空格隔开。
接下来输入 nn 行询问,每行输入四个数字 \mathrm{opt}, l, r, copt,l,r,c,以空格隔开。
若 \mathrm{opt} = 0opt=0,表示将位于 [l, r][l,r] 的之间的数字都开方。对于区间中每个 a_i(l\le i\le r),\: a_i ← \left\lfloor \sqrt{a_i}\right\rfloorai(l≤i≤r),ai←⌊ai⌋
若 \mathrm{opt} = 1opt=1,表示询问位于 [l, r][l,r] 的所有数字的和。
输出格式
对于每次询问,输出一行一个数字表示答案。
样例
样例输入
4
1 2 2 3
0 1 3 1
1 1 4 4
0 1 2 2
1 1 2 4
样例输出
6
2
数据范围与提示
对于 100\%100% 的数据,1 \leq n \leq 50000, -2^{31} \leq \mathrm{others}1≤n≤50000,−231≤others、\mathrm{ans} \leq 2^{31}-1ans≤231−1。
思路:这题棘手的地方在与块中开方的处理,怎么处理呢? 一个区间里每一个数的开方,这个要想不遍历一遍很难,但是遍历的话还要分块干嘛呢? 问题就在开方这个字眼,题目中给的范围里的数,
假设最大 2^32 最多开方6次就变为0或者1了 一个数变为0或者1 他再开方就不会再变化了,试想一下,假如一个区间里所有的数都变为了0或者1 那么还要处理吗 显然是不用的,所以我们就记录哪些区间
里的所有的数都变为了0或者1 是的话就不用处理这个块了,这就是分块在这里的巧妙之处了!!! 下面看代码:
#include<iostream> #include<string.h> #include<math.h> using namespace std; const int maxn=50000+5; int a[maxn]; int block; int bl[maxn]; int sum[maxn]; int flag[maxn]; void Updata_bl(int x) {if(flag[x]) return ;flag[x]=1;sum[x]=0;for(int i=(x-1)*block+1;i<=x*block;i++){a[i]=sqrt(a[i]);sum[x]+=a[i];if(a[i]>1) flag[x]=0;} } void Updata(int l,int r) {for(int i=l;i<=min(bl[l]*block,r);i++){sum[bl[i]]-=a[i];a[i]=sqrt(a[i]);sum[bl[i]]+=a[i];}if(bl[l]!=bl[r]){for(int i=(bl[r]-1)*block+1;i<=r;i++){sum[bl[r]]-=a[i];a[i]=sqrt(a[i]);sum[bl[r]]+=a[i];}}for(int i=bl[l]+1;i<=bl[r]-1;i++){Updata_bl(i);} } void Query(int l,int r) {int ans=0;for(int i=l;i<=min(bl[l]*block,r);i++) ans+=a[i];if(bl[l]!=bl[r]){for(int i=(bl[r]-1)*block+1;i<=r;i++) ans+=a[i];}for(int i=bl[l]+1;i<=bl[r]-1;i++) ans+=sum[i];cout<<ans<<endl; } int main() {int n;int opt,l,r,c;cin>>n ;memset(sum,0,sizeof(sum));memset(flag,0,sizeof(flag));block=sqrt(n);for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++){bl[i]=(i-1)/block+1;sum[bl[i]]+=a[i];}for(int i=1;i<=n;i++){cin>>opt>>l>>r>>c;if(opt==0) Updata(l,r);else Query(l,r);} }
转载于:https://www.cnblogs.com/caijiaming/p/10327152.html
#6281. 数列分块入门 5相关推荐
- 【分块】#6281. 数列分块入门 5(区间开方,区间求和)
啊啊啊,分块的下标别写错了 #include<cstdio> #include<algorithm> #include<cstring> #include<c ...
- LOJ#6281. 数列分块入门 5
内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计讨论 1 测试数据 题目描述 给出一个长为 nnn 的数列,以及 n ...
- LOJ 6281 数列分块入门 5
Loj_6281 自己写分块时总是对于一个块内的修改写错 wa了好几次 自我感觉对于块内修改的操作,再封装一个函数是很方便的 #include <iostream> #include &l ...
- 数列分块入门 (1 ~ 7)
分块 6277. 数列分块入门 1 分块思想 我们把每m个元素分成一块,所以我们总共的块数就是n/mn / mn/m块,一般情况下我们取m=nm = \sqrt{n}m=n.对于区间加操作,我们可以 ...
- 「分块」数列分块入门1 – 9
ACM模板 放暑假了,回归!!! 自己不会写暴力,而且好久没写代码了,于是学学分块的优雅暴力~ 「分块入门-LibreOJ」 「分块」数列分块入门1 – 9 by hzwer 数列简单分块问题实际上有 ...
- LOJ——#6277. 数列分块入门 1
~~推荐播客~~ 「分块」数列分块入门1 – 9 by hzwer 浅谈基础根号算法--分块 博主蒟蒻,有缘人可直接观摩以上大佬的博客... #6277. 数列分块入门 1 题目大意: 给出一个长为 ...
- 【分块入门】LOJ 数列分块入门 1 - 9 (学习更新……)
dl题解 _「分块」数列分块入门1 – 9 by hzwer LOJ #6277. 数列分块入门 1 题意:给出一个长为n的数列,以及n个操作,操作涉及区间加法,单点查值. 时间限制:100ms 分块 ...
- #6279. 数列分块入门 3(区间修改,查询权值前驱)
#6279. 数列分块入门 3 这是使用hzwer建议的set写的分块代码,set自动排序,支持二分查找,但是常数较大,比我下面写的用vector实现的分块慢了三倍,空间大了10倍. #include ...
- LOJ 数列分块入门6
LOJ 数列分块入门6 题目: 题目 题解: 我都不懂这题为什么要用分块... ... 直接vector就好了... 但是如果有区间修改的话就不行了.所以这题是启示我们也可以动态分块.具体就是每次插入 ...
最新文章
- 分布式存储系统考虑因素-一致性
- ORACLE内存结构简介
- Sql:成功解决将sql输出的datetime时间格式转为常规格式
- sql 2008 R2添加对MySql的远程服务器链接
- .net持续集成cake篇之cake介绍及简单示例
- MongoDB副本集权限重置
- 为什么手机网速太慢_手机明明是满格信号,为什么网速却非常慢?原来是这些功能在捣鬼...
- 翁恺java答案第五周_[JAVA]翁恺老师零基础学java语言第五周素数例题中continue的困惑...
- matlab 四种取整函数(fix floor ceil round)的区别
- 【转载】【凯子哥带你学Framework】Activity界面显示全解析(下)
- STM32f103正点原子小白 FLYMcu串口
- 汉王手写输入法android,汉王手写输入法
- 劳动节前得空半天-总结一下最近使用的LINUX命令
- 数据流中的第 K 大元素
- mybatis配置文件<mapper>飘红
- win10无法修改默认浏览器(闪退)解决方法//修改默认浏览器闪退解决办法,亲测实用有效!!!!////默认浏览器被修改成Internet explorer了,想修改发现改不了,一点就闪退
- 快来!火星车数字人带你探索火星上的“中国印记”
- C++ Builder运行时在FireMonkey里使用TLang动态切换界面语言
- 宽带计费认证有何特色?这方面很优秀
- 使用springer nature模板页眉显示标题太长超出页面解决
热门文章
- 彻底解决Python3写爬虫或网站时的乱码问题
- 使用Quartus进行功能仿真时出现“testbench_vector_input_file option does not exist”的解决方法
- idea actiBPM插件生成png文件 (解决没有Diagrams或Designer选项问题)
- 美团搜索推荐多业务商品排序探索与实践
- 【研报分享】华为鸿蒙深度研究.pdf(附下载链接)
- “进化”的搜索方式:揭秘微软语义搜索背后的技术
- (Object detection)目标检测从入门到精通——第一部分
- 五年引用量最高的10大AI论文:Adam第一,Transformer上榜,竟然没有ResNet?
- 机器学习3/100天-多特征线形回归
- 数字信号处理5:FIR滤波器设计