HDU 4777 树状数组求区间内 与该区间都互质的数个数
2014-01-06 19:07
288 查看
题意:
给定n个数的序列
m个询问,问该区间内,与所有区间内数互质的数有多少个
给定n个数的序列
m个询问,问该区间内,与所有区间内数互质的数有多少个
#include<stdio.h> #include<string.h> #include<vector> #include<algorithm> #include<math.h> #define N 200005 using namespace std; vector<int>prime ;//prime[i] 是i的所有因子(不包括1) vector<int>edge ; struct query{ int l, r, num; bool operator<(const query& a)const{ return a.l>l; } }q ; int ans ; int tree ; int l , r , vis ; int n, m, a ; int lowbit(int x){return x&(-x);} void add(int pos, int val){ while(pos){ tree[pos] += val; pos -= lowbit(pos); } } int getsum(int pos){ int ans = 0; while(pos <= n){ ans += tree[pos]; pos += lowbit(pos); } return ans; } void init(){ for(int i = 2; i < N; i++) for(int j = i; j < N; j+=i) prime[j].push_back(i); } int main(){ int i, j; init(); while(scanf("%d %d",&n,&m), n+m){ for(i = 1; i <= n; i++)scanf("%d",&a[i]); memset(vis, 0, sizeof(vis)); for(i = 1; i <= n; i++) { int pos = 0, siz = prime[a[i]].size(); for(j = 0; j < siz; j++) { pos = max(pos, vis[prime[a[i]][j]]); vis[prime[a[i]][j]] = i; } l[i] = pos; } memset(vis, 1, sizeof(vis)); for(i = n; i ; i--) { int pos = n+1, siz = prime[a[i]].size(); for(j = 0; j < siz; j++) { pos = min(pos, vis[prime[a[i]][j]]); vis[prime[a[i]][j]] = i; } r[i] = pos; } memset(tree, 0, sizeof(tree)); for(i = 1; i <= n; i++) { if(l[i]) edge[l[i]].push_back(i); else { add(i, 1); if(r[i]<=n) add(r[i], -1); } } for(i = 1; i <= m; i++)scanf("%d %d",&q[i].l,&q[i].r), q[i].num = i; sort(q+1, q+m+1); int num = 1; for(i = 1; i <= n; i++) { while(q[num].l == i) { ans[q[num].num] = getsum(q[num].l) - getsum(q[num].r+1); num++; } add(i, -1); if(r[i] <= n) add(r[i], 1); for(j = 0; j < edge[i].size(); j++) { int v = edge[i][j]; add(v, 1); if(r[v]<=n) add(r[v], -1); } edge[i].clear(); } for(i = 1; i<= m; i++)printf("%d\n", ans[i]); } return 0; }
相关文章推荐
- HDU 4777 - Rabbit Kingdom (树状数组 区间互素数)
- HDU - 1754 I Hate It (树状数组维护区间最值)
- POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)
- HDU 1166 敌兵布阵 树状数组 区间求和
- hdu 3584 Cube (三维树状数组,更新区间,查询单点)
- 树状数组,线段树(区间成段更新,HDU 4267)
- hdu 4777 Rabbit Kingdom(树状数组)
- HDU 1199(ZOJ 2301)Color the ball (树状数组 区间覆盖)
- 【HDU - 1541 - Stars 【 区间求和 单点更新 ==树状数组】
- hdu 3727 Jewel 划分数+树状数组 求区间和当前段的第k大数
- hdu 4638 树状数组 区间内连续区间的个数(尽可能长)
- HDU 4777 Rabbit Kingdom(树状数组离线处理)
- hdu 2642 二维树状数组 单点更新区间查询 模板水题
- hdu 4533(树状数组区间更新+单点查询)
- HDU 1556 Color the ball(树状数组区间更新点查询)
- HDU 4417-树状数组求区间rank查询/主席树区间rank查询
- hdu 4638 树状数组 区间内连续区间的个数(尽可能长)
- HDU 1556 Color the ball(树状数组区间更新)
- hdu 1556Color the ball (树状数组,更新区间,查询单点)
- HDU 4777 Rabbit Kingdom(树状数组离线处理)