HIT 1867 经理的烦恼

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

每次更新时判断是否素数,如果从非素数变成素数就Update(x, 1),如果从素数变成非素数就Update(x, -1)。

 1 /*HIT 1867
 2 经理的烦恼 
 3 */
 4 #include<cstdio>
 5 #include<cstring>
 6 const int N=1000009;
 7 
 8 int a[N],c[N],n,m,C;
 9 int prime(int num)
10 {
11     int i;
12     if(num<=1)return 0;
13     for(i=2; i*i<=num; i++)
14     {
15         if(num%i==0)
16             return 0;
17     }
18     return 1;
19 }
20 int lowbit(int x)
21 {
22     return x & (-x);
23 }
24 
25 void update(int i,int m)
26 {
27     while(i<=C)
28     {
29         c[i] += m;
30         i += lowbit(i);
31     }
32 }
33 int Sum(int num)
34 {
35     int s =0;
36     while(num>0)
37     {
38         s += c[num];
39         num -= lowbit(num);
40     }
41     return s;
42 }
43 int main()
44 {
45     //freopen("1867.txt","r",stdin);
46     int i,j,k,x,y,t,time=0;
47     while(scanf("%d %d %d",&C,&n,&m)!=EOF)
48     {
49         if(C==0&&n==0&&m==0) break;
50         t = prime(m);
51         memset(c,0,sizeof(c));
52         for(i=1; i<=C; i++)
53         {
54             if(t!=0)
55             {
56                 update(i,1);
57             }
58             a[i]=m;
59         }
60         printf("CASE #%d:\n",++time);
61         for(i=0; i<n; i++)
62         {
63             scanf("%d %d %d",&k,&x,&y);
64             if(k==0)
65             {
66                 int tmp = a[x];
67                 a[x]+=y;
68                 if(prime(a[x]))
69                 {
70                     if(!prime(tmp))
71                         update(x,1);
72                 }
73                 else
74                 {
75                     if(prime(tmp))
76                         update(x,-1);
77                 }
78 
79             }
80             else
81                 printf("%d\n",Sum(y)-Sum(x-1));
82         }
83         printf("\n");
84 
85     }
86     return 0;
87 }

 

 

posted @ 2014-03-08 09:24  霖‘  阅读(132)  评论(0编辑  收藏  举报