题解:

还是比较水的一道题

首先可以发现每个数最多被除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. Jupyter 魔术命令(magic commands)

    自动重新加载更改的模块 命令参数如下所示: %autoreload: 自动重载%aimport排除的模块之外的所有模块. %autoreload 0: 禁用自动重载 %autoreload 1: 自动 ...

  2. JAVA 并发编程学习(2)之基本概念

    1,是不是线程创建越多越好? 当一个程序创建了大量的线程时,活跃的线程会消耗内存.若可运行的线程数量多于可用处理器的数量,那么有些线程将闲置.大量空闲的线程会占用许多内存,给垃圾回收带来压力,而且大量 ...

  3. MyBatis下MySqL用户口令不能为空

    jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3308/testjdbc.username=testjdbc.pas ...

  4. WPS, 破解WPA/WPA2密钥的捷径

    1.关于WPS(WIFI保护设置) WPS(WIFI保护设置)主要致力于简化无线网络的安全加密设置. 传统方式下,用户新建一个无线网络时,必须在接入点手动设置网络名(SSID)和安全密钥,然后在客户端 ...

  5. Python之Eclipse环境下安装与配置

    奔着对python的好奇,今天又是周末,欲小试Python.那么首先避不开的问题就是python的环境搭建.而我之前已经在学习Java的过程中安装了Eclipse,不想再安装更多的IDE了,就那Ecl ...

  6. CSS —— 选择器

    选择器种类 标签选择器 id选择器 类选择器 通配符 交集选择器 并集选择器 后代选择器 子代选择器 选择器设置样式优先级 默认样式 < 继承样式 < 通配符设置样式 < 标签选择器 ...

  7. 3、输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。

    题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 思路: 利用栈“先进后出”的性质,将链表的值存入到栈里,然后将栈里的值存入到构建好的容器里,最后打印容器. class So ...

  8. 利用 python requests完成接口文件上传

    最近在准备一个公开课,主题就是利用不同的语言和不同的工具去实现文件的上传和下载. 在利用Jmeter去实现功能的时候,以及利用loadrunner去写脚本的时候,都很顺利,没有任何问题,当我尝试用Py ...

  9. 移动前端框架,require.js压缩

    static css images 不同的页面可以新建不同的图片文件夹(可选) js libs       前端类库 plugs    插件 views    自己写的代码文件 sass/less l ...

  10. 【API】API函数创建用户,添加到管理组

    1 学习目标 使用API添加用户可以绕过某些杀毒软件的限制. 2 编程思路 2.1 代码原理 使用NetUserAdd这个API添加普通权限的用户,NetLocalGroupAddMembers这个A ...