树状数组 经理的烦恼
2012-08-01 12:30
197 查看
/*用一个树状数组tree来保存数组a中对应我只的质数的个数. 此时sum(p)表示a[]中1到p里有多少个质数. 对tree的初始化,tree[]=lowbit[]*tag.若初始部位质数,则全都为0,若为质数,则按照树状数组的定义, 在相应的位置按lowbit进行累加.即c[i]=a[i-lowbit(i)+!]....a[i]. */ #include <stdio.h> #include <cmath> #define maxn 1000001 int c,n,m; int a[maxn]; int tree[maxn]; int lowbit(int x) { return x&-x; } void add(int ind,int val) { while(ind<=c) { tree[ind]+=val; ind+=lowbit(ind); } } int sum(int p) { long long s=0; while(p>0) { s+=tree[p]; p-=lowbit(p); } return s; } bool prim(int npp) { if(npp==0||npp==1) return false; for (int q = 2; q <= sqrt(double(npp)); ++q) { if (npp % q == 0) return false; } return true; } int main() { int t,x,y; int cases=1; while(scanf("%d%d%d",&c,&n,&m)==3) { int tag=prim(m); for(int i=1; i<=c; i++) { a[i]=m; tree[i]=lowbit(i)*tag; } if(n==0&&m==0&&c==0) break; printf("CASE #%d:\n",cases++); while(n--) { scanf("%d%d%d",&t,&x,&y); if(t==1) printf("%d\n",sum(y)-sum(x-1));//输出数组c在区间范围内的质数个数 else { int p1=prim(a[x]+y); int p2=prim(a[x]); if(p1>p2) add(x,1);//原来不是质数,加完之后是质数 else if(p1<p2) add(x,-1); a[x]=a[x]+y; } } printf("\n"); } return 0; }
相关文章推荐
- HOJ 1867 经理的烦恼 一维树状数组
- HOJ 1867 经理的烦恼 【 树状数组 】
- 树状数组专题(二)hoj1867经理的烦恼
- hoj 1867 经理的烦恼 (树状数组)
- 【bzoj4822/bzoj1935】[Cqoi2017]老C的任务/[Shoi2007]Tree 园丁的烦恼 树状数组
- BZOJ 1935: [Shoi2007]Tree 园丁的烦恼 [树状数组 离线 离散化]
- BZOJ 1935 Tree 园丁的烦恼 [差分][树状数组]
- 1935: [Shoi2007]Tree 园丁的烦恼 (树状数组)
- BZOJ 1935: [Shoi2007]Tree 园丁的烦恼( 差分 + 离散化 + 树状数组 )
- [BZOJ1935][SHOI2007]Tree 园丁的烦恼(离线+动态维护树状数组)
- BZOJ 1935 Tree 园丁的烦恼 (树状数组)
- 【树状数组】bzoj1935 [Shoi2007]Tree 园丁的烦恼
- hdoj&nbsp;1166&nbsp;敌兵布阵(树状数组)
- POJ 2828 Buy Tickets(树状数组)
- poj 3321:Apple Tree(树状数组,提高题)
- POJ-3416-Crossing-(树状数组)
- 【BZOJ1818】[Cqoi2010]内部白点 扫描线+树状数组
- HDU5792 World is Exploding(树状数组)2016 Multi-University Training Contest 5
- 树状数组与逆序数——树状数组实践POJ3067
- HDU 5792 World is Exploding (树状数组)