hdu 5869 Different GCD Subarray Query 离线+树状数组
来源:互联网 发布:下载动态壁纸软件 编辑:程序博客网 时间:2023/12/03 08:22
题意:给你n个数,每次查询[l,r]区间里所有子区间不同gcd的个数。
我们先来看如何查询区间不同数的个数: spoj D-query 区间不同数个数 主席树||离线+树状数组
上面这道题讨论的是单个点,既对答案有贡献的是单个点,而这里是子区间要怎么处理。
同理,对每个gcd有多个子区间,定义子区间左端点为子区间大小,那么只有最大的那个子区间才是有效的。
这里还要用到gcd性质,离线后对当前点它只能和前i-1个后缀取gcd,以及它自己作为gcd,这里只会产生log(a[i])个gcd。
所以保存下来暴力枚举即可。
ps:就统计区间不同数来说,还有在线做法,既对每个前缀建一棵线段树(主席树)hdu 5790 prefix 主席树
#include <iostream>#include <cstdio>#include <cstdlib>#include <map>#include <algorithm>using namespace std;const int maxn=1e5+7;struct node{ int l,r,id; bool operator<(node t)const { return r<t.r; }}q[maxn];map<int,int> mp[3];map<int,int> ::iterator it;int a[maxn];int ans[maxn];int data[maxn];int sum(int i){ int s=0; while(i>0){ s+=data[i]; i-=i&-i; } return s;}void add(int i,int x){ while(i<maxn){ data[i]+=x; i+=i&-i; }}int main(){ int n,m; while(~scanf("%d%d",&n,&m)){ fill(data,data+n+5,0); for(int i=0;i<3;i++) mp[i].clear(); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } for(int i=1;i<=m;i++){ scanf("%d%d",&q[i].l,&q[i].r); q[i].id=i; } sort(q+1,q+m+1);for(int i=1;i<=m;i++) q[0].r=0; for(int i=1;i<=m;i++){ for(int j=q[i-1].r+1;j<=q[i].r;j++){ for(it=mp[(j&1)^1].begin();it!=mp[(j&1)^1].end();it++){ int tmp=__gcd(a[j],it->first); mp[j&1][tmp]=1; if(!mp[2][tmp])mp[2][tmp]=mp[2][it->first],add(mp[2][it->first],1); else if(mp[2][it->first]>mp[2][tmp]){ add(mp[2][tmp],-1); add(mp[2][it->first],1); mp[2][tmp]=mp[2][it->first]; } } mp[j&1][a[j]]=1; if(mp[2][a[j]]){ add(mp[2][a[j]],-1); add(j,1); } else add(j,1); mp[2][a[j]]=j; mp[(j&1)^1].clear(); } ans[q[i].id]=sum(q[i].r)-sum(q[i].l-1); } for(int i=1;i<=m;i++){ printf("%d\n",ans[i]); } } return 0;}
0 0
- HDU 5869 Different GCD Subarray Query 离线 树状数组
- hdu 5869 Different GCD Subarray Query 离线+树状数组
- HDU 5869 Different GCD Subarray Query(离线处理+树状数组)
- HDU 5869 Different GCD Subarray Query (离线处理 树状数组)
- HDU 5869 Different GCD Subarray Query (数学gcd+树状数组离线查询)
- hdu-5869 Different GCD Subarray Query gcd预处理 + 树状数组 + 离线
- [区间GCD预处理 树状数组 离线] HDU 5869 Different GCD Subarray Query
- hdu 5869 Different GCD Subarray Query(gcd+树状数组)
- HDU 5869 Different GCD Subarray Query 树状数组
- HDU5869 Different GCD Subarray Query (离线+树状数组)
- [离线+树状数组] HDU5869 Different GCD Subarray Query
- HDU 5869 Different GCD Subarray Query(离线+gcd)
- 2016 大连网络赛 hdu 5869 Different GCD Subarray Query(gcd+树状数组)★ ★
- hdu 5869 Different GCD Subarray Query 预处理 + 离线
- 【gcd分块+离线+树状数组】HDU5869[Different GCD Subarray Query]题解
- 【2016-大连赛区网络赛-B】树状数组(Different GCD Subarray Query,hdu 5869)
- hdu5869 Different GCD Subarray Query(rmq+树状数组+gcd)
- HDU 5869 Different GCD Subarray Query
- 加速 Android 开发的五大开源网站
- 自制操作系统——02(读磁盘数据到内存)
- sentinel搭建redis集群经验总结
- android 中native 层的打印堆栈(c++)
- Global Supervised Descent Method
- hdu 5869 Different GCD Subarray Query 离线+树状数组
- Java中Map的使用
- Hive分析窗口函数(三) CUME_DIST,PERCENT_RANK
- 最近有几个开源项目值得介绍下
- Android 5.0 转场动画的使用
- Activity生命周期
- easy-ui学习记录-layout布局
- win7下对批量文件重命名(截取原始文件名中的部分作新名字)
- Android编程至高武学之《如来神掌》第一式~佛光初现