问题描述

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. js执行机制

    js是单线程的,为什么可以执行异步操作呢? 这归结与浏览器(js的宿主环境)通过某种方式使得js具备了异步的属性. 区分进程和线程: 进程:正在运行中的应用程序.每个进程都自己独立的内存空间.例如:打 ...

  2. FCC---CSS Flexbox: Add Flex Superpowers to the Tweet Embed

    To the right is the tweet embed that will be used as the practical example. Some of the elements wou ...

  3. nodejs环境使用Typeorm连接查询Oracle

    首先是typeorm的官方地址, 国内有人翻了中文版,不保证时效性 ·通过npm安装下列包: typeorm //typeorm连接数据库 @types/node //类型系统 typescript ...

  4. Dijkstra.NET 库体验报告

    在VS里用Nuget下载"Dijkstra.NET"库,然后就可以在需要的地方使用了. 首先,这是一个简单的graph,5个节点,7条边. 上代码 移动端看不清楚的可以看下面的: ...

  5. 前端开发规范:2-HTML

    HTML标签 文档声明,除非必须要兼容IE6等远古浏览器,否则一律使用HTML5文档类型申明<!DOCTYPE html> 标签闭合,img.br.hr 等自闭合标签不使用闭合斜杠 met ...

  6. Python—定时任务(APScheduler实现)

    简介                 APScheduler的全称是Advanced Python Scheduler.它是一个轻量级的基于Quartz的 Python 定时任务调度框架.APSche ...

  7. 10-Node.js学习笔记-异步函数

    异步函数 异步函数是异步编程语法的终极解决方案,它可以让我们将异步代码写成同步的形式,让代码不再有回调函数嵌套,是代码变得清晰明了 const fn = async()=>{} async fu ...

  8. Django中获取参数(路径,查询,请求头,请求体)

    一.通常HTTP协议向服务器传参有几种途径 : 提取URL的特定部分,如/weather/shanghai/2018,可以在服务器端的路由中用正则表达式截取: 查询字符串(query string), ...

  9. Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3

    A,有多个线段,求一条最短的线段长度,能过覆盖到所又线段,例如(2,4)和(5,6) 那么我们需要4 5连起来,长度为1,例如(2,10)(3,11),用(3,10) 思路:我们想一下如果题目说的是最 ...

  10. 基于docker-compose搭建本地sentry服务

    环境要求: centos 7 Docker 17.05.0+ Compose 1.19.0+ RAM 2400MB docker-compose 安装 ``$ curl -L https://get. ...