您的位置:首页 > 其它

树状数组 经理的烦恼

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: