树状数组 经理的烦恼

136 篇文章 0 订阅
32 篇文章 0 订阅
/*用一个树状数组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;
}


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值