题目链接: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相关推荐

  1. 【分块】#6281. 数列分块入门 5(区间开方,区间求和)

    啊啊啊,分块的下标别写错了 #include<cstdio> #include<algorithm> #include<cstring> #include<c ...

  2. LOJ#6281. 数列分块入门 5

    内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计讨论 1 测试数据 题目描述 给出一个长为 nnn 的数列,以及 n ...

  3. LOJ 6281 数列分块入门 5

    Loj_6281 自己写分块时总是对于一个块内的修改写错 wa了好几次 自我感觉对于块内修改的操作,再封装一个函数是很方便的 #include <iostream> #include &l ...

  4. 数列分块入门 (1 ~ 7)

    分块 6277. 数列分块入门 1 分块思想 我们把每m个元素分成一块,所以我们总共的块数就是n/mn / mn/m块,一般情况下我们取m=nm = \sqrt{n}m=n​.对于区间加操作,我们可以 ...

  5. 「分块」数列分块入门1 – 9

    ACM模板 放暑假了,回归!!! 自己不会写暴力,而且好久没写代码了,于是学学分块的优雅暴力~ 「分块入门-LibreOJ」 「分块」数列分块入门1 – 9 by hzwer 数列简单分块问题实际上有 ...

  6. LOJ——#6277. 数列分块入门 1

    ~~推荐播客~~ 「分块」数列分块入门1 – 9 by hzwer 浅谈基础根号算法--分块 博主蒟蒻,有缘人可直接观摩以上大佬的博客... #6277. 数列分块入门 1 题目大意: 给出一个长为 ...

  7. 【分块入门】LOJ 数列分块入门 1 - 9 (学习更新……)

    dl题解 _「分块」数列分块入门1 – 9 by hzwer LOJ #6277. 数列分块入门 1 题意:给出一个长为n的数列,以及n个操作,操作涉及区间加法,单点查值. 时间限制:100ms 分块 ...

  8. #6279. 数列分块入门 3(区间修改,查询权值前驱)

    #6279. 数列分块入门 3 这是使用hzwer建议的set写的分块代码,set自动排序,支持二分查找,但是常数较大,比我下面写的用vector实现的分块慢了三倍,空间大了10倍. #include ...

  9. LOJ 数列分块入门6

    LOJ 数列分块入门6 题目: 题目 题解: 我都不懂这题为什么要用分块... ... 直接vector就好了... 但是如果有区间修改的话就不行了.所以这题是启示我们也可以动态分块.具体就是每次插入 ...

最新文章

  1. 分布式存储系统考虑因素-一致性
  2. ORACLE内存结构简介
  3. Sql:成功解决将sql输出的datetime时间格式转为常规格式
  4. sql 2008 R2添加对MySql的远程服务器链接
  5. .net持续集成cake篇之cake介绍及简单示例
  6. MongoDB副本集权限重置
  7. 为什么手机网速太慢_手机明明是满格信号,为什么网速却非常慢?原来是这些功能在捣鬼...
  8. 翁恺java答案第五周_[JAVA]翁恺老师零基础学java语言第五周素数例题中continue的困惑...
  9. matlab 四种取整函数(fix floor ceil round)的区别
  10. 【转载】【凯子哥带你学Framework】Activity界面显示全解析(下)
  11. STM32f103正点原子小白 FLYMcu串口
  12. 汉王手写输入法android,汉王手写输入法
  13. 劳动节前得空半天-总结一下最近使用的LINUX命令
  14. 数据流中的第 K 大元素
  15. mybatis配置文件<mapper>飘红
  16. win10无法修改默认浏览器(闪退)解决方法//修改默认浏览器闪退解决办法,亲测实用有效!!!!////默认浏览器被修改成Internet explorer了,想修改发现改不了,一点就闪退
  17. 快来!火星车数字人带你探索火星上的“中国印记”
  18. C++ Builder运行时在FireMonkey里使用TLang动态切换界面语言
  19. 宽带计费认证有何特色?这方面很优秀
  20. 使用springer nature模板页眉显示标题太长超出页面解决

热门文章

  1. 彻底解决Python3写爬虫或网站时的乱码问题
  2. 使用Quartus进行功能仿真时出现“testbench_vector_input_file option does not exist”的解决方法
  3. idea actiBPM插件生成png文件 (解决没有Diagrams或Designer选项问题)
  4. 美团搜索推荐多业务商品排序探索与实践
  5. 【研报分享】华为鸿蒙深度研究.pdf(附下载链接)
  6. “进化”的搜索方式:揭秘微软语义搜索背后的技术
  7. (Object detection)目标检测从入门到精通——第一部分
  8. 五年引用量最高的10大AI论文:Adam第一,Transformer上榜,竟然没有ResNet?
  9. 机器学习3/100天-多特征线形回归
  10. 数字信号处理5:FIR滤波器设计