洛谷 P4145 上帝造题的七分钟2 / 花神游历各国
这题就是区间开根号,区间求和。我们可以分块做。
我们记布尔数组vis[i]表示第i块中元素是否全部为1。
因为显然当一个块中元素全部为1时,并不需要对它进行根号操作。
我们每个块暴力开根号,因为数字最大\(2^{31}\),所以最多每个数字开几次根号,所以时间复杂度很低。
记录sum[i]表示第i块的总和,所以我们得到这样的算法:
当出现修改操作时,我们暴力修改,如果vis[i]为真,则不对该块进行操作。
而出现查询操作时,直接对正常操作再输出即可。
代码略丑:
#include <bits/stdc++.h>
#define _ putchar('\n')
using namespace std;
typedef int _int;
#define int long long
const int N=100010;
bool vis[N];
int n,m,a[N],len,num;
int pos[N],sum[N],ll[N],rr[N];
inline void read(int &aa)
{
aa=0;char c=getchar();
for (;c>'9'||c<'0';c=getchar());
for (;c>='0'&&c<='9';c=getchar())
aa=(aa<<3)+(aa<<1)+(c^48);
}
char buffer[N],*S,*T;
inline char Get_Char()
{
if (S==T) {
T=(S=buffer)+fread(buffer,1,N,stdin);
if (S==T) return EOF;
}
return *S++;
}
int Get_Int()
{
char c;
int re=0;
for (c=Get_Char();c<'0'||c>'9';c=Get_Char());
while (c>='0'&&c<='9')
re=(re<<1)+(re<<3)+(c-'0'),c=Get_Char();
return re;
}
void print(int x)
{
if (x>9) print(x/10);putchar(x%10^48);
}
void build()
{
len=sqrt(n);
num=n/len;if (n%len) ++num;
for (int i=1;i<=num;++i)
ll[i]=(i-1)*len+1,rr[i]=i*len;
rr[num]=n;
for (int i=1;i<=num;++i)
for (int j=ll[i];j<=rr[i];++j)
sum[i]+=a[j];
for (int i=1;i<=n;++i)
pos[i]=(i-1)/len+1;
}
int ask(int l,int r)
{
int ans=0;
if (pos[l]==pos[r]) {
for (int i=l;i<=r;++i)
ans+=a[i];
return ans;
}
for (int i=l;i<=rr[pos[l]];++i)
ans+=a[i];
for (int i=pos[l]+1;i<pos[r];++i)
ans+=sum[i];
for (int i=ll[pos[r]];i<=r;++i)
ans+=a[i];
return ans;
}
void change(int l,int r)
{
if (pos[l]==pos[r]) {
if (vis[pos[l]]) return;
for (int i=l;i<=r;++i) {
sum[pos[l]]-=a[i];
a[i]=sqrt(a[i]);
sum[pos[l]]+=a[i];
}
vis[pos[l]]=1;
for (int i=ll[pos[l]];i<=rr[pos[l]];++i)
if (a[i]>1) {vis[pos[l]]=0;break;}
return;
}
if (!vis[pos[l]]) {
for (int i=l;i<=rr[pos[l]];++i) {
sum[pos[l]]-=a[i];
a[i]=sqrt(a[i]);
sum[pos[l]]+=a[i];
}
vis[pos[l]]=1;
for (int i=ll[pos[l]];i<=rr[pos[l]];++i)
if (a[i]>1) {vis[pos[l]]=0;break;}
}
if (!vis[pos[r]]) {
for (int i=ll[pos[r]];i<=r;++i) {
sum[pos[r]]-=a[i];
a[i]=sqrt(a[i]);
sum[pos[r]]+=a[i];
}
vis[pos[r]]=1;
for (int i=ll[pos[r]];i<=rr[pos[r]];++i)
if (a[i]>1) {vis[pos[r]]=0;break;}
}
for (int i=pos[l]+1;i<pos[r];++i) {
if (vis[i]) continue;
for (int j=ll[i];j<=rr[i];++j) {
sum[i]-=a[j];
a[j]=sqrt(a[j]);
sum[i]+=a[j];
}
vis[i]=1;
for (int j=ll[i];j<=rr[i];++j)
if (a[j]>1) {vis[i]=0;break;}
}
}
_int main()
{
n=Get_Int();
for (int i=1;i<=n;++i) a[i]=Get_Int();
build();
m=Get_Int();
int opt,l,r;
while (m--) {
opt=Get_Int(),l=Get_Int(),r=Get_Int();
if (l>r) swap(l,r);
if (opt) print(ask(l,r)),_;
else change(l,r);
}
return 0;
}
洛谷 P4145 上帝造题的七分钟2 / 花神游历各国的更多相关文章
- 洛谷P4145 上帝造题的七分钟2/花神游历各国 [树状数组,并查集]
题目传送门 题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是 ...
- 洛谷P4145——上帝造题的七分钟2 / 花神游历各国
题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段 ...
- 洛谷P4145 上帝造题的七分钟2 / 花神游历各国(重题:洛谷SP2713 GSS4 - Can you answer these queries IV)
题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段 ...
- 【题解】 Luogu P4145 上帝造题的七分钟2 / 花神游历各国
原题传送门 这道题实际和GSS4是一样的,只是输入方式有点区别 GSS4传送门 这道题暴力就能过qaq(这里暴力指线段树) 数据比较水 开方修改在线段树中枚举叶节点sqrt 查询区间和线段树基本操作 ...
- P4145 上帝造题的七分钟2 / 花神游历各国(线段树区间开平方)
有点意思,不需要什么懒标记之类的东西,因为一个数无论怎样开平方,最后取整的结果必然会是1,所以我们不妨用最大值来维护,若区间最大值不为1,就暴力修改,否则不用管. #include<bits/s ...
- P4145 上帝造题的七分钟2 / 花神游历各国
思路 每个数不会被开方超过log次,对每个数暴力开方即可 代码 #include <algorithm> #include <cstring> #include <cst ...
- luogu P4145 上帝造题的七分钟2 / 花神游历各国 维护区间和&&区间开根号
因为开根号能使数字减小得非常快 所以开不了几次(6次?)很大的数就会变成1..... 所以我们可以维护区间最大值,若最大值>1,则继续递归子树,暴力修改叶节点,否则直接return (好像也可以 ...
- day1 晚上 P4145 上帝造题的七分钟2 / 花神游历各国 线段树
#include<iostream> #include<cstdio> #include<cmath> using namespace std; ; struct ...
- [Luogu P4145] 上帝造题的七分钟2 / 花神游历各国
题目链接 题目简要:我们需要一个能支持区间内每一个数开方以及区间求和的数据结构. 解题思路:说道区间修改区间查询,第一个想到的当然就是分块线段树.数据范围要用long long.本来我是看到区间这两个 ...
随机推荐
- [svc]jdk1.7.0_13(系列)下载url
蛋疼了,这个版本,找了老半天没找到 最后是同事找到的 http://download.oracle.com/otn/java/jdk/7u13-b20/jdk-7u13-linux-x64.tar.g ...
- flink on yarn 用户代码获取keytab本地文件和principal的方法
flink on yarn的情况下配置的keytab文件会根据每次yarn application 分配taskmanager的变化都是不一样的,在部分场景下用户代码也需要获得keytab文件在yar ...
- WEEX快速入门
WEEX快速入门 WEEX 是阿里推送的一款基于Node.js,轻量级的移动端跨平台动态性技术解决方案,用于构建原生的速度的跨平台APP. 1. 搭建WEEX环境 1.1 首先下载安装Node.js, ...
- [JNA系列]Java调用Delphi编写的Dll之实例Delphi使用PAnsiChar
Delphi代码 unit UnitDll; interface uses StrUtils, SysUtils, Dialogs; function DoBusinessAnsi(pvData: P ...
- 阿里正式发布《Java开发手册》终极版!
摘要: 本文讲的是阿里正式发布<Java开发手册>终极版!,别人都说我们是码农,但我们知道,自己是个艺术家.也许我们不过多在意自己的外表和穿着,但我们不羁的外表下,骨子里追求着代码的美.质 ...
- 写一个php小脚本辅助渗透测试
因为一个注入要爬行一些数据,然后写的一个小脚本,能写脚本来辅助渗透,也算是里程碑.哈哈哈 <?php $num = 1; while ($num <= 39) { $web_url = & ...
- 跟着百度学PHP[14]-PDO之Mysql的事务处理2
前面所将仅仅是在纯mysql下的讲解,这节就是要将其搬到PDO台面上来了. 将自动提交关闭. SetAttribute下有一个PDO::ATTR_AUTOCOMMIT 将其设置为0即可关闭,如:$pd ...
- 2016-2017 ACM-ICPC CHINA-Final H Great Cells ans[i]*i看做整体,转化为期望理解来解题
/** 题目:2016-2017 ACM-ICPC CHINA-Final H Great Cells 链接:http://codeforces.com/gym/101194 题意:给定n*m的矩形, ...
- UVALive 7712 Confusing Manuscript 字典树 查询与s的编辑距离为1的字符串数量
/** 题目:UVALive 7712 Confusing Manuscript 链接:https://vjudge.net/problem/UVALive-7712 题意:给定n个不同的字符串,f( ...
- 微信小程序,时间戳转为日期格式
//数据转化 function formatNumber(n) { n = n.toString() ] ? n : ' + n } /** * 时间戳转化为年 月 日 时 分 秒 * number: ...