题解【luogu4145 上帝造题的七分钟2(花神游历各国)】
题目大意:
一个序列,支持区间开方与求和操作。
算法:线段树实现开方修改与区间求和
分析:
- 显然,这道题的求和操作可以用线段树来维护
- 但是如何来实现区间开方呢
- 大家有没有这样的经历:玩计算器的时候,把一个数疯狂的按开方,最后总会变成 \(1\),之后在怎样开方也是 \(1\) (\(\sqrt1=1\))
- 同样的,\(\sqrt0=0\)
- 所以,只要一段区间里的所有数全都 \(\leq 1\) 了,便可以不去修改它
实现:
- 线段树维护区间和 \(sum\) 与最大值 \(Max\)
- 在修改过程中,只去修改 \(Max > 1\) 的区间
- 到了叶子节点对\(sum\)和\(Max\)进行开方就行了
复杂度:
- 每个数 \(\leq 10 ^ {12}\),所以至多开方\(6\)次便可以得到\(1\)
- 每次操作是 \(\log n\)的,总复杂度\(O(n \log n)\)
注意事项:
- 请使用long long
- 可能 \(l > r\)(把我坑了)
代码:
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <cstdio>
using namespace std;
typedef long long LL;
const int MAXN = 100100;
int n, m;
int cnt;
LL a[MAXN];
struct node
{
int left, right;
LL s, Max;
node *ch[2];
}pool[MAXN << 2], *root;
inline void pushup(node *r)
{
r->s = r->ch[0]->s + r->ch[1]->s;
r->Max = max(r->ch[0]->Max, r->ch[1]->Max);
}
inline void Build_Tree(node *r, int left, int right)
{
r->left = left;
r->right = right;
if(left == right)
{
r->s = r->Max = a[left];
return ;
}
int mid = (left + right) / 2;
node *lson = &pool[++cnt];
node *rson = &pool[++cnt];
r->ch[0] = lson;
r->ch[1] = rson;
Build_Tree(lson, left, mid);
Build_Tree(rson, mid + 1, right);
pushup(r);
}
inline void change(node *r, int left, int right)
{
if(r->left == r->right)
{
r->s = sqrt(r->s);
r->Max = sqrt(r->Max);
return ;
}
int mid = (r->left +r-> right) / 2;
if(left <= mid && r->ch[0]->Max > 1) change(r->ch[0], left, right);
if(mid < right && r->ch[1]->Max > 1) change(r->ch[1], left, right);
pushup(r);
}
inline LL query(node *r, int left, int right)
{
if(r->left == left && r->right == right)
return r->s;
if(r->ch[0]->right >= right) return query(r->ch[0], left, right);
else if(r->ch[1]->left <= left) return query(r->ch[1], left, right);
else
return query(r->ch[0], left, r->ch[0]->right) +
query(r->ch[1], r->ch[1]->left, right);
}
int main()
{
scanf("%d", &n);
root = &pool[0];
for(int i = 1; i <= n; i++) scanf("%lld", &a[i]);
scanf("%d", &m);
Build_Tree(root, 1, n);
for(int i = 1; i <= m; i++)
{
int opt, l, r;
scanf("%d%d%d", &opt, &l, &r);
if(l > r) swap(l, r);
if(opt) printf("%lld\n", query(root, l, r));
else change(root, l, r);
}
return 1; //防抄
}
题解【luogu4145 上帝造题的七分钟2(花神游历各国)】的更多相关文章
- GSS4 - Can you answer these queries IV || luogu4145上帝造题的七分钟2 / 花神游历各国 (线段树)
GSS4 - Can you answer these queries IV || luogu4145上帝造题的七分钟2 / 花神游历各国 GSS4 - Can you answer these qu ...
- 题解 洛谷 P4145 【上帝造题的七分钟2 / 花神游历各国】
题目 上帝造题的七分钟2 / 花神游历各国 题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. ...
- 【luogu4145】上帝造题的七分钟2 / 花神游历各国--区间开根-线段树
题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段 ...
- 洛谷P4145 上帝造题的七分钟2 / 花神游历各国(重题:洛谷SP2713 GSS4 - Can you answer these queries IV)
题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段 ...
- 洛谷P4145 上帝造题的七分钟2/花神游历各国 [树状数组,并查集]
题目传送门 题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是 ...
- [bzoj3038/3211]上帝造题的七分钟2/花神游历各国_线段树
上帝造题的七分钟2 bzoj-3038 题目大意:给定一个序列,支持:区间开方:查询区间和. 注释:$1\le n\le 10^5$,$1\le val[i] \le 10^{12}$. 想法:这题还 ...
- 洛谷P4145——上帝造题的七分钟2 / 花神游历各国
题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段 ...
- 【题解】 Luogu P4145 上帝造题的七分钟2 / 花神游历各国
原题传送门 这道题实际和GSS4是一样的,只是输入方式有点区别 GSS4传送门 这道题暴力就能过qaq(这里暴力指线段树) 数据比较水 开方修改在线段树中枚举叶节点sqrt 查询区间和线段树基本操作 ...
- 线段树 SP2713 GSS4 - Can you answer these queries IV暨 【洛谷P4145】 上帝造题的七分钟2 / 花神游历各国
SP2713 GSS4 - Can you answer these queries IV 「题意」: n 个数,每个数在\(10^{18}\) 范围内. 现在有「两种」操作 0 x y把区间\([x ...
- 洛谷 P4145 上帝造题的七分钟2 / 花神游历各国
洛谷 这题就是区间开根号,区间求和.我们可以分块做. 我们记布尔数组vis[i]表示第i块中元素是否全部为1. 因为显然当一个块中元素全部为1时,并不需要对它进行根号操作. 我们每个块暴力开根号,因为 ...
随机推荐
- lintcode172 删除元素
删除元素 给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度. 元素的顺序可以改变,并且对新的数组不会有影响. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一个数组 [0, ...
- 洛谷P1068 分数线划定:sort结构体排序+贪心
题目描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行.为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试. 面试分数线根据计划录取人数的150%划定, ...
- 怎么给kibana加上权限?
更新:2016-05-20 09:36 通过向Elastic了解,他们目前开发的5.0版本支持更好的权限定制,粒度达到字段级别.他们预计今年就可以上线,如果你不是有一个旧版本的kibanba非要维护不 ...
- Java静态方法,静态变量,初始化顺序
1. 静态方法: 成员变量分为实例变量和静态变量.其中实例变量属于某一个具体的实例,必须在类实例化后才真正存在,不同的对象拥有不同的实例变量.而静态变量被该类所有的对象公有(相当于全局变量),不需要实 ...
- selenium元素定位不到之iframe---基于python
我们在使用selenium的18中定位方式的时候,有时会遇到定位不上的问题,今天我们就来说说导致定位不上的其中一个原因---iframe 问题描述:通过firebug查询到相应元素的id或name等, ...
- vue.js学习之 如何在手机上查看vue-cli构建的项目
vue.js学习之 如何在手机上查看vue-cli构建的项目 一:找到config文件夹下的index.js文件,打开后,将host的值改为你本地的ip,保存后重启项目 二:输入ip和端口号打开项目 ...
- Memory及其controller芯片整体测试方案(上篇)
如果你最近想买手机,没准儿你一看价格会被吓到手机什么时候偷偷涨价啦! 其实对于手机涨价,手机制造商也是有苦难言,其中一个显著的原因是存储器芯片价格的上涨↗↗↗ >>> 存储器memo ...
- Thunder团队第一周 - Scrum会议4
Scrum会议4 小组名称:Thunder 项目名称:爱阅app Scrum Master:代秋彤 工作照片: 参会成员: 王航:http://www.cnblogs.com/wangh013/ 李传 ...
- oracle数据库之PL/SQL 块结构和组成元素
一.PL/SQL 块 (一)PL/SQL 程序由三个块组成,即声明部分.执行部分.异常处理部分 PL/SQL 块的结构如下: 1.DECLARE /* 声明部分: 在此声明 PL/SQL 用到的变量, ...
- 用URL传参带特殊字符,特殊字符丢失
文章:URL中编码URL特殊字符 文章:用URL传参带特殊字符,特殊字符丢失(encode) 如果url中有特殊字符,需要对url进行编码,否则特殊字符丢失,导致最终接收到的值不对.