hdu 5381
题解:
还是比较水的一道题
首先可以发现每个数最多被除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的更多相关文章
- hdu 5381 The sum of gcd(线段树+gcd)
题目链接:hdu 5381 The sum of gcd 将查询离线处理,依照r排序,然后从左向右处理每一个A[i],碰到查询时处理.用线段树维护.每一个节点表示从[l,i]中以l为起始的区间gcd总 ...
- 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 ...
- hdu 5381 The sum of gcd
知道对于一个数列,如果以x为左(右)端点,往右走,则最多会有log(a[x])个不同的gcd,并且有递减性 所以会分成log段,每一段的gcd相同 那我们可以预处理出对于每一个位置,以这个位置为左端点 ...
- 【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= ...
- 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 ...
- HDU 5381 The sum of gcd (技巧,莫队算法)
题意:有一个含n个元素的序列,接下来有q个询问区间,对每个询问区间输出其 f(L,R) 值. 思路: 天真单纯地以为是道超级水题,不管多少个询问,计算量顶多就是O(n2) ,就是暴力穷举每个区间,再直 ...
- 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 ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
随机推荐
- CodeForces - 163B Lemmings
B. Lemmings time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...
- Java编程思想 学习笔记8
八.多态 在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特征. 多态通过分离做什么和怎么做,从另一角度将接口和实现分离开来. “封装”通过合并特征和行为来创建新的数据类型.“实现 ...
- 浅谈cookie与session的区别
cookie用的是在客户端保持状态的方案(它是在用户端的会话状态的存贮机制),前端也可以来设置他 所有浏览器都识别,并且会缓存在浏览器中. cookie是以key=value这种键值对的形式保存,每个 ...
- ==========2014-04-24=========winform树控件勾选方法 和获取所有选中的
http://bbs.bccn.net/thread-197567-1-1.html /// <summary> /// 已选中或取消选中树节点上的复选框时 /// </summar ...
- Linux - 系统资源
查看剩余内存 free -m #-/+ buffers/cache: #6458M为真实使用内存 1649M为真实剩余内存(剩余内存+缓存+缓冲器) #linux会利用所有的剩余内存作为缓存,所以要保 ...
- js设置div透明度
原生js设置透明度 为了兼容IE与其他浏览器对透明度的设置,我们需要对以上两种样式分别进行设置: 复制代码代码如下: var alpha = 30; //透明度值变量 var oDiv = docum ...
- luogu P2900 [USACO08MAR]土地征用Land Acquisition
写这道题时,预处理部分少打了等号,吓得我以为斜率优化错了或者被卡精了 mmp 首先有一个很明显的结论(逃),就是一个土地如果长(\(x\))与宽(\(y\))都比另一个土地小,那么这个土地一定可以跟那 ...
- undefined reference问题总结
http://ticktick.blog.51cto.com/823160/431329 http://blog.sina.com.cn/s/blog_605f5b4f01018xeu.html ht ...
- 教你如何使用android studio发布release 版本【转】
原文链接 想必还有人对如何在Android studio (以下简称as)发布release版本的app而狂刷百度吧?都是过来人,我很理解这种心情,百度到的基本是半成品,为什么这么说呢?百度一下,你就 ...
- python内置模块之unittest测试(五)
系列文章 python模块分析之random(一) python模块分析之hashlib加密(二) python模块分析之typing(三) python模块分析之logging日志(四) pytho ...