题目链接

题目简要:我们需要一个能支持区间内每一个数开方以及区间求和的数据结构。

解题思路:说道区间修改区间查询,第一个想到的当然就是分块线段树。数据范围要用long long。本来我是看到区间这两个字就想着运用一下还不算特别熟的lazy-tag。但是题目是开方嘛。开方不满足结合律,√4+√4≠√8是很显而易见的事情。所以说是不能直接修改sum的。那么只能每个单点修改。

如何单点修改?第一个思考的是for循环一下然后套单点。但是实际上这样时间复杂度会极度的退化,是会超时的。此时我们发现每次单点change的时候会重复的访问包含目标节点的大区间再到最小的叶节点。实际上修改a[i]与a[i+1]就是左右的兄弟节点并且还有共同的父亲。所以我们还是用区间修改的模式。只不过要到叶节点才改。

我们按照上面写的做了以后莫约能拿到四十分左右。那么如何优化呢?我们知道260大概就是长整型的极限了。也就是说一个数最多计算60次的平方根就会到达1。并且再开方也就不会变化。换而言之如果一个区间里面全是1,即sum为区间长度,就可以不用处理了。这里题目有说都为正整数,就不用考虑会有0而不好求是否全为1的情况了。

#include<iostream>
#include<cstdio>
#include<cmath>
#define cm int mid=(l+r)>>1
#define zc k<<1
#define yc (k<<1)+1
#define din l>=z&&r<=y
#define dout r<z||l>y
using namespace std;
long long read(){
char ch;
long long res=,f=;
ch=getchar();
while(ch<''||ch>''){
if(ch=='-')f=-;
ch=getchar();
}
while(ch>=''&&ch<=''){
res=res*+(ch-'');
ch=getchar();
}
return res*f;
}
long long n,m,a[],xds_sum[];
void build(int k,int l,int r){
if(l==r){xds_sum[k]=a[l];return;}
cm;build(zc,l,mid);build(yc,mid+,r);
xds_sum[k]=xds_sum[zc]+xds_sum[yc];
}
void change(int k,int l,int r,int z,int y){
if(dout)return;
if(din&&xds_sum[k]==(r-l+))return;
if(din&&l==r){xds_sum[k]=(long long)sqrt(xds_sum[k]);return;}
cm;change(zc,l,mid,z,y);change(yc,mid+,r,z,y);
xds_sum[k]=xds_sum[zc]+xds_sum[yc];
}
long long query(int k,int l,int r,int z,int y){
if(dout)return ;
if(din)return xds_sum[k];
cm;return query(zc,l,mid,z,y)+query(yc,mid+,r,z,y);
}
int main(){
n=read();
for(int i=;i<=n;++i)a[i]=read();
build(,,n);
m=read();
for(int i=;i<=m;++i){
int order,x,y;
order=read();x=read();y=read();
if(x>y)swap(x,y);
if(order)printf("%lld\n",query(,,n,x,y));
else change(,,n,x,y);
}
return ;
}

[Luogu P4145] 上帝造题的七分钟2 / 花神游历各国的更多相关文章

  1. 【题解】 Luogu P4145 上帝造题的七分钟2 / 花神游历各国

    原题传送门 这道题实际和GSS4是一样的,只是输入方式有点区别 GSS4传送门 这道题暴力就能过qaq(这里暴力指线段树) 数据比较水 开方修改在线段树中枚举叶节点sqrt 查询区间和线段树基本操作 ...

  2. luogu P4145 上帝造题的七分钟2 / 花神游历各国 维护区间和&&区间开根号

    因为开根号能使数字减小得非常快 所以开不了几次(6次?)很大的数就会变成1..... 所以我们可以维护区间最大值,若最大值>1,则继续递归子树,暴力修改叶节点,否则直接return (好像也可以 ...

  3. 洛谷P4145 上帝造题的七分钟2/花神游历各国 [树状数组,并查集]

    题目传送门 题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是 ...

  4. 洛谷P4145——上帝造题的七分钟2 / 花神游历各国

    题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段 ...

  5. 洛谷P4145 上帝造题的七分钟2 / 花神游历各国(重题:洛谷SP2713 GSS4 - Can you answer these queries IV)

    题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段 ...

  6. 洛谷 P4145 上帝造题的七分钟2 / 花神游历各国

    洛谷 这题就是区间开根号,区间求和.我们可以分块做. 我们记布尔数组vis[i]表示第i块中元素是否全部为1. 因为显然当一个块中元素全部为1时,并不需要对它进行根号操作. 我们每个块暴力开根号,因为 ...

  7. P4145 上帝造题的七分钟2 / 花神游历各国(线段树区间开平方)

    有点意思,不需要什么懒标记之类的东西,因为一个数无论怎样开平方,最后取整的结果必然会是1,所以我们不妨用最大值来维护,若区间最大值不为1,就暴力修改,否则不用管. #include<bits/s ...

  8. P4145 上帝造题的七分钟2 / 花神游历各国

    思路 每个数不会被开方超过log次,对每个数暴力开方即可 代码 #include <algorithm> #include <cstring> #include <cst ...

  9. day1 晚上 P4145 上帝造题的七分钟2 / 花神游历各国 线段树

    #include<iostream> #include<cstdio> #include<cmath> using namespace std; ; struct ...

随机推荐

  1. aPlugForUNIX(POJ-1087)【最大流】

    题目链接:https://vjudge.net/problem/POJ-1087 题意:有N个插座,M个电器,K种转换头(每种转换头有无限多个),求最多能同时给多少台设备供电 思路: 首先,建立源点和 ...

  2. python学习-50 pickle模块

    pickle模块 与json方法是一样的 import pickle dic = {'} print(type(dic)) a = pickle.dumps(dic) print(type(a)) f ...

  3. 扩展kmp入门+比赛模板

    https://wenku.baidu.com/view/8e9ebefb0242a8956bece4b3.html 参考了这个ppt 理解起来还是有点费劲的(还是推荐一下这个课件 里面概念和思路给的 ...

  4. 20-MySQL DBA笔记-可扩展的架构

    第20章 可扩展的架构 本章将为读者讲述可扩展的架构相关的知识和技术.可扩展的架构意味着这个架构伸缩性好,我们可以用更多的节点来提高吞吐率,而性能(响应时间)不会下降到不可接受的范围.互联网世界飞速发 ...

  5. 数据格式转换string.Format

    1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...

  6. 路由器开源系统openwrt配置页面定制

    1. 新建虚拟机,百度文库有一篇<使用VMware安装OpenWrt>,地址:http://wenku.baidu.com/link?url=NkvaQpTf2dR8FpYn7JD9A7- ...

  7. Unity NavMesh 格式 解析 分析 对比 Recast Navigation

    工具软件 Excel Nodepad++ Sublime Unity 5.4 / 5.6 VS RecastDemo CodeBlocks 分析过程以Unity项目-Demo13为例 一. 创建测试模 ...

  8. 字蛛webfont 安装及使用方法

    先安装nodejs和git,比如放在D:/nodejs/  文件夹 cmd 进入该文件夹,安装npm install express 安装 npm install font-spider -g 安装  ...

  9. css布局笔记

    1.display   block块级元素(div.p等) inline 行内元素(a.span等) 常见的例子:把li修改成inline ,制作成水平菜单 2.max-width 来适应不同浏览器窗 ...

  10. 通过数组的某一个属性值进行排序(如id)

    let arr = [ {id: 1, name: 'aaa'}, {id: 4, name: 'ddd'}, {id: 2, name: 'bbb'}, {id: 3, name: 'ccc'} ] ...