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 这里如果用数组的话元 ...
随机推荐
- 判断pc端或移动端并跳转
判断pc端或移动端并跳转 代码目录: index.html代码: <!DOCTYPE html> <html lang="en"> <head> ...
- java多态和继承
继承定义:子类继承父类的特征和行为,使得子类具有父类的各种属性和方法.或子类从父类继承方法,使得子类具有父类相同的行为. 多态定义看了很多,都觉得不够贴切,后来在一个同学的笔记中看到了如下的定义觉得很 ...
- leetcode1003
class Solution: def isValid(self, S: str) -> bool: n = len(S) if n % 3 != 0: return False while n ...
- 模板引擎Dot
Dot.js 很轻,处理速度也快,作为将json数据赋值到html页面的最好帮手. html5新引入的<template></template>就不用原先的<script ...
- 爬虫--urllib模块
一.urllib库 概念:urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urll ...
- iOS开发 2x 3x图
众所周知,iOS开发中的图片资源一般需要2倍图和3倍图,也就是2x,3x,但是最近思考了一个问题,为什么不能只提供3x的图片,2x的图片让系统从3x压缩就好了,于是上网搜索了下,得到了答案. 当我们在 ...
- es查询时报 Data too large
报错如下: 原因: https://www.cnblogs.com/jiu0821/p/6526930.html 参数 indices.fielddata.cache.size 控制有多少堆内存是分配 ...
- Jmeter的安装与使用
安装Jmeter之前需要先配置Java环境 当配置完Jmeter运行的环境之后,就可以开始安装Jmeter了. 为什么既要告诉各位"在Linux系统内安装Jmeter",又要告诉各位"在Windo ...
- suse 奇怪的crash 问题
最近遇到一个suse的crash 问题: 我没有使用 mkswap /dev/磁盘路径 来制作swap分区,我有很多剩余内存,我设置nr_swapfiles为0,可是我还是遇到了关于swap的cras ...
- iptables学习
droidwall.sh #!/system/bin/sh IPTABLES=iptables BUSYBOX=busybox GREP=grep ECHO=echo # Try to find bu ...