HOJ 1867 经理的烦恼

来源:互联网 发布:淘宝如何申请中国制造 编辑:程序博客网 时间:2024/06/03 05:08

经理的烦恼


题目链接:点击打开链接


解析:标准的树状数组应用,价格判断素数,本来想打表的,后来发现直接算不超时。

代码如下:

#include <cstring>#include <cstdio>#include <algorithm>#include<math.h>using namespace std;#define MAXN 1000005int tree[MAXN];int data[MAXN];int f(int a){    if(a==0 || a==1)        return 0;        for(int j=2;j<=((int)(sqrt(a*1.0)));j++)        {           if(a%j==0)           {               return 0;           }        }    return 1;}void add(int x,int num){    for(int i=x;i<=MAXN;i+=i&-i)        tree[i]+=num;}int read(int x){    int sum=0;    for(int i=x;i>0;i-=i&-i)        sum+=tree[i];    return sum;}int main(){    int c,n,m;    int flag,x,y;    int index=0;  //  printf("%d\n",f(1));    while(scanf("%d%d%d",&c,&n,&m),c+n+m)    {        printf("CASE #%d:\n",++index);        memset(tree,0,sizeof(tree));        memset(data,0,sizeof(data));        int t=f(m);        for(int i=1;i<=c;i++)        {            data[i]=m;            add(i,t);        }        for(int i=0;i<n;i++)        {            scanf("%d%d%d",&flag,&x,&y);            if(flag==0)            {                int a=f(data[x]);                data[x]+=y;                int b=f(data[x]);                if(a==1 && b==0)                    add(x,-1);                else if(a==0 && b==1)                    add(x,1);            }            else            {                printf("%d\n",read(y)-read(x-1));            }        }        printf("\n");    }    return 0;}


0 0
原创粉丝点击