洛谷 P4145 上帝造题的七分钟2 / 花神游历各国
这题就是区间开根号,区间求和。我们可以分块做。
我们记布尔数组vis[i]表示第i块中元素是否全部为1。
因为显然当一个块中元素全部为1时,并不需要对它进行根号操作。
我们每个块暴力开根号,因为数字最大\(2^{31}\),所以最多每个数字开几次根号,所以时间复杂度很低。
记录sum[i]表示第i块的总和,所以我们得到这样的算法:
当出现修改操作时,我们暴力修改,如果vis[i]为真,则不对该块进行操作。
而出现查询操作时,直接对正常操作再输出即可。
代码略丑:
#include <bits/stdc++.h>
#define _ putchar('\n')
using namespace std;
typedef int _int;
#define int long long
const int N=100010;
bool vis[N];
int n,m,a[N],len,num;
int pos[N],sum[N],ll[N],rr[N];
inline void read(int &aa)
{
aa=0;char c=getchar();
for (;c>'9'||c<'0';c=getchar());
for (;c>='0'&&c<='9';c=getchar())
aa=(aa<<3)+(aa<<1)+(c^48);
}
char buffer[N],*S,*T;
inline char Get_Char()
{
if (S==T) {
T=(S=buffer)+fread(buffer,1,N,stdin);
if (S==T) return EOF;
}
return *S++;
}
int Get_Int()
{
char c;
int re=0;
for (c=Get_Char();c<'0'||c>'9';c=Get_Char());
while (c>='0'&&c<='9')
re=(re<<1)+(re<<3)+(c-'0'),c=Get_Char();
return re;
}
void print(int x)
{
if (x>9) print(x/10);putchar(x%10^48);
}
void build()
{
len=sqrt(n);
num=n/len;if (n%len) ++num;
for (int i=1;i<=num;++i)
ll[i]=(i-1)*len+1,rr[i]=i*len;
rr[num]=n;
for (int i=1;i<=num;++i)
for (int j=ll[i];j<=rr[i];++j)
sum[i]+=a[j];
for (int i=1;i<=n;++i)
pos[i]=(i-1)/len+1;
}
int ask(int l,int r)
{
int ans=0;
if (pos[l]==pos[r]) {
for (int i=l;i<=r;++i)
ans+=a[i];
return ans;
}
for (int i=l;i<=rr[pos[l]];++i)
ans+=a[i];
for (int i=pos[l]+1;i<pos[r];++i)
ans+=sum[i];
for (int i=ll[pos[r]];i<=r;++i)
ans+=a[i];
return ans;
}
void change(int l,int r)
{
if (pos[l]==pos[r]) {
if (vis[pos[l]]) return;
for (int i=l;i<=r;++i) {
sum[pos[l]]-=a[i];
a[i]=sqrt(a[i]);
sum[pos[l]]+=a[i];
}
vis[pos[l]]=1;
for (int i=ll[pos[l]];i<=rr[pos[l]];++i)
if (a[i]>1) {vis[pos[l]]=0;break;}
return;
}
if (!vis[pos[l]]) {
for (int i=l;i<=rr[pos[l]];++i) {
sum[pos[l]]-=a[i];
a[i]=sqrt(a[i]);
sum[pos[l]]+=a[i];
}
vis[pos[l]]=1;
for (int i=ll[pos[l]];i<=rr[pos[l]];++i)
if (a[i]>1) {vis[pos[l]]=0;break;}
}
if (!vis[pos[r]]) {
for (int i=ll[pos[r]];i<=r;++i) {
sum[pos[r]]-=a[i];
a[i]=sqrt(a[i]);
sum[pos[r]]+=a[i];
}
vis[pos[r]]=1;
for (int i=ll[pos[r]];i<=rr[pos[r]];++i)
if (a[i]>1) {vis[pos[r]]=0;break;}
}
for (int i=pos[l]+1;i<pos[r];++i) {
if (vis[i]) continue;
for (int j=ll[i];j<=rr[i];++j) {
sum[i]-=a[j];
a[j]=sqrt(a[j]);
sum[i]+=a[j];
}
vis[i]=1;
for (int j=ll[i];j<=rr[i];++j)
if (a[j]>1) {vis[i]=0;break;}
}
}
_int main()
{
n=Get_Int();
for (int i=1;i<=n;++i) a[i]=Get_Int();
build();
m=Get_Int();
int opt,l,r;
while (m--) {
opt=Get_Int(),l=Get_Int(),r=Get_Int();
if (l>r) swap(l,r);
if (opt) print(ask(l,r)),_;
else change(l,r);
}
return 0;
}
洛谷 P4145 上帝造题的七分钟2 / 花神游历各国的更多相关文章
- 洛谷P4145 上帝造题的七分钟2/花神游历各国 [树状数组,并查集]
题目传送门 题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是 ...
- 洛谷P4145——上帝造题的七分钟2 / 花神游历各国
题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段 ...
- 洛谷P4145 上帝造题的七分钟2 / 花神游历各国(重题:洛谷SP2713 GSS4 - Can you answer these queries IV)
题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段 ...
- 【题解】 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.本来我是看到区间这两个 ...
随机推荐
- java中调用数据库中的存储过程和函数
public static void main(String[] args) { Connection conn =getConnection(url,user, pwd); ...
- [转]C++ error C2011: “XXX”:“class”类型重定义
http://blog.csdn.net/m_leonwang/article/details/27678219 尝试修复这个程序的错误: 点击下载源代码文件夹
- centos 系统管理维护指南
# centos 系统管理维护指南 centos系统是服务器的首选系统,系统运维支持需要的内容汇总整理如下. ### 系统管理------------------------------ 查看系统版本 ...
- AdapterView 和 RecyclerView 的连续滚动
AdapterView 和 RecyclerView 的连续滚动 android RecyclerView tutorial 概述 ListView 和 GridView 的实现方式 Recycler ...
- 机器学习算法( 二、K - 近邻算法)
一.概述 k-近邻算法采用测量不同特征值之间的距离方法进行分类. 工作原理:首先有一个样本数据集合(训练样本集),并且样本数据集合中每条数据都存在标签(分类),即我们知道样本数据中每一条数据与所属分类 ...
- 小型云服务器搭建GitLab遇到的坑
云服务商:腾讯云,搞活动买的 3年800块钱,和同时一人一台 配置:1C.1G.50G 用三年,挺划算的 项目中以前一直使用SVN作为代码版本控制,秉着程序员做到老学到老的精神,想尝试一下先进的GIT ...
- 将td中文字过长的部分变成省略号显示的小技巧
首先设置表格的样式table-layout:"fixed"再设置表格的宽度(这步必须) 最后再设置td样式的三个必要属性 代码如下: text-overflow: ellipsis ...
- Hive学习笔记——保存select结果,Join,多重插入
1. 保存select查询结果的几种方式: 1.将查询结果保存到一张新的hive表中 create table t_tmp as select * from t_p; 2.将查询结果保存到一张已经存在 ...
- MapReduce实战(六)共同粉丝
需求: 利用mapReduce实现类似微博中查找共同粉丝的功能.如下: A:B,C,D,F,E,OB:A,C,E,KC:F,A,D,ID:A,E,F,LE:B,C,D,M,LF:A,B,C,D,E,O ...
- 远程sql 同步程序
exec sp_configure 'show advanced options',1reconfigureexec sp_configure 'Ad Hoc Distributed Queries' ...