洛谷P4145 上帝造题的七分钟2 / 花神游历各国(重题:洛谷SP2713 GSS4 - Can you answer these queries IV)
题目背景
XLk觉得《上帝造题的七分钟》不太过瘾,于是有了第二部。
题目描述
"第一分钟,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。
输出格式:
对于询问操作,每行输出一个回答。
输入输出样例
输入样例#1:
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
输出样例#1:
19
7
6
说明
对于30%的数据,1≤n,m≤1000,数列中的数不超过3276732767。
对于100%的数据,1≤n,m≤100000,1≤l,r≤n,数列中的数大于00,且不超过10^12。
注意l有可能大于r,遇到这种情况请交换l,r。
题解
LOJ数列分块入门5
我们发现2^31的数最多开方5次,所以对一段区间暴力开方,当一个块中所有元素变为1时,就打个标记,下次遇到这个块就不用处理了。然后就是基本的求和操作。
#include<bits/stdc++.h>
using namespace std;
long long n,m,num,a[500010],sum[500010],block,posi[500010];
long long l[500010],r[500010];
bool v[500010];
void build()
{
block=sqrt(n);num=n/block;
if(n%block!=0) num++;
for(int i=1;i<=num;i++)
l[i]=(i-1)*block+1,r[i]=i*block;
r[num]=n;
for(int i=1;i<=n;i++)
posi[i]=(i-1)/block+1,sum[posi[i]]+=a[i];
}
void update(long long ll,long long rr)
{
if(!v[posi[ll]])
{
for(int i=ll;i<=min(r[posi[ll]],rr);i++)
{
sum[posi[ll]]-=a[i];
a[i]=sqrt(a[i]);
sum[posi[ll]]+=a[i];
}
v[posi[ll]]=1;
for(int i=l[posi[ll]];i<=r[posi[ll]];i++)
if(a[i]>1) {v[posi[ll]]=0;break;}
}
if(posi[ll]!=posi[rr])
{
if(!v[posi[rr]])
{
for(int i=l[posi[rr]];i<=rr;i++)
{
sum[posi[rr]]-=a[i];
a[i]=sqrt(a[i]);
sum[posi[rr]]+=a[i];
}
v[posi[rr]]=1;
for(int i=l[posi[rr]];i<=r[posi[rr]];i++)
if(a[i]>1) {v[posi[rr]]=0;break;}
}
}
for(int i=posi[ll]+1;i<=posi[rr]-1;i++)
{
if(v[i]) continue;
v[i]=1;sum[i]=0;
for(int j=l[i];j<=r[i];j++)
{
a[j]=sqrt(a[j]);sum[i]+=a[j];
if(a[j]>1) v[i]=0;
}
}
}
void query(long long ll,long long rr)
{
long long ans=0;
for(int i=ll;i<=min(r[posi[ll]],rr);i++) ans+=a[i];
if(posi[ll]!=posi[rr])
for(int i=l[posi[rr]];i<=rr;i++) ans+=a[i];
for(int i=posi[ll]+1;i<=posi[rr]-1;i++) ans+=sum[i];
printf("%lld\n",ans);
}
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
build();
scanf("%lld",&m);
for(int i=1;i<=m;i++)
{
int opt;long long x,y;
scanf("%d%lld%lld",&opt,&x,&y);
if(x>y) swap(x,y);
if(!opt) update(x,y);
else query(x,y);
}
return 0;
}
洛谷P4145 上帝造题的七分钟2 / 花神游历各国(重题:洛谷SP2713 GSS4 - Can you answer these queries IV)的更多相关文章
- 洛谷P4145 上帝造题的七分钟2/花神游历各国 [树状数组,并查集]
题目传送门 题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是 ...
- 洛谷P4145——上帝造题的七分钟2 / 花神游历各国
题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段 ...
- 洛谷 P4145 上帝造题的七分钟2 / 花神游历各国
洛谷 这题就是区间开根号,区间求和.我们可以分块做. 我们记布尔数组vis[i]表示第i块中元素是否全部为1. 因为显然当一个块中元素全部为1时,并不需要对它进行根号操作. 我们每个块暴力开根号,因为 ...
- 【题解】 Luogu P4145 上帝造题的七分钟2 / 花神游历各国
原题传送门 这道题实际和GSS4是一样的,只是输入方式有点区别 GSS4传送门 这道题暴力就能过qaq(这里暴力指线段树) 数据比较水 开方修改在线段树中枚举叶节点sqrt 查询区间和线段树基本操作 ...
- P4145 上帝造题的七分钟2 / 花神游历各国(线段树区间开平方)
有点意思,不需要什么懒标记之类的东西,因为一个数无论怎样开平方,最后取整的结果必然会是1,所以我们不妨用最大值来维护,若区间最大值不为1,就暴力修改,否则不用管. #include<bits/s ...
- P4145 上帝造题的七分钟2 / 花神游历各国
思路 每个数不会被开方超过log次,对每个数暴力开方即可 代码 #include <algorithm> #include <cstring> #include <cst ...
- luogu P4145 上帝造题的七分钟2 / 花神游历各国 维护区间和&&区间开根号
因为开根号能使数字减小得非常快 所以开不了几次(6次?)很大的数就会变成1..... 所以我们可以维护区间最大值,若最大值>1,则继续递归子树,暴力修改叶节点,否则直接return (好像也可以 ...
- day1 晚上 P4145 上帝造题的七分钟2 / 花神游历各国 线段树
#include<iostream> #include<cstdio> #include<cmath> using namespace std; ; struct ...
- [Luogu P4145] 上帝造题的七分钟2 / 花神游历各国
题目链接 题目简要:我们需要一个能支持区间内每一个数开方以及区间求和的数据结构. 解题思路:说道区间修改区间查询,第一个想到的当然就是分块线段树.数据范围要用long long.本来我是看到区间这两个 ...
随机推荐
- RabbitMQ代码操作之发消息和序列化机制
几个自动配置类: 1.RabbitAutoConfiguration2.有自动配置了连接工厂 ConnectionFactory3.RabbitProperties 封装了RabbitMQ的配置4.R ...
- PAT甲级——A1104 Sum of Number Segments
Given a sequence of positive numbers, a segment is defined to be a consecutive subsequence. For exam ...
- LinkedList集合 实现栈和队列
LinkedList集合的底层是链表结构实现的,所以可以模拟栈(先进后出)和队列(先进先出). 方法: addFirst() //添加元素到列表的起始位置 addLast() //添加元素到列表的结束 ...
- python collections模块 之 ChainMap
ChainMap提供了一种多个字典整合的方式,它没有去合并这些字典,而是将这些字典放在一个 maps (一个列表)里,内部实现了很多 dict 的方法,大部分 dict 的方法,ChainMap 都能 ...
- Nginx是什么?
Nginx是什么? Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器.一直纳闷这个X是怎么来 ...
- 跟我一起安装vmware
第一步查看我们的电脑配置 我是windows10,下面的方法是windows10来安装vmware 第二步双击下图文件 (1) 2)弹出如下图,点击下一步即可. (3)一直点击下一步(期间会同意,勾选 ...
- [转]Expression Blend实例中文教程(8) - 动画设计快速入门StoryBoard
上一篇,介绍了Silverlight动画设计基础知识,Silverlight动画是基于时间线的,对于动画的实现,其实也就是对对象属性的修改过程. 而Silverlight动画分类两种类型,From/T ...
- html常用标签详解5-表格标签
表格标签(如果有不对的,请大家多多指正.谢谢!) 1.总的表格标签概览 <table><!--表格标签start--> <caption></caption& ...
- Ionic 微信支付
1.安装插件 ionic plugin add https://github.com/mrwutong/cordova-qdc-wxpay.git 2.代码 controller.js angular ...
- LA4794 Sharing Chocolate
传送门 记忆化搜索. 在下觉得sxy大佬的代码写得相当好,通篇的骚操作(因为我都不会呀),%%% 学到了 预处理每个状态的值.以前的我都是zz地枚举每一位.. for(int i=1;i<(1& ...