[Luogu P4145] 上帝造题的七分钟2 / 花神游历各国
题目简要:我们需要一个能支持区间内每一个数开方以及区间求和的数据结构。
解题思路:说道区间修改区间查询,第一个想到的当然就是分块线段树。数据范围要用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 / 花神游历各国的更多相关文章
- 【题解】 Luogu P4145 上帝造题的七分钟2 / 花神游历各国
原题传送门 这道题实际和GSS4是一样的,只是输入方式有点区别 GSS4传送门 这道题暴力就能过qaq(这里暴力指线段树) 数据比较水 开方修改在线段树中枚举叶节点sqrt 查询区间和线段树基本操作 ...
- luogu P4145 上帝造题的七分钟2 / 花神游历各国 维护区间和&&区间开根号
因为开根号能使数字减小得非常快 所以开不了几次(6次?)很大的数就会变成1..... 所以我们可以维护区间最大值,若最大值>1,则继续递归子树,暴力修改叶节点,否则直接return (好像也可以 ...
- 洛谷P4145 上帝造题的七分钟2/花神游历各国 [树状数组,并查集]
题目传送门 题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是 ...
- 洛谷P4145——上帝造题的七分钟2 / 花神游历各国
题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段 ...
- 洛谷P4145 上帝造题的七分钟2 / 花神游历各国(重题:洛谷SP2713 GSS4 - Can you answer these queries IV)
题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段 ...
- 洛谷 P4145 上帝造题的七分钟2 / 花神游历各国
洛谷 这题就是区间开根号,区间求和.我们可以分块做. 我们记布尔数组vis[i]表示第i块中元素是否全部为1. 因为显然当一个块中元素全部为1时,并不需要对它进行根号操作. 我们每个块暴力开根号,因为 ...
- P4145 上帝造题的七分钟2 / 花神游历各国(线段树区间开平方)
有点意思,不需要什么懒标记之类的东西,因为一个数无论怎样开平方,最后取整的结果必然会是1,所以我们不妨用最大值来维护,若区间最大值不为1,就暴力修改,否则不用管. #include<bits/s ...
- P4145 上帝造题的七分钟2 / 花神游历各国
思路 每个数不会被开方超过log次,对每个数暴力开方即可 代码 #include <algorithm> #include <cstring> #include <cst ...
- day1 晚上 P4145 上帝造题的七分钟2 / 花神游历各国 线段树
#include<iostream> #include<cstdio> #include<cmath> using namespace std; ; struct ...
随机推荐
- aPlugForUNIX(POJ-1087)【最大流】
题目链接:https://vjudge.net/problem/POJ-1087 题意:有N个插座,M个电器,K种转换头(每种转换头有无限多个),求最多能同时给多少台设备供电 思路: 首先,建立源点和 ...
- python学习-50 pickle模块
pickle模块 与json方法是一样的 import pickle dic = {'} print(type(dic)) a = pickle.dumps(dic) print(type(a)) f ...
- 扩展kmp入门+比赛模板
https://wenku.baidu.com/view/8e9ebefb0242a8956bece4b3.html 参考了这个ppt 理解起来还是有点费劲的(还是推荐一下这个课件 里面概念和思路给的 ...
- 20-MySQL DBA笔记-可扩展的架构
第20章 可扩展的架构 本章将为读者讲述可扩展的架构相关的知识和技术.可扩展的架构意味着这个架构伸缩性好,我们可以用更多的节点来提高吞吐率,而性能(响应时间)不会下降到不可接受的范围.互联网世界飞速发 ...
- 数据格式转换string.Format
1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...
- 路由器开源系统openwrt配置页面定制
1. 新建虚拟机,百度文库有一篇<使用VMware安装OpenWrt>,地址:http://wenku.baidu.com/link?url=NkvaQpTf2dR8FpYn7JD9A7- ...
- Unity NavMesh 格式 解析 分析 对比 Recast Navigation
工具软件 Excel Nodepad++ Sublime Unity 5.4 / 5.6 VS RecastDemo CodeBlocks 分析过程以Unity项目-Demo13为例 一. 创建测试模 ...
- 字蛛webfont 安装及使用方法
先安装nodejs和git,比如放在D:/nodejs/ 文件夹 cmd 进入该文件夹,安装npm install express 安装 npm install font-spider -g 安装 ...
- css布局笔记
1.display block块级元素(div.p等) inline 行内元素(a.span等) 常见的例子:把li修改成inline ,制作成水平菜单 2.max-width 来适应不同浏览器窗 ...
- 通过数组的某一个属性值进行排序(如id)
let arr = [ {id: 1, name: 'aaa'}, {id: 4, name: 'ddd'}, {id: 2, name: 'bbb'}, {id: 3, name: 'ccc'} ] ...