题目链接: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的更多相关文章

  1. LibreOJ 6281 数列分块入门 5(分块区间开方区间求和)

    题解:区间开方emmm,这马上让我想起了当时写线段树的时候,很显然,对于一个在2^31次方以内的数,开方7-8次就差不多变成一了,所以我们对于每次开方,如果块中的所有数都为一了,那么开方也没有必要了. ...

  2. LOJ #6281. 数列分块入门 5-分块(区间开方、区间求和)

    #6281. 数列分块入门 5 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 5   题目描述 给出 ...

  3. LibreOJ 6277. 数列分块入门 1 题解

    题目链接:https://loj.ac/problem/6277 题目描述 给出一个长为 \(n\) 的数列,以及 \(n\) 个操作,操作涉及区间加法,单点查值. 输入格式 第一行输入一个数字 \( ...

  4. LOJ 6281 数列分块入门 5

    简化版题意 给出一个长为n的数列,以及n个操作,操作涉及区间开方(每个数都向下取整),区间求和,保证所有数都为有符号32位正整数. N<=50000 Solution 首先我们先思考: 一个有符 ...

  5. LibreOJ 6277 数列分块入门 1(分块)

    题解:感谢hzwer学长和loj让本蒟蒻能够找到如此合适的入门题做. 这是一道非常标准的分块模板题,本来用打标记的线段树不知道要写多少行,但是分块只有这么几行,极其高妙. 代码如下: #include ...

  6. [Libre 6281] 数列分块入门 5 (分块)

    水一道入门分块qwq 题面:传送门 开方基本暴力.. 如果某一个区间全部都开成1或0就打上标记全部跳过就行了 因为一个数开上个四五六次就是1了所以复杂度能过233~ code: //By Menteu ...

  7. LibreOJ 6278. 数列分块入门 2 题解

    题目链接:https://loj.ac/problem/6278 题目描述 给出一个长为 \(n\) 的数列,以及 \(n\) 个操作,操作涉及区间加法,询问区间内小于某个值 \(x\) 的元素个数. ...

  8. LibreOJ 6285. 数列分块入门 9

    题目链接:https://loj.ac/problem/6285 其实一看到是离线,我就想用莫队算法来做,对所有询问进行分块,但是左右边界移动的时候,不会同时更新数字最多的数,只是后面线性的扫了一遍, ...

  9. LibreOJ 6282. 数列分块入门 6

    题目链接:https://loj.ac/problem/6282 参考博客:http://www.cnblogs.com/stxy-ferryman/p/8560551.html 这里如果用数组的话元 ...

随机推荐

  1. sql中有一些保留字,当你的字段名是它的保留字时,这个时候sql语句的字段不加``就会报错

    sql中有一些保留字,当你的字段名是它的保留字时,这个时候sql语句的字段不加``就会报错

  2. 阿里巴巴开源项目: canal

    参考:https://www.cnblogs.com/duanxz/p/5062833.html docker 部署canal :  https://blog.csdn.net/u013705066/ ...

  3. [记录] Ubuntu 配置Apache虚拟站点

    版本 Ubuntu 16.04 1 . 首先找到Apapche配置文件夹  /etc/apache2/ apache2.conf conf-enabled magic mods-enabled sit ...

  4. 用大白话谈谈XSS与CSRF

    这两个关键词也是老生常谈了,但是还总是容易让人忘记与搞混~.XSS与CSRF这两个关键词时常被拉出来一起比较(尤其是面试),我在这里也在写一篇扫盲文,也帮自己整理一下知识脉络. 这篇文章会用尽量“人话 ...

  5. linux 显示系统执行的进程

    ps -a  显示所有的进程信息 -u 以用户的形式显示系统进程 -x  显示后台进程运行的参数 netstat  -anp |more 查看端口 查看开放的端口 vim/etc/sysconfig/ ...

  6. 使用curator框架简单操作zookeeper 学习笔记

    Curator 操作是zookeeper的优秀api(相对于原生api),满足大部分需求.而且是Fluent流式api风格. 参考文献:https://www.jianshu.com/p/70151f ...

  7. cxGrid 颜色设置

    一.cxGrid 根据列值变色(样式) 在使用cxGrid的过程中,某一个单元格经常需要根据其他单元格的值来做相应的变色,如: 在cxGridDBTableView中,选定要变样式(如背景色.字体属性 ...

  8. CSS 点击事件

    :active 伪类向激活(在鼠标点击与释放之间发生的事件)的元素添加特殊的样式. 这个伪类应用于处于激活状态的元素.最常见的例子就是在 HTML 文档中点击一个超链接:在鼠标按钮按下期间,这个链接是 ...

  9. CSS3 之转动的风车

    js 可以做动画,但是需要写很多代码:其实css也是可以做动画的,而且比js写的代码还少,理解也相对简单. 这里用到css3 的animation 属性,它配合着 @keyframes 规则来使用,可 ...

  10. Web安全颜色

    Web安全色产生的原因 不同的平台(Mac.PC等)有不同的调色板,不同的浏览器也有自己的调色板.这就意味着对于一幅图,显示在Mac上的Web浏览器中的图像,与它在PC上相同浏览器中显示的效果可能差别 ...