分块

若块内最大值为0或1,则不用再开方

然后暴力修改

可以证明,如果开方后向下取整,则最多开方4次一个数就会变成0或1

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
long long n,sz,num,belong[],a[],maxb[],sum[];
void calbe(int n){
for(int i=;i<=n;i++)
belong[i]=(i-)/sz+;
}
void reset(int x){
maxb[x]=;
sum[x]=;
for(int i=(x-)*sz+;i<=min(sz*x,n);i++){
maxb[x]=max(maxb[x],a[i]);
sum[x]+=a[i];
}
}
long long query(int l,int r){
int xl=belong[l];
int xr=belong[r];
long long ans=;
for(int i=l;i<=min(xl*sz,(long long)r);i++)
ans+=a[i];
if(xl!=xr){
for(int i=(xr-)*sz+;i<=r;i++)
ans+=a[i];
}
for(int i=xl+;i<=xr-;i++)
ans+=sum[i];
return ans;
}
void update(int l,int r){
int xl=belong[l];
int xr=belong[r];
for(int i=l;i<=min(xl*sz,(long long)r);i++){
a[i]=sqrt(a[i]);
}
reset(xl);
if(xl!=xr){
for(int i=(xr-)*sz+;i<=r;i++){
a[i]=sqrt(a[i]);
}
reset(xr);
}
for(int i=xl+;i<=xr-;i++){
if(maxb[i]<=)
continue;
for(int j=(i-)*sz+;j<=i*sz;j++)
a[j]=sqrt(a[j]);
reset(i);
}
}
int main(){
scanf("%lld",&n);
sz=sqrt(n);
num=n/sz;
if(n%sz)
num++;
calbe(n);
for(int i=;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=;i<=num;i++)
reset(i);
for(int i=;i<=n;i++){
int opt,l,r,c;
scanf("%d %d %d %d",&opt,&l,&r,&c);
if(opt==)
update(l,r);
else
printf("%lld\n",query(l,r));
}
return ;
}

题解——loj6281 数列分块入门5 (分块)的更多相关文章

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

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

  2. LibreOJ 6280 数列分块入门 4(分块区间加区间求和)

    题解:分块的区间求和比起线段树来说实在是太好写了(当然,复杂度也高)但这也是没办法的事情嘛.总之50000的数据跑了75ms左右还是挺优越的. 比起单点询问来说,区间询问和也没有复杂多少,多开一个su ...

  3. LibreOJ 6278 数列分块入门 2(分块)

     题解:非常高妙的分块,每个块对应一个桶,桶内元素全部sort过,加值时,对于零散块O(sqrt(n))暴力修改,然后暴力重构桶.对于大块直接整块加.查询时对于非完整块O(sqrt(n))暴力遍历.对 ...

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

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

  5. LOJ.6284.数列分块入门8(分块)

    题目链接 \(Description\) 给出一个长为n的数列,以及n个操作,操作涉及区间询问等于一个数c的元素,并将这个区间的所有元素改为c. \(Solution\) 模拟一些数据可以发现,询问后 ...

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

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

  7. LibreOJ 6279 数列分块入门 3(分块+排序)

    题解:自然是先分一波块,把同一个块中的所有数字压到一个vector中,将每一个vector进行排序.然后对于每一次区间加,不完整的块加好后暴力重构,完整的块直接修改标记.查询时不完整的块暴力找最接近x ...

  8. LOJ.6281.数列分块入门5(分块 区间开方)

    题目链接 int内的数(也不非得是int)最多开方4.5次就变成1了,所以还不是1就暴力,是1就直接跳过. #include <cmath> #include <cstdio> ...

  9. [Libre 6282] 数列分块入门 6 (分块)

    原题:传送门 code: //By Menteur_Hxy #include<cstdio> #include<iostream> #include<algorithm& ...

随机推荐

  1. Aggregated Counting(找规律 + 预处理)

    Aggregated Counting 转 : https://blog.csdn.net/cq_phqg/article/details/48417111 题解: 可以令n=1+2+2+3+3+.. ...

  2. FileChannel

    1, FileChannel 虚拟类,不可以直接实例化,可以通过FileInputStream  FileOutputStream 获取 例:文件的复制 public class ChannelDem ...

  3. spring 源码导入eclipse(sts)

    一. 准备工作 1.下载安装sts(springsource推荐使用) 下载地址: http://www.springsource.org/downloads/sts-ggts 2.下载安装gradl ...

  4. webStorm 2018 激活

    原文地址 https://blog.csdn.net/jiangxinyu50/article/details/79104016 webStorm 2018 激活 今天早上一更新webStorm,之前 ...

  5. [转载]css3的一个控制背景的属性,background-size可以缩放大小啦

    background-size需要两个值,它的类型可以是像素(px).百分比(%)或是auto,还可以是cover和contain.第一个值为背景图的width,另外一个值用于指定背景图上的heigh ...

  6. ConvertUtils.register(new DateConverter(null), java.util.Date.class)使用

    在我们使用BeanUtils.copyProperties(dest,orig)将一个类的属性赋值给另一个类的时候 如果类中存在 Date类型的转换可能会报"no value specifi ...

  7. ubuntu 构建Xilinx交叉编译环境

    嵌入式系统软硬件协同设计实战指南_基于XILINX ZYNQ_13603826.pdf 202页

  8. Docker学习笔记之保存和共享镜像

    0x00 概述 让 Docker 引以为傲的是它能够实现相比于其他虚拟化软件更快的环境迁移和部署,在这件事情上,轻量级的容器和镜像结构的设计无疑发挥了巨大的作用.通过将容器打包成镜像,再利用体积远小于 ...

  9. P2765 魔术球问题

    P2765 魔术球问题 贪心模拟就可以过.........好像和dinic没啥关系   找找规律发现可以贪心放.n又灰常小. 设答案=m 你可以$O(mn)$直接模拟过去 闲的慌得话可以像我用个$se ...

  10. Linux 安装 RabbitMQ 3.7.8 安装部署

    Linux 安装 rabbitmq 3.7.8 安装部署 安装 ncurses 1.安装GCC GCC-C++ Openssl等模块 yum -y install make gcc gcc-c++ k ...