简单的树状数组的应用,本来以为时间会超,用打表判素数,后来发现并不会超时,反倒是内存超了,还有素数判定竟然忘了1不是素数,无奈啊!
方法结合代码来。
AC代码如下:
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #define M 2000100 using namespace std; int c[M],num[M]; int v,n,m; int lowbit(int a) { return a&-a; } void add(int a,int b) { for(;a<=v;a+=lowbit(a)) c[a]+=b; } int sum(int a) { int ans=0; for(;a>0;a-=lowbit(a)) ans+=c[a]; return ans; } int sp(int a) { if(a==0||a==1) return 0; int i,j; for(i=2;i<=(int)sqrt(a);i++) if(a%i==0) return 0; return 1; } int main() { int i,j; int x,a,b; int cas=0; while(~scanf("%d%d%d",&v,&n,&m)&&(n||m||v)) { cas++; memset(c,0,sizeof c); memset(num,0,sizeof num); int t=sp(m);//首先判断起始的状态 for(i=1;i<=v;i++) { num[i]=m;//num[]记录商品数量变化 add(i,t);//给所用点赋予初始状态 } printf("CASE #%d:\n",cas); for(i=1;i<=n;i++) { scanf("%d%d%d",&x,&a,&b); if(x) { printf("%d\n",sum(b)-sum(a-1));//统计区间内true状态的数量即可 } else { num[a]+=b; //cout<<num[a]-b<<" "<<num[a]<<endl; if(sp(num[a])&&!sp(num[a]-b))//当由非素变素时,赋予true状态 {add(a,1);} if(!sp(num[a])&&sp(num[a]-b))//当由素不变非素时,赋予false状态 add(a,-1); } } printf("\n"); } return 0; }
原文地址:http://blog.csdn.net/hanhai768/article/details/37811059