【题解】洛谷P4145 花神游历各国(线段树)
洛谷P4145:https://www.luogu.org/problemnew/show/P4145
思路
这道题的重点在于sqrt(1)=1 一个限制条件
与正常线段树不同的是区间修改为开方
那么我们用一个数组记录每个区间的最大值 只有当这个区间的最大值大于1时才需要开方
因此 当我们更新到叶子节点时把每个区间的最大值和sum值开方即可
注意题目中说l可能大于r 要交换
代码
#include<iostream>
#include<cmath>
using namespace std;
#define ll long long
#define maxn 100010
ll sum[maxn<<],Max[maxn<<],a[maxn];
ll n,m;
void build(ll l,ll r,ll k)
{
if(l==r)
{
sum[k]=a[l];
Max[k]=sum[k];//叶子节点
return;
}
ll mid=(l+r)>>;
build(l,mid,k<<);
build(mid+,r,k<<|);
sum[k]=sum[k<<]+sum[k<<|];
Max[k]=max(Max[k<<],Max[k<<|]);//更新上层的值
return;
}
ll query(ll x,ll y,ll l,ll r,ll k)//常规询问
{
if(x<=l&&r<=y) return sum[k];
ll res=;
ll mid=(l+r)>>;
if(x<=mid) res+=query(x,y,l,mid,k<<);
if(y>mid) res+=query(x,y,mid+,r,k<<|);
return res;
}
void update(ll x,ll y,ll l,ll r,ll k)
{
if(l==r)//叶子节点时
{
sum[k]=sqrt(sum[k]);
Max[k]=sqrt(Max[k]);
return;
}
ll mid=(l+r)>>;
if(x<=mid&&Max[k<<]>) update(x,y,l,mid,k<<);//满足最大值大于1
if(y>mid&&Max[k<<|]>) update(x,y,mid+,r,k<<|);
sum[k]=sum[k<<]+sum[k<<|];//更新上层的值
Max[k]=max(Max[k<<],Max[k<<|]);
}
int main()
{
cin>>n;
for(ll i=;i<=n;i++) cin>>a[i];
build(,n,);
cin>>m;
for(ll i=;i<=m;i++)
{
ll k,l,r;
cin>>k>>l>>r;
if(l>r)//交换
{
int temp;
temp=l;
l=r;
r=temp;
}
if(k==)
{
update(l,r,,n,);
}
if(k==)
{
cout<<query(l,r,,n,)<<endl;
}
}
}
【题解】洛谷P4145 花神游历各国(线段树)的更多相关文章
- BZOJ 3211: 花神游历各国( 线段树 )
线段树...区间开方...明显是要处理到叶节点的 之前在CF做过道区间取模...差不多, 只有开方, 那么每个数开方次数也是有限的(0,1时就会停止), 最大的数10^9开方10+次也就不会动了.那么 ...
- GSS4 - Can you answer these queries IV || luogu4145上帝造题的七分钟2 / 花神游历各国 (线段树)
GSS4 - Can you answer these queries IV || luogu4145上帝造题的七分钟2 / 花神游历各国 GSS4 - Can you answer these qu ...
- bzoj3211 花神游历各国 线段树,势能分析
[bzoj3211]花神游历各国 2014年3月17日2,7230 Description Input Output 每次x=1时,每行一个整数,表示这次旅行的开心度 Sample Input ...
- bzoj3211: 花神游历各国(线段树) 同codevs2492
3211: 花神游历各国 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 3628 Solved: 1326[Submit][Status][Discu ...
- BZOJ 3038: 上帝造题的七分钟2 / BZOJ 3211: 花神游历各国 (线段树区间开平方)
题意 给出一些数,有两种操作.(1)将区间内每一个数开方(2)查询每一段区间的和 分析 普通的线段树保留修改+开方优化.可以知道当一个数为0或1时,无论开方几次,答案仍然相同.所以设置flag=1变表 ...
- bzoj3211花神游历各国 线段树
3211: 花神游历各国 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 4252 Solved: 1547[Submit][Status][Discu ...
- BZOJ3211:花神游历各国(线段树)
Description Input Output 每次x=1时,每行一个整数,表示这次旅行的开心度 Sample Input 4 1 100 5 5 5 1 1 2 2 1 2 1 1 2 2 2 3 ...
- BZOJ3211花神游历各国-线段树&树状数组-(HDU4027同类型)
(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 题意:BZOJ HDU 原题目描述在最下面. 两种操作,1:把区间的数字开方一次,2:区间求和. 思路: 线段树: 显然不能暴力 ...
- day1 晚上 P4145 上帝造题的七分钟2 / 花神游历各国 线段树
#include<iostream> #include<cstdio> #include<cmath> using namespace std; ; struct ...
随机推荐
- Java并发编程:volatile关键字解析(学习总结-海子)
博文地址:Java并发编程:volatile关键字解析
- nodejs繁琐地自建路由
一.繁琐的自建路由 app.js var server = require('./server'); server.startServer(); server.js var http = requir ...
- typeof的探讨
console.log(typeof 'abc') // "string" console.log(typeof true )// "boolean" cons ...
- Aysnc-callback with future in distributed system
Aysnc-callback with future in distributed system
- SpringCloud+Git+Maven+Docker+Jenkins自动化构建
1.JDK安装-OpenJDK安装 yum list java-1.8* yum install -y java-1.8.0-openjdk-devel.x86_64 PS: JDK安装有两种方法:一 ...
- OSGEarth加载 geoserver 发布 TMS
geoserver配好数据并用自带的gwc切片好后, 访问 http://localhost:9999/geoserver/gwc/service/tms/1.0.0/ 在OsgEarth的earth ...
- Android热修复 Dex注入实现静默消灭bug
当app上线后发现紧急bug,如果重新发布版本周期比较长,并且对用户体验不好,此时热修复就派上用场了.热修复就是为紧急bug而生,能够快速修复bug,并且用户无感知.针对热修复,阿里系先后推出AndF ...
- Android ImageButton单击切换按钮图片效果
正常状态的效果: 按钮按下的效果图片: 一.在java中为图片按钮增加触摸监听的函数来实现图片切换,代码如下: ImageButton btn = (ImageButton)findViewById( ...
- svn up (svn update) 状态缩写含义
A:add,新增 C:conflict,冲突 D:delete,删除 M:modify,本地已经修改 G:modify and merGed,本地文件修改并且和服务器的进行合并 U:upda ...
- 异步nodejs代码的同步样子写法样例
异步nodejs代码的同步样子写法样例 js的异步嵌套太深代码将不好看.尤其在用node的时候这种情况会大量出现. 这里用node连接redis,做一个用户注册的简单例子来说明.例如用redis做存储 ...