题解:

还是比较水的一道题

首先可以发现每个数最多被除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. Activity四种启动模式与Flag及affinity属性详解

    Activity有四种加载模式:standard(默认).singleTop.singleTask.singleInstance standard:Activity的默认加载模式,即使某个Activi ...

  2. java Comparable 和 Comparator接口区别

    Comparable 简介 Comparable 是排序接口. 若一个类实现了Comparable接口,就意味着“该类支持排序”.  即然实现Comparable接口的类支持排序,假设现在存在“实现C ...

  3. ASP.NET MVC + EF 更新的几种方式(超赞)

    1.常用 db.Entry(实体).State = EntityState.Modified;db.SaveChanges(); 2.指定更新 db.Configuration.ValidateOnS ...

  4. python创建系统用户和用户组

    #coding=utf8 import pwd import grp import sys from _utils.patrol2 import run_cmd info=None try: info ...

  5. Project Euler Problem7

    10001st prime Problem 7 By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see t ...

  6. 读SRE Google运维解密有感(一)

    前言 这几天打算利用碎片时间读了一下"SRE Google运维解密"这本书,目前读了前几章,感觉收获颇多,结合自己的工作经历和书中的要点,写一些感悟和思考 SRE 有关SRE我就不 ...

  7. 使用apache和nginx代理实现tomcat负载均衡及集群配置详解

    实验环境: 1.nginx的代理功能 nginx proxy: eth0: 192.168.8.48 vmnet2 eth1: 192.168.10.10 tomcat server1: vmnet2 ...

  8. servlet请求中的信息

    在servlet中HttpServeltRequest中有一个方法getRequestURL() 假如我们平常输入的地址是:localhost/Demo1/TestServlet?hello=worl ...

  9. 电信运营商 IT 系统介绍

    业务支撑系统 BSS: Business support system  运营支撑系统 OSS: Operation support system  管理支撑系统 MSS: Management Su ...

  10. jmeter之beanshell取出需要参数,传递给下个请求

    jmeter之beanshell取出需要参数,传递给下个请求 事件背景: 上周同事用jmeter录制脚本,录制成功回放后,并没有达到自己想要的结果. ps:他想从数据库取出某个字段值,然后对数据库做操 ...