P4145 上帝造题的七分钟2
题目描述
"第一分钟,X说,要有数列,于是便给定了一个正整数数列。
第二分钟,L说,要能修改,于是便有了对一段数中每个数都开平方(下取整)的操作。
第三分钟,k说,要能查询,于是便有了求一段数的和的操作。
第四分钟,彩虹喵说,要是noip难度,于是便有了数据范围。
第五分钟,诗人说,要有韵律,于是便有了时间限制和内存限制。
第六分钟,和雪说,要省点事,于是便有了保证运算过程中及最终结果均不超过64位有符号整数类型的表示范围的限制。
第七分钟,这道题终于造完了,然而,造题的神牛们再也不想写这道题的程序了。"
——《上帝造题的七分钟·第二部》
所以这个神圣的任务就交给你了。
输入输出格式
输入格式:
第一行一个整数 nn ,代表数列中数的个数。
第二行 nn 个正整数,表示初始状态下数列中的数。
第三行一个整数 mm ,表示有 mm 次操作。
接下来 mm 行每行三个整数k,l,r,
k=0表示给 [l,r][l,r] 中的每个数开平方(下取整)k=1表示询问 [l,r][l,r] 中各个数的和。
数据中有可能 l>rl>r ,所以遇到这种情况请交换l和r。
输出格式:
对于询问操作,每行输出一个回答。
输入输出样例
10
1 2 3 4 5 6 7 8 9 10
5
0 1 10
1 1 10
1 1 5
0 5 8
1 4 8
19
7
6
说明
对于30%的数据, 1\le n,m\le 10001≤n,m≤1000 ,数列中的数不超过 3276732767 。
对于100%的数据, 1 \le n,m \le 1000001≤n,m≤100000 , 1 \le l,r \le n1≤l,r≤n ,数列中的数大于 00 ,且不超过 10^{12}1012 。
注意l有可能大于r,遇到这种情况请交换l,r。
一道线段树的题目。
首先我们考虑一下,一个小于等于10^12的数,开了6次方之后就已经等于1了(可以自己拿计算器算一下)。而对于1,再开方也没有意义。也就是说,对每一个数,总共的开方次数只有6*n。所以我们可以开一个线段树,对于每一个修改操作,暴力修改。如果某区间的最大值为1,则跳过此区间的修改。最后基本上就是模板了
//minamoto
#include<bits/stdc++.h>
#define ll long long
#define rint register int
using namespace std;
const int N=;
int n,m;ll a[N],sum[N],maxn[N];
void pushup(int p){
sum[p]=sum[p<<]+sum[p<<|];
maxn[p]=max(maxn[p<<],maxn[p<<|]);
}
void build(int p,int l,int r){
if(l==r){
sum[p]=maxn[p]=a[l];return;
}
int mid=(l+r)>>;
build(p<<,l,mid);
build(p<<|,mid+,r);
pushup(p);
}
void change(int p,int l,int r,int ql,int qr){
if(l==r){
sum[p]=sqrt(sum[p]),maxn[p]=sqrt(maxn[p]);return;
}
int mid=(l+r)>>;
if(ql<=mid&&maxn[p<<]>) change(p<<,l,mid,ql,qr);
if(qr>mid&&maxn[p<<|]>) change(p<<|,mid+,r,ql,qr);
pushup(p);
}
ll query(int p,int l,int r,int ql,int qr){
if(ql<=l&&qr>=r) return sum[p];
int mid=(l+r)>>;
ll res=;
if(ql<=mid) res+=query(p<<,l,mid,ql,qr);
if(qr>mid) res+=query(p<<|,mid+,r,ql,qr);
return res;
}
int main(){
scanf("%d",&n);
for(rint i=;i<=n;++i) scanf("%lld",&a[i]);
build(,,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==) change(,,n,l,r);
else printf("%lld\n",query(,,n,l,r));
}
return ;
}
P4145 上帝造题的七分钟2的更多相关文章
- 洛谷P4145 上帝造题的七分钟2/花神游历各国 [树状数组,并查集]
题目传送门 题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是 ...
- 洛谷P4145——上帝造题的七分钟2 / 花神游历各国
题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段 ...
- 洛谷P4145 上帝造题的七分钟2 / 花神游历各国(重题:洛谷SP2713 GSS4 - Can you answer these queries IV)
题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段 ...
- 【题解】 Luogu P4145 上帝造题的七分钟2 / 花神游历各国
原题传送门 这道题实际和GSS4是一样的,只是输入方式有点区别 GSS4传送门 这道题暴力就能过qaq(这里暴力指线段树) 数据比较水 开方修改在线段树中枚举叶节点sqrt 查询区间和线段树基本操作 ...
- 洛谷 P4145 上帝造题的七分钟2 / 花神游历各国
洛谷 这题就是区间开根号,区间求和.我们可以分块做. 我们记布尔数组vis[i]表示第i块中元素是否全部为1. 因为显然当一个块中元素全部为1时,并不需要对它进行根号操作. 我们每个块暴力开根号,因为 ...
- 洛谷P4145上帝造题的七分钟——区间修改
题目:https://www.luogu.org/problemnew/show/P4145 区间开平方,可以发现其实开几次就变成1,不需要开了,所以标记一下,每次只去开需要开的地方: 原来写的并查集 ...
- P4145 上帝造题的七分钟2 / 花神游历各国(线段树区间开平方)
有点意思,不需要什么懒标记之类的东西,因为一个数无论怎样开平方,最后取整的结果必然会是1,所以我们不妨用最大值来维护,若区间最大值不为1,就暴力修改,否则不用管. #include<bits/s ...
- P4145 上帝造题的七分钟2 / 花神游历各国
思路 每个数不会被开方超过log次,对每个数暴力开方即可 代码 #include <algorithm> #include <cstring> #include <cst ...
- luogu P4145 上帝造题的七分钟2 / 花神游历各国 维护区间和&&区间开根号
因为开根号能使数字减小得非常快 所以开不了几次(6次?)很大的数就会变成1..... 所以我们可以维护区间最大值,若最大值>1,则继续递归子树,暴力修改叶节点,否则直接return (好像也可以 ...
随机推荐
- java.util.ConcurrentModificationException异常分析
Java在操作ArrayList.HashMap.TreeMap等容器类时,遇到了java.util.ConcurrentModificationException异常.以ArrayList为例,如下 ...
- 2013年最后的收成:avalon1.0正式发布
大半年前我就说过,MVVM是前端究极的解决方案,因此之后我大多数时间都在折腾avalon,成立了专门的QQ群与感兴趣的一起讨论.感谢第一批吃螃蟹的人,avalon发展得很快,GITHUB上的贡献人数达 ...
- clr相关的一些工具
NGen.exe:将IL代码编译成本地代码. PEVerify.exe:它检查一个集所有方法并报告其中含不 的实用程序. ILDasm.ex:IL反编译 csc.exe:C#编译工具 ilasm.ex ...
- the difference between fopen&open
[the difference between fopen&open] fopen是C标准API,open是linux系统调用,层次上fopen基于open,在其之上.fopen有缓存,ope ...
- Python3 hex() 函数
Python3 hex() 函数 Python3 内置函数 描述 hex() 函数用于将一个指定数字转换为 16 进制数. 语法 hex 语法: hex(x) 参数说明: x -- 一个整数 返回值 ...
- Cocoa Touch(二):数据存储CoreData, NSKeyArchiver, NSOutputStream, NSUserDefaults
应用程序离不开数据的永久存储,有两种方式实现存储:数据库和文本文件. 作为存储管理器,最基本的功能就是增删改查了. CoreData 1.插入 AppDelegate *app = [[UIAppli ...
- Mockplus组件样式库一键解决风格复用
在Mockplus3.3版本中,新增了组件样式库,可以快速复用组件风格,同时可以将组件风格保存到库中. 官网地址:https://www.mockplus.cn 1. 保存样式 选中组件,设置好该组件 ...
- ScreenCapture手动卸载教程-Xproer.ScreenCapture
此教程包含WindowsXP,Windows7(x86) ,Windows7(x64),Firefox,Chrome卸载教程. 1.1. 手动卸载控件-Windows XP 主要步骤如下: 1.关闭所 ...
- linux网络管理员
1. 查看当前开启的所有网络服务 命令:netstat -a (all)显示所有选项,默认不显示LISTEN相关-t (tcp)仅显示tcp相关选项-u (udp)仅显示udp相关选项-n 拒绝显示别 ...
- DW2.0
一.DW2.0从企业的角度,吸引企业的原因: 1.数据仓库基础设施的成本不再持续增长.在第一代数据仓库中,技术基础设施的成本是不断增长的,随着数据量的增长,基础设施的成本会以指数级增长.但是使用DW2 ...