简化版题意

给出一个长为n的数列,以及n个操作,操作涉及区间开方(每个数都向下取整),区间求和,保证所有数都为有符号32位正整数。

N<=50000


Solution

首先我们先思考:

一个有符号32位正整数最多只能被开方几次就会得到相同的值?

\(Example\):\(2147483647=2^{31}-1\)

最多5次(由于是向下取整)

所以,我们将数列中的每一个数,都开方5次,复杂度为\(O(5n)\)


然后我们再来考虑如何分块

对于每一个块,我们可以打一个标记\(tag[i]\)

表示第\(i\)块是否全为\(1\)

然后我们就可以进行分块处理啦


对于区间\([l,r]\)

对于区间求和,暴力分块统计即可

对于操作二

对于不完整的块,暴力开方即可

对于完整的块,先利用\(tag[i]\)判断是否需要开方,然后继续暴力

完结撒花!

贴代码

\\还是很可读的,就不给注释了
#include<bits/stdc++.h>
using namespace std;
const int siz=1e6+10;
int num[siz];
int tag[siz],s[siz],b[siz];
int n,len;
int sum(int l,int r)
{
int ans=0;
if(b[l]==b[r])
{
for(int i=l;i<=r;++i)
ans+=num[i];
return ans;
}
for(int i=l;b[i]==b[l];++i) ans+=num[i];
for(int i=r;b[i]==b[r];--i) ans+=num[i];
for(int i=b[l]+1;i<=b[r]-1;++i) ans+=s[i];
return ans;
}
void add(int l,int r)
{
if(b[l]==b[r])
{
if(tag[b[l]]) return ;
for(int i=l;i<=r;++i)
s[b[i]]-=num[i],num[i]=sqrt(num[i]),s[b[i]]+=num[i];
return ;
}
if(!tag[b[l]])
for(int i=l;b[i]==b[l];++i)
s[b[i]]-=num[i],num[i]=sqrt(num[i]),s[b[i]]+=num[i];
if(!tag[b[r]])
for(int i=r;b[i]==b[r];--i)
s[b[i]]-=num[i],num[i]=sqrt(num[i]),s[b[i]]+=num[i];
for(int i=b[l]+1;i<=b[r]-1;++i)
{
if(tag[i]) continue;
tag[i]=1;
for(int j=len*(i-1)+1;b[j]==i;++j)
{
s[i]-=num[j],num[j]=sqrt(num[j]),s[i]+=num[j];
if(num[j]>1) tag[i]=0;
}
}
}
int main()
{
scanf("%d",&n);
len=sqrt(n);
for(int i=1;i<=n;++i)
scanf("%d",&num[i]);
for(int i=1;i<=n;++i)
{
b[i]=(i-1)/len+1;
s[b[i]]+=num[i];
}
int opt,l,r,c;
for(int i=1;i<=n;++i)
{
scanf("%d%d%d%d",&opt,&l,&r,&c);
if(opt) printf("%d\n",sum(l,r));
else add(l,r);
}
return 0;
}

LOJ 6281 数列分块入门 5的更多相关文章

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

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

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

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

  3. LOJ——#6277. 数列分块入门 1

    ~~推荐播客~~ 「分块」数列分块入门1 – 9 by hzwer 浅谈基础根号算法——分块 博主蒟蒻,有缘人可直接观摩以上大佬的博客... #6277. 数列分块入门 1 题目大意: 给出一个长为 ...

  4. LOJ #6285. 数列分块入门 9-分块(查询区间的最小众数)

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

  5. LOJ #6284. 数列分块入门 8-分块(区间查询等于一个数c的元素,并将这个区间的所有元素改为c)

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

  6. LOJ #6283. 数列分块入门 7-分块(区间乘法、区间加法、单点查询)

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

  7. LOJ #6282. 数列分块入门 6-分块(单点插入、单点查询、数据随机生成)

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

  8. LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)

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

  9. LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))

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

随机推荐

  1. EF 外键不显示、如何让外键显示!增、删、改 操作时,外键不显示,只显示导航属性!

    一.问题描述:EF 外键不显示.如何让外键显示!增.删.改 操作时,外键不显示,只显示导航属性! EF 添加.增加.插入数据时,外键不显示! 二.解决方案:在根据数据库生成模型的时候,选中“在模型中” ...

  2. SpringBoot 集成Apache Kafak 消息队列

    Kafka is a distributed,partitioned,replicated commit logservice.它提供了类似于JMS的特性,但是在实现上完全不同,此外它并不是JMS规范 ...

  3. vue.js 学习笔记3——TypeScript

    目录 vue.js 学习笔记3--TypeScript 工具 基础类型 数组 元组 枚举 字面量 接口 类类型 类类型要素 函数 函数参数 this对象和类型 重载 迭代器 Symbol.iterat ...

  4. C盘突然报警,空间不足,显示成红色了

    1.清理系统垃圾文件 将如下命令保存到一个bat文件中,执行,删除垃圾文件 @echo off net share c$ /del net share d$ /del net share e$ /de ...

  5. Oracle下载与Oracle安装图解(Oracle19c,Oracle18c,Oracle12c,Oracle11g)

    Oracle下载与Oracle安装图解(Oracle19c,Oracle18c,Oracle12c,Oracle11g) 1.Oracle下载(Oracle11g) oracle下载方法,请根据以下步 ...

  6. js坚持不懈之16:使用js向HTML元素分配事件

    向 button 元素分配 onclick 事件: <!DOCTYPE html> <html> <body> <p>点击按钮就可以执行 <em& ...

  7. THINKphp中复杂的查询

    字符串拼接查询 案例一:拼接字符串(多条件查询) $where = ''; //定义字符串,用于拼接满足条件的数据字段 $value = []; // 定义空数组,用于接收值 if(!empty($n ...

  8. 我为什么要花大力气从头研发智表ZCELL(一个仿EXCEL的前端插件)

    为什么呢,一个前端用的,类似EXCEL的操作的JS 插件,从头研发真的有必要吗?可能你会觉得没有必要吧,其实我自己也问过自己好多遍.因为业界有更加强大的spreadjs,也有比较轻型的JEXCEL,自 ...

  9. 【夯实shell基础】shell基础面面观

    本文地址 点击关注微信公众号 wenyuqinghuai 分享提纲: 1. shell中的函数 2. shell中的数组 3. shell中的变量 4. shell中的运算符 5. Linux的一些命 ...

  10. MySQL 常用语句总结

    用一个表更新另一个表 UPDATE table1 t1, table2 t2 SET t1.field1 = t2.field1, t1.field2 = t2.field2 WHERE t1.fie ...