• hoj 1867 经理的烦恼 树状数组


    链接:http://acm.hit.edu.cn/hoj/problem/view?id=1867

    谁说是入门题啊,真想拍他一巴掌

    经理的烦恼

    My Tags   (Edit)
      Source : HCPC 2005 Spring
      Time limit : 2 sec   Memory limit : 32 M

    Submitted : 2578, Accepted : 606

    Jerry是一家公司销售部门的经理。这家公司有很多连锁店,编号为1,2,3,... Jerry每天必须关注每家连锁店的商品数量及其变化,一项很乏味的工作。在连锁店比较少的时候,Jerry喜欢计算编号在[i,j]区间内的连锁店中商品数量为素数的有多少家,但是现在连锁店的数量急剧增长,计算量很大,Jerry很难得出结果。 

    输入格式
    题目有多组输入。每组输入第一行有三个整数:C 连锁店的数量 N 指令的条数 M 每家连锁店初始的商品数量
    接下来有N行,每行有一条指令。指令的格式为:
    0 x y 连锁店x的商品数量变化值为y,y > 0商品数量增加, y < 0减少
    1 i j 输出编号在[i,j]区间内的连锁店中商品数量为素数的有多少家
    1 <= i, x, j < 1000000 连锁店中的商品数量a满足 0 <= a < 10000000,C = N = M = 0标志输入结束

    输出格式
    对于每组输入,输出它的序号。对于一组输入中的1指令输出要求的整数。每组输出后打印一行空行。

    样例输入

    100000 4 4
    0 1 1
    1 4 10
    0 11 3
    1 1 11
    
    20 3 0
    1 1 20
    0 3 3
    1 1 20
    
    0 0 0
    
    样例输出
    CASE #1:
    0
    2
    
    CASE #2:
    0
    1




    ===================================================
    要求把素数个数存入c[]中,然后就各种变形,素数表也打的很寒掺,不是太懂
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <algorithm>
    #define Maxx 1000011
    
    int n;
    int c[Maxx];
    int str[Maxx];//全局变量默认全部是0 
    bool prime[Maxx*10];
    
    void isPrime()
    {
        int i;
        prime[0]=prime[1]=true;
        for(i=2;i*2<=Maxx*10;i++)prime[i*2]=true;
        for(i=3;i*i<=Maxx*10;i+=2)
        {
            if(!prime[i])
            {
                for(int j=i*i;j<=Maxx*10;j+=2*i)
                prime[j]=true;
            }
        }
    }
    
    int lowbit(int x)
    {
        return x&(-x);
    }
    
    void Update(int x,int i)
    {
        while(x<=n)
        {
            c[x]+=i;
            x+=lowbit(x);
        }
    }
    
    int Sum(int x)
    {
         int s=0;
         while(x>0)
         {
             s+=c[x];
             x-=lowbit(x);
         }
         return s;
    }
    
    int main()
    {
        int a,b,i,j;
        int num=0;
        isPrime();
        while(scanf("%d%d%d",&n,&a,&b)!=EOF&&(n+a+b))
        {
            int x,y,z;
            int p=prime[b]?0:1;
            for(i=1;i<=n;i++)
            {
                str[i]=b;
            }
    
            for(i=1;i<=n;i++)
            {
                int k=lowbit(i);
                c[i]=k*p;
            }
            printf("CASE #%d:
    ",++num);
            for(i=1;i<=a;i++)
            {
                scanf("%d %d %d",&x,&y,&z);
                if(x==0)
                {
                     str[y]+=z;
                     if(!prime[str[y]] && prime[str[y]-z])Update(y,1);
                     if(prime[str[y]] && !prime[str[y]-z])Update(y,-1);
                }
                else
                {
                    printf("%d
    ",Sum(z)-Sum(y-1));
                }
            }
            printf("
    ");
        }
        return 0;
    }
    

      

    另一个代码:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <algorithm>
    #include <math.h>
    
    #define Maxx 1000000+10
    int n;
    int str[Maxx],c[Maxx];
    
    int isPrime(int x)
    {
         int tmp=int(sqrt((double)(x)));
         for(int i=2;i<=tmp;i++)
         {
             if(x%i==0)
             return 0;
         }
         return 1;
    }
    
    int Lowbit(int x)
    {
        return x&(-x);
    }
    
    void Update(int x,int i)
    {
        while(x<=n)
        {
            c[x]+=i;
            x+=Lowbit(x);
        }
    }
    
    int Sum(int x)
    {
        int s=0;
        while(x>0)
        {
            s+=c[x];
            x-=Lowbit(x);
        }
        return s;
    }
    
    int main()
    {
        int m,a,b;
        int cas,x,y;
        int i,j;
        int num=0;
        int flag1,flag2;
        while(scanf("%d%d%d",&n,&a,&b)!=EOF&&(n+a+b))
        {
            printf("CASE #%d:
    ",++num);
            memset(c,0,sizeof(c));
            for(i=1;i<=Maxx;i++)
            {
                str[i]=b;
            }
            if(isPrime(b)&&b!=1&&b!=0)
            {
                for(i=1;i<=n;i++)
                    Update(i,1);
            }
    
    
            for(i=0;i<a;i++)
            {
                scanf("%d%d%d",&cas,&x,&y);
                if(cas == 0)
                {
                    flag1=flag2=0;
                    if(isPrime(str[x])&&str[x]!=0&&str[x]!=1)
                    {
                        flag1=true;
                    }
    
                    str[x]+=y;
                    if(isPrime(str[x])&&str[x]!=0&&str[x]!=1)
                    {
                        flag2=true;
                    }
    
                    if(flag1==1&&flag2==0)Update(x,-1);
                    if(flag1==0&&flag2==1)Update(x,1);
                }
                else
                {
                    printf("%d
    ",Sum(y)-Sum(x-1));
                }
            }
            printf("
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    [ 原创 ] Oracle存储过程中使用游标进行多行数据输出
    [ 原创 ] Python解压版安装配置教程
    [ 转载 ] ORACLE存储过程
    [ 转载 ] Oracle存储过程及函数的练习题
    [ 原创 ] Oracle数据库一些基本命令
    [ 转载 ] Linux CentOS 查看操作系统版本信息
    [ 转载 ] Android开发中如何做单元测试
    [ 转载 ] 关于conn /as sysdba 无需密码直接可以连接的疑问
    [ 转载 ] oracle如何查看当前有哪些用户连接到数据库
    [ 转载 ] Oracle 内存(SGA,PGA)详细介绍
  • 原文地址:https://www.cnblogs.com/ccccnzb/p/3838279.html
Copyright © 2020-2023  润新知