经理的烦恼

My Tags   (Edit) Cancel - Seperate tags with commas.
  Source : HCPC 2005 Spring
  Time limit : 2 sec   Memory limit : 32 M

Submitted : 1929, Accepted : 442

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 思路:直接进行简单的加一减一(通过判素)操作即可。
代码: 
#include<stdio.h>
#include<string.h>
#define N 1000005
#define lowbit(a) (a&(-a))
int a[N],c[N]; //a[i]表示i店的数目;c[i]存放时素数的数目; 
int visit[N];  //是否是素数的标志;
int n,m,k;
int prime(int x)//判断素数; 
{
   if(x<=1)
   return 0;
   for(int i=2;i*i<=x;i++)
   {
       if(x%i==0)
    return 0;    
   }  
   return 1;
}
void update(int x)//更新; 
{
   if(prime(a[x])) //现在是素数,之前不是素数;
   {
    if(!visit[x])
    {
      visit[x]=1;
   while(x<=n)
   {
      c[x]++;
   x+=lowbit(x);    
      }    
    }
     
   }
   else  //之前是素数,现在不是素数;
   {
      if(visit[x])
   {
      visit[x]=0;
   while(x<=n)
   {
     c[x]--;
     x+=lowbit(x);    
      }     
      }   
   }  
}
int query(int x) //求和; 
{
    int sum=0;
 while(x)
    {
   sum+=c[x];
   x-=lowbit(x);   
    } 
    return sum;
}
int main()
{
 int cnt=1;
 while(scanf("%d%d%d",&n,&m,&k),n||m||k)
 {
 printf("CASE #%d:\n",cnt++);
    for(int i=1;i<=n;i++)
 a[i]=k;
 if(prime(k))  //初始化;
 {  for(int i=1;i<=n;i++)
   {
    c[i]=lowbit(i); //管辖的个数;
    visit[i]=1;
    }  
    } 
 else
 {
    memset(c,0,sizeof(c));
    memset(visit,0,sizeof(visit));
    }        
  int z,x,y;
  for(int i=1;i<=m;i++)
  {
      scanf("%d%d%d",&z,&x,&y);
   if(z)
   {
      printf("%d\n",query(y)-query(x-1));   
   }   
   else
   {
      a[x]+=y;
   update(x);  
         }
     } 
     printf("\n");
 }  
 return 0;
}
链接:http://acm.hit.edu.cn/hoj/problem/view?id=1867