问题描述

LG-SP2713


题解

分块,区间开根。

如果一块的最大值是 \(1\) ,那么这个块就不用开根了。

如果最大值不是 \(1\) ,直接暴力开就好了。


\(\mathrm{Code}\)

#include<bits/stdc++.h>
using namespace std; #define int long long template <typename Tp>
void read(Tp &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
if(ch=='-') ch=getchar(),fh=-1;
else fh=1;
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
x*=fh;
} int non; const int maxn=100007; int n,cas;
int a[maxn];
int L[maxn],R[maxn],bel[maxn];
int cnt,blo,mx[maxn],sum[maxn]; void reset(){
memset(mx,0,sizeof(mx));
memset(sum,0,sizeof(sum));
memset(L,0,sizeof(L));
memset(R,0,sizeof(R));
memset(bel,0,sizeof(bel));
} void Init(){
for(int i=1;i<=n;i++) read(a[i]);
} void change(){
int x,y;read(x);read(y);//read(non);
if(x>y) swap(x,y);
if(bel[x]==bel[y]){
if(mx[bel[x]]==1) return;
for(int i=x;i<=y;i++){
sum[bel[i]]-=a[i];
a[i]=sqrt((double)a[i]);
sum[bel[i]]+=a[i];
}
mx[bel[x]]=-1;
for(int i=L[bel[x]];i<=R[bel[x]];i++)
mx[bel[x]]=max(mx[bel[x]],a[i]);
return;
}
if(mx[bel[x]]!=1){
for(int i=x;i<=R[bel[x]];i++){
sum[bel[i]]-=a[i];
a[i]=sqrt((double)a[i]);
sum[bel[i]]+=a[i];
}
mx[bel[x]]=-1;
for(int i=L[bel[x]];i<=R[bel[x]];i++){
mx[bel[x]]=max(mx[bel[x]],a[i]);
}
}
if(mx[bel[y]]!=1){
for(int i=L[bel[y]];i<=y;i++){
sum[bel[i]]-=a[i];
a[i]=sqrt((double)a[i]);
sum[bel[i]]+=a[i];
}
mx[bel[y]]=-1;
for(int i=L[bel[y]];i<=R[bel[y]];i++){
mx[bel[y]]=max(mx[bel[y]],a[i]);
}
}
for(int i=bel[x]+1;i<bel[y];i++){
if(mx[i]==1) continue;
mx[i]=-1;
for(int j=L[i];j<=R[i];j++){
sum[i]-=a[j];
a[j]=sqrt((double)a[j]);
sum[i]+=a[j];
mx[i]=max(mx[i],a[j]);
}
}
} void query(){
int res=0,x,y;read(x);read(y);//read(non);
if(x>y) swap(x,y);
if(bel[x]==bel[y]){
for(int i=x;i<=y;i++) res+=a[i];
printf("%lld\n",res);
return;
}
for(int i=x;i<=R[bel[x]];i++) res+=a[i];
for(int i=L[bel[y]];i<=y;i++) res+=a[i];
for(int i=bel[x]+1;i<bel[y];i++) res+=sum[i];
printf("%lld\n",res);
} void solve(){
blo=sqrt((double)n);cnt=n/blo;
cnt=cnt+((n%blo)!=0);
for(int i=1;i<=cnt;i++){
L[i]=(i-1)*blo+1,R[i]=i*blo;
}
R[cnt]=n;
for(int i=1;i<=n;i++){
bel[i]=(i-1)/blo+1;
sum[bel[i]]+=a[i];
mx[bel[i]]=max(mx[bel[i]],a[i]);
}
int T,op;
// T=n;
read(T);
while(T--){
read(op);
if(op==0) change();
else query();
}
puts("");
} signed main(){
while((~scanf("%lld",&n))&&n){
printf("Case #%d:\n",++cas);
reset();Init();solve();
}
return 0;
}

SP2713 GSS4 - Can you answer these queries IV 分块的更多相关文章

  1. 线段树 SP2713 GSS4 - Can you answer these queries IV暨 【洛谷P4145】 上帝造题的七分钟2 / 花神游历各国

    SP2713 GSS4 - Can you answer these queries IV 「题意」: n 个数,每个数在\(10^{18}\) 范围内. 现在有「两种」操作 0 x y把区间\([x ...

  2. SP2713 GSS4 - Can you answer these queries IV(线段树)

    传送门 解题思路 大概就是一个数很少次数的开方会开到\(1\),而\(1\)开方还是\(1\),所以维护一个和,维护一个开方标记,维护一个区间是否全部为\(1/0\)的标记.然后每次修改时先看是否有全 ...

  3. 【SP2713 GSS4 - Can you answer these queries IV】 题解

    题目链接:https://www.luogu.org/problemnew/show/SP2713 真暴力啊. 开方你开就是了,开上6次就都没了. #include <cmath> #in ...

  4. SP2713 GSS4 - Can you answer these queries IV

    题目大意 \(n\) 个数,和在\(10^{18}\)范围内. 也就是\(\sum~a_i~\leq~10^{18}\) 现在有两种操作 0 x y 把区间[x,y]内的每个数开方,下取整 1 x y ...

  5. 洛谷P4145 上帝造题的七分钟2 / 花神游历各国(重题:洛谷SP2713 GSS4 - Can you answer these queries IV)

    题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对一段 ...

  6. GSS4 - Can you answer these queries IV || luogu4145上帝造题的七分钟2 / 花神游历各国 (线段树)

    GSS4 - Can you answer these queries IV || luogu4145上帝造题的七分钟2 / 花神游历各国 GSS4 - Can you answer these qu ...

  7. GSS4 - Can you answer these queries IV(线段树懒操作)

    GSS4 - Can you answer these queries IV(线段树懒操作) 标签: 线段树 题目链接 Description recursion有一个正整数序列a[n].现在recu ...

  8. 题解【SP2713】GSS4 - Can you answer these queries IV

    题目描述 You are given a sequence \(A\) of \(N(N \leq 100,000)\) positive integers. There sum will be le ...

  9. 「SP2713」GSS4 - Can you answer these queries IV

    传送门 Luogu 解题思路 区间开方以及区间求和. 考虑用线段树来做. 开方操作看似没有任何结合律可言,但这题有另外一个性质: 一个数的初始值不超过 \(10^{18}\) ,而这个数被开方6次左右 ...

随机推荐

  1. PlayJava Day024

    造型Cast补充: 子类的对象可以赋值给父类的变量 注意:Java中不存在对象对对象的赋值 父类的对象不能赋值给子类的变量 例: Vechicle v ; Car c = new Car() ; v ...

  2. Elasticsearch实现复合查询,高亮结果等技巧

    一.Es的配置 实现es的全文检索功能的第一步,首先从与es进行连接开始,这里我使用的是es的5.x java api语法. public TransportClient esClient() thr ...

  3. Windows系统Git安装教程(详解Git安装过程)

    Windows系统Git安装教程(详解Git安装过程)   今天更换电脑系统,需要重新安装Git,正好做个记录,希望对第一次使用的博友能有所帮助! 获取Git安装程序   到Git官网下载,网站地址: ...

  4. 基于Redis扩展模块的布隆过滤器使用

    什么是布隆过滤器?它实际上是一个很长的二进制向量和一系列随机映射函数.把一个目标元素通过多个hash函数的计算,将多个随机计算出的结果映射到不同的二进制向量的位中,以此来间接标记一个元素是否存在于一个 ...

  5. js设置定时执行

    具体语法参考:https://www.runoob.com/jsref/met-win-setinterval.html var timer = window.setInterval(function ...

  6. docker下MySQL的主从复制

    MySql的主从复制 sudo docker pull MySQL:5.7 拉取MySQL的镜像文件(版本号为 5.7) sudo docker run -p 3339:3306 --name mas ...

  7. November 10th, Week 45th, Sunday, 2019

    Perfection has no place in love. 爱从不完美. Perfection has no place in love, and we should always try to ...

  8. PDF软件

    推荐的PDF阅读软件:文电通

  9. 蓝牙spp协议分析

    基本概念 蓝牙串口是基于 SPP 协议(Serial Port Profile),能在蓝牙设备之间创建串口进行数据传输的一种设备. 蓝牙串口的目的是针对如何在两个不同设备(通信的两端)上的应用之间保证 ...

  10. 洛谷P3128 [USACO15DEC]最大流Max Flow (树上差分)

    ###题目链接### 题目大意: 给你一棵树,k 次操作,每次操作中有 a  b 两点,这两点路上的所有点都被标记一次.问你 k 次操作之后,整棵树上的点中被标记的最大次数是多少. 分析: 1.由于数 ...