hoj 1867 经理的烦恼

点击打开题目

树状数组技术题目,加了一个判素;

#include <iostream>
#include <cstring>

using namespace std;

const int MAXN = 1000010;
int c[MAXN];//树状数组中那个c数组;
int arr[MAXN];//arr[i]用来存放商店i中商品的个数
int C, N, M;

int lowbit( int x )
{
     return x & (-x);
}

void UFset(int pos, int data)
{
     while(pos <= MAXN)
     {
          c[pos] += data;
          pos += lowbit( pos );
     }
}

int Querry( int pos )
{
     int sum = 0;
     while( pos > 0 )
     {
          sum += c[pos];
          pos -= lowbit( pos );
     }
     return sum;
}

bool Prime( int x )//判素
{
     if(x <= 1)
          return false;
     else
     {
          for(int i = 2; i*i <= x; ++i)
               if(x%i == 0)
                    return false;
          return true;
     }
}

int main()
{
     int a, b, k;
     int kcase = 1;
     while(cin>>C>>N>>M)
     {
          if(C == 0 && N == 0 && M == 0)
               break;
          bool t = Prime( M );//判素,看刚开始时每家商店商品数量的奇偶性
          memset(c, 0, sizeof(c));

          arr[0] = 0;
          for(int i = 1; i <= C; ++i)
          {
               if(t)
                    UFset(i, 1);//如果M是素数的话,那么就要统计初始时商品为奇数的商店的个数
               arr[i] = M;
          }
          cout<<"CASE #"<<kcase++<<":"<<endl;
          for(int i = 1; i <= N; ++i)
          {
               cin>>k>>a>>b;
               if(k == 0)
               {
                    if( Prime(arr[a]) )//加上这一句就是因为:如果arr[a]一开始就是素数,加上或减去b后仍是素数,后面那个if语句就会多增加1,只是结果错误
                         UFset(a, -1);
                    arr[a] += b;
                    if( Prime(arr[a]) )
                         UFset(a, 1);
               }
               else
                    cout<<Querry(b) - Querry(a-1)<<endl;
          }
          cout<<endl;
     }
    return 0;
}


 

你可能感兴趣的:(树状数组)