题解:

还是比较水的一道题

首先可以发现每个数最多被除log次,所以有连续一段相同

然后我想的是变成矩形统计前缀和问题用主席树来维护

然后发现这题很卡空间

qwq acm依旧很多64mb的题

首先比较重要的一点是

这题如果不用标记永久化

需要用到down

主席树down需要新开节点(随意yy一下就知道了)

当然为了节省空间我们选择标记永久化

这时候我们就要记录两个标记

一个代表不用传递到儿子的data

一个代表要传递到儿子的lazy

至于为什么自己想一下就知道了

另外这题的方法应该是将询问离线(离线很重要啊)

然后把每个询问拆成两个,sort一遍再做

这样就是线段树的空间了

正解:

另外这题应该还有一个做法,就是直接对整个序列建线段树是在线的(我觉得这个应该才算正解)

然后维护每个区间中子区间gcd的和,和边界区间对应的log个数值,以及对应个数

然后区间合并显然可以通过这些信息来维护

而查询的时候先找出对应区间,用和updata一样的方法维护答案

不过这样updata的时候应该是logn^2的

所以时间应该是nlogn^3的

线段树很多时候就是像这样利用区间合并 下次应该要注意一下

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define IL inline
#define rint register int
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
#define mid ((h+t)/2)
IL int max(int x,int y)
{
if (x>y) return(x);
else return(y);
}
IL int min(int x,int y)
{
if (x<y) return(x);
else return(y);
}
IL void swap(int &x,int &y)
{
int tmp=x;x=y,y=tmp;
}
struct re{
int a,b;
};
vector<re> ve,ve1;
const int N=1.1e4;
const int N2=3e6;
int n,m,a[N],root[N],cnt,ls[N2],rs[N2],lazy[N2];
ll data[N2];
int gcd(int x,int y)
{
if(!y) return(x);
return(gcd(y,x%y));
}
void change(int last,int &x,int h,int t,int h1,int t1,int k)
{
x=++cnt;
ls[x]=ls[last]; rs[x]=rs[last]; lazy[x]=lazy[last]; data[x]=data[last];
data[x]+=1ll*k*(min(t,t1)-max(h,h1)+);
if (h1<=h&&t<=t1)
{
lazy[x]+=k; return;
}
if (h1<=mid) change(ls[last],ls[x],h,mid,h1,t1,k);
if (mid<t1) change(rs[last],rs[x],mid+,t,h1,t1,k);
}
ll query2(int x,int h,int t,int h1,int t1,int k)
{
if (h1<=h&&t<=t1) return(data[x]+k*(t-h+));
ll ans=;
if (h1<=mid) ans+=query2(ls[x],h,mid,h1,t1,k+lazy[x]);
if (mid<t1) ans+=query2(rs[x],mid+,t,h1,t1,k+lazy[x]);
return(ans);
}
IL ll query(int x,int h,int t,int h1,int t1)
{
if (h1>t1) return();
return(query2(x,h,t,h1,t1,));
}
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
int T;
scanf("%d",&T);
while (scanf("%d",&n)!=EOF)
{
rep(i,,n) scanf("%d",&a[i]);
cnt=;
memset(ls,,sizeof(ls));
memset(rs,,sizeof(rs));
memset(lazy,,sizeof(lazy));
ve.clear();
rep(i,,n)
{
ve1.clear();
int tmp=a[i],last=i;
root[i]=root[i-];
ve1.push_back((re){i,tmp});
int len=ve.size()-;
rep(j,,len)
{
int tmp2=tmp;
tmp=gcd(tmp,ve[j].b);
if (tmp2!=tmp)
{
ve1.push_back((re){ve[j].a,tmp});
change(root[i],root[i],,n,ve[j].a+,last,tmp2);
last=ve[j].a;
}
}
change(root[i],root[i],,n,,last,tmp);
ve.swap(ve1);
}
scanf("%d",&m);
rep(i,,m)
{
int l,r;
scanf("%d%d",&l,&r);
printf("%lld\n",query(root[r],,n,,r)-query(root[r],,n,,l-));
}
}
return ;
}

hdu 5381的更多相关文章

  1. hdu 5381 The sum of gcd(线段树+gcd)

    题目链接:hdu 5381 The sum of gcd 将查询离线处理,依照r排序,然后从左向右处理每一个A[i],碰到查询时处理.用线段树维护.每一个节点表示从[l,i]中以l为起始的区间gcd总 ...

  2. hdu 5381 The sum of gcd 莫队+预处理

    The sum of gcd Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) P ...

  3. hdu 5381 The sum of gcd

    知道对于一个数列,如果以x为左(右)端点,往右走,则最多会有log(a[x])个不同的gcd,并且有递减性 所以会分成log段,每一段的gcd相同 那我们可以预处理出对于每一个位置,以这个位置为左端点 ...

  4. 【HDU 5381】 The sum of gcd (子区间的xx和,离线)

    [题目] The sum of gcd Problem Description You have an array A,the length of A is nLet f(l,r)=∑ri=l∑rj= ...

  5. hdu 5381 The sum of gcd 2015多校联合训练赛#8莫队算法

    The sum of gcd Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) T ...

  6. HDU 5381 The sum of gcd (技巧,莫队算法)

    题意:有一个含n个元素的序列,接下来有q个询问区间,对每个询问区间输出其 f(L,R) 值. 思路: 天真单纯地以为是道超级水题,不管多少个询问,计算量顶多就是O(n2) ,就是暴力穷举每个区间,再直 ...

  7. 2015 Multi-University Training Contest 8 hdu 5381 The sum of gcd

    The sum of gcd Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  8. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

随机推荐

  1. Java编程思想 学习笔记11

    十一.持有对象  通常,程序总是根据运行时才知道的某些条件去创建新对象.在此之前,不会知道所需对象的数量,甚至不知道确切的类型. Java实用库还提供了一套相当完整的容器类来解决这个问题,其中基本的类 ...

  2. FastReport报表打印总页数的问题?

    设置两次报表后加入引号内内容 "第[Page#]页 共[TotalPages#]页" 本站文章除注明转载外,均为本站原创或翻译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果 ...

  3. 2 Player and N Coin

    class Solution { public void printChoices(int[] A, int[][] C) { System.out.println("硬币列表如下:&quo ...

  4. cetus系列~ cetus+mha

    一 简介:mha+cetus高可用架构二 环境  1 mysql 5.7 并行复制+GTID  2 cetus最新版  3 mha0.57二 安装  1 安装mha-rpm包  2 做免密认证  3 ...

  5. TDateTimePicker 选择最小日期时异常处理

    TDateTimePicker 控件属性窗体选择最小日期,运行时选择时可以看到的最小的日期,但是选择最小时就异常 :date is less than minimum of  ***     解决过程 ...

  6. Gaussian discriminant analysis 高斯判别分析

    高斯判别分析(附Matlab实现) 生成学习算法 高斯判别分析(Gaussian Discriminant analysis,GDA),与之前的线性回归和Logistic回归从方法上讲有很大的不同,G ...

  7. 使用Idea初始化SpringMvc项目

    (1) (2) (3) (4) (5)感谢http://www.cnblogs.com/feiyujun/p/6537510.html (6)

  8. win7安装Ubuntu变双系统以及删除Ubuntu分区操作

    Window7系统基础上安装Ubuntu使构成双系统,整个过程如下: 1. 一块空闲磁盘分区准备. “我的电脑”右键 > 管理 > 磁盘管理 > 压缩(从有空余分区压缩)/删除(删除 ...

  9. windows 10 64bit下安装Tensorflow+Keras+VS2015+CUDA8.0 GPU加速

    原文地址:http://www.jianshu.com/p/c245d46d43f0 写在前面的话 2016年11月29日,Google Brain 工程师团队宣布在 TensorFlow 0.12 ...

  10. saltstack自动化运维系列③之saltstack的常用模块使用

    saltstack自动化运维系列③之saltstack的常用模块使用 1.命令的常用方法: 指定主机运行命令 # salt 'mini1' cmd.run 'date'mini1: Fri Apr 7 ...