题目描述

给出一个长为 nnn 的数列 a1…ana_1\ldots a_na1​…an​,以及 nnn 个操作,操作涉及区间开方,区间求和。

输入格式

第一行输入一个数字 nnn。

第二行输入 nnn 个数字,第 i 个数字为 aia_iai​,以空格隔开。

接下来输入 nnn 行询问,每行输入四个数字 opt,l,r,c\mathrm{opt}, l, r, copt,l,r,c,以空格隔开。

若 opt=0\mathrm{opt} = 0opt=0,表示将位于 [l,r][l, r][l,r] 的之间的数字都开方。对于区间中每个 ai(l≤i≤r), ai←⌊ai⌋a_i(l\le i\le r),\: a_i ← \left\lfloor \sqrt{a_i}\right\rfloorai​(l≤i≤r),ai​←⌊ai​​⌋

若 opt=1\mathrm{opt} = 1opt=1,表示询问位于 [l,r][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\%100% 的数据,1≤n≤50000,−231≤others 1 \leq n \leq 50000, -2^{31} \leq \mathrm{others}1≤n≤50000,−231≤others、ans≤231−1 \mathrm{ans} \leq 2^{31}-1ans≤231−1。

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3
  4 #define F(i,a,b) for(int i=a;i<=b;i++)
  5 #define D(i,a,b) for(int i=a;i>=b;i--)
  6 #define ms(i,a)  memset(a,i,sizeof(a))
  7 #define LL       long long
  8 #define st(x)    ((x-1)*B+1)
  9 #define ed(x)    min(x*B,n)
 10 #define bl(x)    ((x-1)/B+1)
 11
 12 int inline read(){
 13     int x=0,w=0; char c=getchar();
 14     while (c<'0' || c>'9') w+=c=='-',c=getchar();
 15     while (c>='0' && c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
 16     return w? -x: x;
 17 }
 18
 19 int const maxn=50003;
 20
 21 int B,n,a[maxn],t[300];
 22
 23 LL sum[300];
 24
 25 void update(int l,int r){
 26     int x=bl(l);
 27     int y=bl(r);
 28     if (x==y){
 29         if(t[x]>0) {
 30             F(i,l,r) if(a[i]>1) {
 31                 sum[x]-=a[i];
 32                 a[i]=(int)sqrt(a[i]);
 33                 sum[x]+=a[i];
 34                 if(a[i]==0 || a[i]==1) t[x]--;
 35             }
 36         }
 37     }else {
 38         if(t[x]>0){
 39             F(i,l,ed(x)) if(a[i]>1){
 40                 sum[x]-=a[i];
 41                 a[i]=(int) sqrt(a[i]);
 42                 sum[x]+=a[i];
 43                 if(a[i]==0 || a[i]==1) t[x]--;
 44             }
 45         }
 46         if(t[y]>0){
 47             F(i,st(y),r) if(a[i]>1){
 48                 sum[y]-=a[i];
 49                 a[i]=(int) sqrt(a[i]);
 50                 sum[y]+=a[i];
 51                 if(a[i]==0 || a[i]==1) t[y]--;
 52             }
 53         }
 54         F(i,x+1,y-1){
 55             if(t[i]==0) continue;
 56             F(j,st(i),ed(i)) {
 57                 if(a[j]>1){
 58                     sum[i]-=a[j];
 59                     a[j]=(int) sqrt(a[j]);
 60                     sum[i]+=a[j];
 61                     if(a[j]==0 || a[j]==1) t[i]--;
 62                 }
 63             }
 64         }
 65     }
 66 }
 67
 68 LL query(int l,int r){
 69     int x=bl(l);
 70     int y=bl(r);
 71     LL ans=0;
 72     if ( x==y){
 73         F(i,l,r) ans+=a[i];
 74     }else {
 75         F(i,l,ed(x)) ans+=a[i];
 76         F(i,st(y),r) ans+=a[i];
 77         F(i,x+1,y-1) ans+=sum[i];
 78     }
 79     return ans;
 80 }
 81 int main(){
 82     n=read(); B=(int) sqrt(n);
 83     F(i,1,n) a[i]=read();
 84     F(i,1,bl(n)) {
 85         t[i]=ed(i)-st(i)+1;
 86         F(j,st(i),ed(i)) {
 87             sum[i]+=a[j];
 88             if(a[j]==0 || a[j]==1) t[i]--;
 89         }
 90     }
 91     F(i,1,n){
 92         int x=read();
 93         int l=read();
 94         int r=read();
 95         int c=read();
 96         if(x==0) update(l,r);
 97         else printf("%lld\n",query(l,r));
 98     }
 99     return 0;
100 }

View Code

转载于:https://www.cnblogs.com/ZJXXCN/p/9704072.html

Loj 6281. 数列分块入门 5相关推荐

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

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

  2. LOJ 6281 数列分块入门 5

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

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

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

  4. LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)

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

  5. LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))...

    #6279. 数列分块入门 3 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 3 题目描述 给出一 ...

  6. #6281. 数列分块入门 5

    题目链接:https://loj.ac/problem/6281 题目描述 给出一个长为 nn 的数列 a_1\ldots a_na1​-an​,以及 nn 个操作,操作涉及区间开方,区间求和. 输入 ...

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

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

  8. loj #6278. 数列分块入门 2

    题目 题解 区间修改,询问区间小于c的个数.分块排序,用vector.至于那个块的大小,好像要用到均值不等式 我不太会...就开始一个个试,发现siz=sqrt(n)/4时最快!!!明天去学一下算分块 ...

  9. LOJ#6282. 数列分块入门 6

    一个动态的插入过程,还需要带有查询操作. 我可以把区间先分块,然后每个块块用vector来维护它的插入和查询操作,但是如果我现在这个块里的vector太大了,我可能的操作会变的太大,所以这时候我需要把 ...

  10. LOJ#6283. 数列分块入门 7

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

最新文章

  1. Windows下Git库的创建
  2. 多云世界中的SD-WAN—Vecloud
  3. 使用UIWebView加载网页
  4. 无线网卡共享Internet访问到电脑有线接口注意事项
  5. linux服务器下降,linux - 远程升级Ubuntu:如何最大程度地降低丢失服务器的风险? - Ubuntu问答...
  6. Java基础学习总结(130)——使用WebSocket导致jUnit单元测试报No suitable default RequestUpgradeStrategy found错误的解决方法
  7. ❤️一分钟学会python条件语句❤️
  8. 专利申请模板,包含实用新型专利和发明专利模板
  9. 苹果电脑有哪些很优秀的录屏软件呢?
  10. 值得收藏的资源网站大全
  11. Java基础——时间和日期
  12. 【阿里云盘】2022付费考研课程
  13. 思科交换机指示灯全解
  14. Java环境下运行fastqc_在Ubuntu上安装FastQC
  15. python动物重量排序详解
  16. 软件测试工作中需要的Linux知识,一篇文章就够了
  17. SVN:客户端与服务器端安装、配置与使用
  18. idea怎样创建一个java项目?
  19. 解决邮件客户端QQ Mail及Thunderbird无法登入Outlook的问题
  20. 搜索引擎排名都选乐云seo_百度官网排名-搜索引擎算法优化

热门文章

  1. pythonsubprocess执行多条shell命令_Python获取shell管道数据/输入的2种方法: subprocess子进程 ......
  2. go语言中金币分配训练--pm
  3. java jdbc连接_CPT201 ODBC与JDBC比较
  4. php做一个微信退款,php实现微信支付之退款功能
  5. python负数错误异常类型_十七、深入Python异常处理
  6. 堆排序和优先队列的python实现
  7. HDU-1159-Common Subsequence
  8. 关于程序化交易的点点知识
  9. linux 杀掉僵尸进程 (zombie process, defunct)
  10. android 安卓editext默认弹出英文输入法,只能输入英文与数字