LibreOJ 6281 数列分块入门5
题目链接:https://loj.ac/problem/6281
参考博客:https://blog.csdn.net/qq_36038511/article/details/79725027
我一开始看到开方有点懵,看了上面的博客说2^31差不多5次开方就快变成1了,可以开标记数组,于是按照这个思路写了下,然后就过了,看来以后还要多看题意分析数据。
代码:
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
typedef long long LL;
#define eps 1e-8
#define INF 0x3f3f3f3f
#define maxn 50010
int n,m,k,t,block;
int a[maxn],tag[maxn],sum[maxn],vis[maxn],lump[maxn];
void kaif(int l,int r)//把l到r之间的数字开方
{
for(int i=l;i<=min(lump[l]*block,r);i++)//直接改左边的不完整区间,同时该区间和
{
sum[lump[l]]-=a[i];
a[i]=sqrt(a[i]);
sum[lump[l]]+=a[i];
}
if(lump[l]!=lump[r])
{
for(int i=(lump[r]-)*block+;i<=r;i++)
{
sum[lump[r]]-=a[i];
a[i]=sqrt(a[i]);
sum[lump[r]]+=a[i];
}
}
for(int i=lump[l]+;i<=lump[r]-;i++)//记录这个区间开方了多少次
{
tag[i]++;
}
}
int cal(int x,int num)//求数字x开方num次得出的结果
{
while(num--&&x>)
{
x=sqrt(x);
}
return x;
}
int get_sum(int l,int r)//求区间和
{
int ans=;
for(int i=l;i<=min(lump[l]*block,r);i++)//左区间暴力求和
{
ans+=cal(a[i],tag[lump[l]]);
}
if(lump[l]!=lump[r])
{
for(int i=(lump[r]-)*block+;i<=r;i++)//右区间
{
ans+=cal(a[i],tag[lump[r]]);
}
}
for(int i=lump[l]+;i<=lump[r]-;i++)
{
if(!vis[i])//如果vis[i]==0,表示区间i还有大于1的数字
{
int flag=;//标记看开方之后是否还有大于1的数字
sum[i]=;//区间和清空
for(int j=(i-)*block+;j<=i*block;j++)
{
a[j]=cal(a[j],tag[i]);
sum[i]+=a[j];//重新计算区间和
if(a[j]>)//只要有一个大于1
flag=;
}
tag[i]=;//区间未开方数字清零
if(!flag)
vis[i]=;
}
ans+=sum[i];
}
return ans;
}
int main()
{
scanf("%d",&n);
block=sqrt(n);
fill(sum,sum+maxn-,);
fill(tag,tag+maxn-,);
fill(vis,vis+maxn-,);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
lump[i]=(i-)/block+;
sum[lump[i]]+=a[i];
}
for(int i=;i<=n;i++)
{
int op,l,r,w;
scanf("%d%d%d%d",&op,&l,&r,&w);
if(op==)
kaif(l,r);
else
printf("%d\n",get_sum(l,r));
}
return ;
}
LibreOJ 6281 数列分块入门5的更多相关文章
- LibreOJ 6281 数列分块入门 5(分块区间开方区间求和)
题解:区间开方emmm,这马上让我想起了当时写线段树的时候,很显然,对于一个在2^31次方以内的数,开方7-8次就差不多变成一了,所以我们对于每次开方,如果块中的所有数都为一了,那么开方也没有必要了. ...
- LOJ #6281. 数列分块入门 5-分块(区间开方、区间求和)
#6281. 数列分块入门 5 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 5 题目描述 给出 ...
- LibreOJ 6277. 数列分块入门 1 题解
题目链接:https://loj.ac/problem/6277 题目描述 给出一个长为 \(n\) 的数列,以及 \(n\) 个操作,操作涉及区间加法,单点查值. 输入格式 第一行输入一个数字 \( ...
- LOJ 6281 数列分块入门 5
简化版题意 给出一个长为n的数列,以及n个操作,操作涉及区间开方(每个数都向下取整),区间求和,保证所有数都为有符号32位正整数. N<=50000 Solution 首先我们先思考: 一个有符 ...
- LibreOJ 6277 数列分块入门 1(分块)
题解:感谢hzwer学长和loj让本蒟蒻能够找到如此合适的入门题做. 这是一道非常标准的分块模板题,本来用打标记的线段树不知道要写多少行,但是分块只有这么几行,极其高妙. 代码如下: #include ...
- [Libre 6281] 数列分块入门 5 (分块)
水一道入门分块qwq 题面:传送门 开方基本暴力.. 如果某一个区间全部都开成1或0就打上标记全部跳过就行了 因为一个数开上个四五六次就是1了所以复杂度能过233~ code: //By Menteu ...
- LibreOJ 6278. 数列分块入门 2 题解
题目链接:https://loj.ac/problem/6278 题目描述 给出一个长为 \(n\) 的数列,以及 \(n\) 个操作,操作涉及区间加法,询问区间内小于某个值 \(x\) 的元素个数. ...
- LibreOJ 6285. 数列分块入门 9
题目链接:https://loj.ac/problem/6285 其实一看到是离线,我就想用莫队算法来做,对所有询问进行分块,但是左右边界移动的时候,不会同时更新数字最多的数,只是后面线性的扫了一遍, ...
- LibreOJ 6282. 数列分块入门 6
题目链接:https://loj.ac/problem/6282 参考博客:http://www.cnblogs.com/stxy-ferryman/p/8560551.html 这里如果用数组的话元 ...
随机推荐
- EventBus用法
什么是EventBus EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间.组件与后台线程间的通信.比如请求网络,等网络返回时通过Hand ...
- ASP.NET Core MVC 概述
https://docs.microsoft.com/zh-cn/aspnet/core/mvc/overview?view=aspnetcore-2.2 ASP.NET Core MVC 概述 20 ...
- PerformCallback(珍藏版)
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="PerformCallback. ...
- 03.获取页面的flash文件
1.打开页面的web控制台 2.选择网路查看当前请求的swf文件所在的地址 3.打开swf的文件地址 4.另存为swf的网页为swf格式 搞定就可以了.
- Spring和SpringMVC的常用注解
Spring的部分: 使用注解之前要开启自动扫描功能 其中base-package为需要扫描的包(含子包). <context:component-scan base-package=" ...
- js ajax 数据获取
在js中应用ajax 获取数据的方法,也写一个出来供复习所用 1.建议一个user.json 文件如下,保存名字为 user.json { "name": "huanyi ...
- c#与wpf的一些基础语法问题(摘用)
1 .在vs里不同cs文件,位于同一个namespace,是什么情况. 答:http://msdn.microsoft.com/zh-cn/library/0d941h9d(v=vs.80).aspx ...
- C++复习:STL之算法
算法 1算法基础 1.1算法概述 算法部分主要由头文件<algorithm>,<numeric>和<functional>组成. <algorithm> ...
- 6.5 Shell 算术计算
6.5 Shell Arithmetic shell允许在其内计算表达式,可以通过以下方式使用:((中,let和带-i选项的declare命令中. 只能计算固定长度的整数,而且不会检查溢出,除0可以捕 ...
- 记录在Centos下安装和使用Git的过程,从github上克隆仓库和提交。
1 安装git yum install git 2配置DNS vi /etc/resolv.conf nameserver 8.8.8.8nameserver 8.8.4.4 3 设置网关 vi /e ...