LOJ 6281 数列分块入门 5
简化版题意
给出一个长为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的更多相关文章
- LOJ #6281. 数列分块入门 5-分块(区间开方、区间求和)
#6281. 数列分块入门 5 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 5 题目描述 给出 ...
- LOJ.6281.数列分块入门5(分块 区间开方)
题目链接 int内的数(也不非得是int)最多开方4.5次就变成1了,所以还不是1就暴力,是1就直接跳过. #include <cmath> #include <cstdio> ...
- LOJ——#6277. 数列分块入门 1
~~推荐播客~~ 「分块」数列分块入门1 – 9 by hzwer 浅谈基础根号算法——分块 博主蒟蒻,有缘人可直接观摩以上大佬的博客... #6277. 数列分块入门 1 题目大意: 给出一个长为 ...
- LOJ #6285. 数列分块入门 9-分块(查询区间的最小众数)
#6285. 数列分块入门 9 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给 ...
- LOJ #6284. 数列分块入门 8-分块(区间查询等于一个数c的元素,并将这个区间的所有元素改为c)
#6284. 数列分块入门 8 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给出 ...
- LOJ #6283. 数列分块入门 7-分块(区间乘法、区间加法、单点查询)
#6283. 数列分块入门 7 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给出 ...
- LOJ #6282. 数列分块入门 6-分块(单点插入、单点查询、数据随机生成)
#6282. 数列分块入门 6 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 1 题目描述 给出 ...
- LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)
#6280. 数列分块入门 4 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 题目描述 给出一个 ...
- LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))
#6279. 数列分块入门 3 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 3 题目描述 给 ...
随机推荐
- 持续集成-jenkins介绍与环境搭建
什么是持续集成? 转自:https://blog.csdn.net/tanshizhen119/article/details/80328523 持续集成,俗称CI, 大师Martin Fowler对 ...
- PHP基础笔记
今天一个阳光明媚的大周天,小崔百无聊赖的翻看着各种老旧的经典电影,无奈谁让自己是没女朋友的单身狗呢.闲来无事就记录一下PHP的一些基础知识吧! 1.PHP是什么? PHP是一种创建动态交互性站点的服务 ...
- Android为TV端助力:自定义view之太阳
先看效果图 package com.hhzt.iptv.lvb_w8.view; import android.content.Context;import android.graphics.Canv ...
- jmeter使用TCP请求时,乱码问题,字符集设置
不墨迹,直接上干货.(提示:UTF-8一个汉字占3个字节) TCP请求默认发的是GBK字符集,要想修改成UTF-8,只需要修改bin目录下的jmeter.properties文件,其中tcp.char ...
- 文件去除git版本控制
git的版本控制是由其文件中的 .git文件来进行控制,但是这个文件一般情况是隐藏的. 想去除git的版本控制,有两种方式. 1.可以直接将其中的.git文件找出并删除 2.还可以通过命令的方式来操作 ...
- 手把手教新手小白在window把自己的项目上传到github
作为一个开发者,写博客,上传项目到github好像是不可不会的技能,很多有经验的老司机都会这么建议你.本宝宝第一次要把项目传到github的时候,确实有点蒙蔽,什么鬼,传个东西有必要这么难吗? git ...
- JS中 confirm() 方法
前言 环境: window 10,google 浏览器 测试代码 <html> <!-- 测试确定框,如果点 "是" ,则返回 true,这样就触发 a 标签的 ...
- SHA1withRSA加签名和验签名
利用私钥加签名: //contentForSign为需加标签的字符串 public String signWhithsha1withrsa(string contentForSign) { strin ...
- Linux:Day18(下) Bind9
子域授权:每个域的名称服务器,都是通过其上级名称服务器在解析库中进行授权. 类似根域授权tld: .com IN NS ns1.com. .com IN NS ns1.com. ns1.com IN ...
- 弱网测试-Network Emulator 网络模拟工具使用
参考链接 https://www.jianshu.com/p/6a3d38aafac1