奇怪的题目背景所误入的 是回忆的教室所响起的 是通向绝望的计时器所到达的 是开始的结束你能相信吗?
题目背景最近礼奈酱学会了线段树和树状数组两种数据结构由于礼奈酱上课听的很认真,所以她知道树状数组常见的操作是 单点加区间求和线段树常见的操作是 区间加区间求和但她认为自己已经不是小学生了,觉得只能维护加法标记这件事简直太蠢了~所以她将题目加强了一下,但她发现自己不会写这题的标程了因为 rina酱非常可爱,所以你要帮她写这题的标程
题意描述礼奈给了你一列数(n个)要求支持以下两类操作共m次区间求和 [L,R]区间开平方[L,R]即将区间内每一个数Ai修改为 Ai−−√Ai 向下取整输入输出格式第一行 n第二行 m第三行n个数 表示 Ai接下来m行每行三个数 op,L,Rop=1 为1操作op=2 为2操作对于每次1操作,请输出一行答案
样例输入4
1 100 5 5
5
1 1 2
2 1 2
1 1 2
2 2 3
1 1 4样例输出101
11
11数据范围所有数据点保证n,m≤2∗10^6,Ai≤10^9本题中可以使用树状数组或线段树,大体思想是当一个数开方到1时,后面无论怎样开方都还是1,相同的,0开方后也还是0。那么只要去处理有大于1的数的区间即可。
由于题目中的每一个元素,最多只会开方5次,所以这道题就不会超时了。(另:树状数组需要并查集来辅助,将每个数的父亲设为它右边第一个不小于1的数,每次更新时将它的父亲并到它右边的数的父亲上,这样并查集数组会有递推性,即可以通过这种手段不断递推找到右边第一个不小于1的数)。Code:
//线段树
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<ctime>
using namespace std;
const int N=100005;
int n,m,a[N];
long long sum[N*4],mx[N*4];
void build(int k,int l,int r){if(l==r){sum[k]=a[l];mx[k]=sum[k];return ;}int mid=(l+r)>>1;build(k*2,l,mid);build(k*2+1,mid+1,r);sum[k]=sum[k*2]+sum[k*2+1];mx[k]=max(mx[k*2],mx[k*2+1]);
}long long query(int k,int l,int r,int x,int y){if(l>=x&&r<=y){return sum[k];}int mid=(l+r)>>1;long long res=0;if(x<=mid){res+=query(k*2,l,mid,x,y);}if(mid<y){res+=query(k*2+1,mid+1,r,x,y);}return res;
}
void update(int k,int l,int r,int x,int y){if(mx[k]<=1){return;}if(l==r){sum[k]=sqrt(sum[k]);mx[k]=sum[k];return;}int mid=(l+r)>>1;if(mid>=x){update(k*2,l,mid,x,y);}if(mid<y){update(k*2+1,mid+1,r,x,y);}sum[k]=sum[k*2]+sum[k*2+1];mx[k]=max(mx[k*2],mx[k*2+1]);
}
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}build(1,1,n);scanf("%d",&m);while(m--){int opt,l,r;scanf("%d%d%d",&opt,&l,&r);if(l>r){swap(l,r);}if(opt==1){printf("%lld\n",query(1,1,n,l,r));}else if(opt==2){update(1,1,n,l,r);}}return 0;
}
//树状数组
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<ctime>
using namespace std;
const int N=100005;
int n,m,a[N],fa[N],opt,l,r;
long long c[N];
int find(int x){if(x==fa[x]){return x;}return fa[x]=find(fa[x]);
}
int lowbit(int x){return x&-x;
}
void update(int i,int val){while(i<=n){c[i]+=val;i+=lowbit(i);}
}
long long sum(int i){long long ans=0;while(i){ans+=c[i];i-=lowbit(i);}return ans;
}
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);update(i,a[i]);}scanf("%d",&m);for(int i=1;i<=n;i++){if(a[i]<=1){fa[i]=i+1;}else{fa[i]=i;}}fa[n+1]=n+1;while(m--){scanf("%d%d%d",&opt,&l,&r);if(opt==1){printf("%lld\n",sum(r)-sum(l-1));}else if(opt==2){for(int i=l;i<=r;i=find(i+1)){int res=(int)sqrt(a[i]);update(i,res-a[i]);a[i]=res;if(a[i]<=1){fa[i]=find(i+1);}}}}return 0;
}

转载于:https://www.cnblogs.com/ukcxrtjr/p/11198492.html

UOJ #496.秋蝉鸣泣之时相关推荐

  1. UOJ#7. 【NOI2014】购票 | 线段树 凸包优化DP

    题目链接 UOJ #7 题解 首先这一定是DP!可以写出: \[f[i] = \min_{ancestor\ j} \{f[j] + (d[j] - d[i]) * p[i] + q[i]\}\] 其 ...

  2. UOJ.311.[UNR#2]积劳成疾(DP)

    UOJ 序列中的每个位置是等价的.直接令\(f[i][j]\)表示,\(i\)个数的序列,最大值不超过\(j\)的所有序列每个长为\(k\)的子区间最大值的乘积的和. 由\(j-1\)转移到\(j\) ...

  3. Android5.1.1 - zygote中获取系统服务时抛出异常

    为什么80%的码农都做不了架构师?>>>    Android5.1.1 - zygote中获取系统服务时抛出异常:TransactionTooLargeException @(An ...

  4. UOJ #514 [UR #19]通用测评号 (容斥原理、DP)

    题目链接 http://uoj.ac/contest/51/problem/514 题解 神仙们都好强啊. 本题有好多做法,但是第一步都是一样的: 题目中的"每次选一个没有达到 \(a\) ...

  5. BZOJ 4732 UOJ #268 [清华集训2016]数据交互 (树链剖分、线段树)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4732 (UOJ) http://uoj.ac/problem/268 题解 ...

  6. UOJ #268 BZOJ 4732 [清华集训2016]数据交互 (树链剖分、线段树)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4732 (UOJ) http://uoj.ac/problem/268 题解 ...

  7. UOJ #455 [UER #8]雪灾与外卖 (贪心、模拟费用流)

    题目链接 http://uoj.ac/contest/47/problem/455 题解 模拟费用流,一个非常神奇的东西. 本题即为WC2019 laofu的讲课中的Problem 8,经典的老鼠进洞 ...

  8. BZOJ 3218 UOJ #77 A+B Problem (主席树、最小割)

    BZOJ 3218 UOJ #77 A+B Problem (主席树.最小割) 大名鼎鼎的A+B Problem, 主席树优化最小割-- 调题死活调不对,一怒之下改了一种写法交上去A了,但是改写法之后 ...

  9. 496. 下一个更大元素 I

    496. 下一个更大元素 I 题目 分析 我的解答 官方解答 题目 给定两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 ...

最新文章

  1. 巨人网络开发工程师试题
  2. IJCAI2019报告:基于无监督学习和图学习的大数据挖掘
  3. Matlab生成动态链接库供C#调用
  4. linux脚本传参修改配置文件,shell脚本修改配置文件指定行的值
  5. 依存句法分析的任务以及形式化定义
  6. (二分搜索法尺取法)subsequence
  7. 获取Django所有路由
  8. winform 窗体中 Time 控件的用法
  9. MySQL 字符集和校对
  10. caxa线切割怎样画链轮_caxa线切割【图文详解】
  11. MLP手写数字识别实现
  12. 微软亚洲研究院公布12项顶级研发成果(组图)
  13. android调用dll程序,安卓手机如何打开.dll文件?
  14. Linux常用命令--软件包管理之(服务管理)
  15. owasp top10
  16. qchart实现图片缩放 qt_Qt图形图像开发曲线图表模块QChart库缩放/平移详细方法与实例...
  17. [导入]美国得州5岁男童智商高达130(图)
  18. 你喜欢天长地久,还是曾经拥有?
  19. 有关振动试验夹具的问题
  20. 表格怎么拆分成2个的简便操作

热门文章

  1. 温度传感器LM35实验
  2. 页面报错405了怎么办
  3. 【学习笔记】GPS测量与数据处理(观测值的线性组合(单差、双差、三差))
  4. 【Unity游戏开发】动画系统(三)按钮动画
  5. 电路串联和并联图解_电路的组成和连接方式-通路、开路、短路,设计串并联电路图详解...
  6. pv vg lv 裸盘 裸设备 文件系统
  7. oracle19数据库对内存要求,在天堂 - 技术老男
  8. 编译error: no acceptable C compiler found in $PATH
  9. 5G NR — SA 与 NSA 组网
  10. maya批量操作mel_MAYA运行单个MEL命令方法图文介绍