题解:

还是比较水的一道题

首先可以发现每个数最多被除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. link 和@import 的区别

    两者都为外部引入css的方式. 他们的区别: 1.link属于HTML标签,而@import是css提供的 2.页面被加载时候,link会同时加载,而@import引入的文件会等到页面加载完成之后再进 ...

  2. 3 快速创建SpringBoot项目

    一.Intellij IDEA 创建Spring Boot项目 1.创建工程  2.选择Spring Initializr 3.设置Maven版本管理参数  4.选择引用模块  5.命名工程名 6.选 ...

  3. fcn16s

  4. Synchronized和lock的区别和用法

    一.synchronized和lock的用法区别 (1)synchronized(隐式锁):在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要 ...

  5. 分享一款Markdown的css样式

    使用 本样式在这个样式的基础上做了一些修改, 主要是对于表格和代码块以及一些细节的修改. 主要目的是用在chrome的扩展 Markdown Preview Plus中, 替换其内置的样式. 由于 M ...

  6. android彻底关闭应用程序方法

    Android SDK > 7(Android2.1)之后,即Android2.2及以后版本彻底关闭应用的方法,目前试验只有一下方法有效: Intent startMain = new Inte ...

  7. spring-framework-x.x.x.RELEASE-dist下载教程

    1.打开Spring官网:https://spring.io,点击PROJECTS 2.点击SPRING FRAMEWORK 3.点击GitHub图标 4.找到Access to Binaries,点 ...

  8. Shiro简介及入门(四)

    1.1     什么是shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权. spring中有spring security (原名Acegi),是一个权 ...

  9. SpringBoot集成SpringCloud

    (1).新建一个普通Maven项目,用于存放一些公共服务接口及公共的Bean等. 项目结构: 公共Bean: package cn.coreqi.entities; import java.io.Se ...

  10. 内核IS_ERR宏解析 【转】

    转自:http://blog.chinaunix.net/uid-20196318-id-28769.html 最近在使用filp_open打开文件时遇到到一个问题,当打开一个并不存在的文件时,fil ...