hdu-5869 Different GCD Subarray Query gcd预处理 + 树状数组 + 离线
来源:互联网 发布:php spl 编辑:程序博客网 时间:2024/05/21 03:54
http://acm.hdu.edu.cn/showproblem.php?pid=5869
题意:
长度n的序列, m个询问区间[L, R], 问区间内的所有子段的不同GCD值有多少种.
n,m<=1e5
又学到一个套路,预处理一个gcd表,固定右端点,向左延伸有多少个不同的gcd值以及他们出现的位置。
每固定一个端点的话,log下降的很快,不会超过logA个。
要是预处理出这个东西的话,我们把询问按照右端点离线,就又是那个套路了,bit维护一下
#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <algorithm>#include <queue>#include <map>#include <set>#include <vector>#include <iostream>using namespace std;const int N =1000000+50;typedef long long ll;int n,m;struct que{ int x,y,id;};bool cmp(que a,que b){ return a.y<b.y;}que qq[N];int tree[N];int ans[N];int vis[N];int aa[N];vector< pair<int,int > >mp[N];inline int lowbit(int x){ return x&-x;}void add(int x,int v){ for (int i=x;i<=n;i+=lowbit(i)) tree[i]+=v;}int get(int x){ int sum=0; for (int i=x;i;i-=lowbit(i)) sum+=tree[i]; return sum;}void pre(){ for (int i=1; i<=n; i++)mp[i].clear(); for (int i=1; i<=n; i++) { int x=aa[i],y=i; mp[i].push_back(make_pair(x,y)); for (int j=0; j<mp[i-1].size(); j++) { int tmp=__gcd(x,mp[i-1][j].first); if (x!=tmp) { x=tmp; y=mp[i-1][j].second; mp[i].push_back(make_pair(x,y)); } } }}int main(){ while(cin>>n>>m) { memset(vis,0,sizeof vis); memset(tree,0,sizeof tree); for (int i=1; i<=n; i++) scanf("%d",&aa[i]); for (int i=1; i<=m; i++) scanf("%d%d",&qq[i].x,&qq[i].y),qq[i].id=i; pre(); sort(qq+1,qq+1+m,cmp); int pos=1; for (int i=1; i<=m; i++) { int x=qq[i].x,y=qq[i].y; while(pos<=y) { for (int j=0;j<mp[pos].size();j++) { int f=mp[pos][j].first,s=mp[pos][j].second; if (vis[f]) add(vis[f],-1); vis[f]=s; add(s,1); } pos++; } ans[qq[i].id]=get(y)-get(x-1); } for (int i=1; i<=m; i++) printf("%d\n",ans[i]); } return 0;}
0 0
- hdu-5869 Different GCD Subarray Query gcd预处理 + 树状数组 + 离线
- [区间GCD预处理 树状数组 离线] 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 (离线处理 树状数组)
- hdu 5869 Different GCD Subarray Query(gcd+树状数组)
- HDU 5869 Different GCD Subarray Query (数学gcd+树状数组离线查询)
- hdu 5869 Different GCD Subarray Query 预处理 + 离线
- HDU 5869 Different GCD Subarray Query 树状数组
- HDU 5869 Different GCD Subarray Query [区间gcd预处理+离线]【数据结构】
- hdu5869 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+树状数组)★ ★
- 【gcd分块+离线+树状数组】HDU5869[Different GCD Subarray Query]题解
- hdu5869 Different GCD Subarray Query(rmq+树状数组+gcd)
- 基于AdaBoost算法的人脸检测--训练部分
- JAVA 学习模块十六: Object
- OBS CLR插件开发
- yum安装软件报错:curl#6 - "Could not resolve host: mirrorlist.centos.org; Temporary failure in name resolut
- 中文文本分类-朴素贝叶斯
- hdu-5869 Different GCD Subarray Query gcd预处理 + 树状数组 + 离线
- 欢迎使用CSDN-markdown编辑器
- 【LightOJ 1274】Beating the Dataset(概率DP)
- something about pow()函数
- JS中Array方法中常用方法三:Array.prototype.join()
- blog字体测试
- September 10th 模拟赛C T1 电影票 Solution
- 决策树-信息增益,信息增益率,Gini
- 【JZOJ4772】运输妹子