首页 > 代码库 > HOJ 1867 经理的烦恼
HOJ 1867 经理的烦恼
经理的烦恼
My Tags (Edit)
Source : HCPC 2005 Spring
Time limit : 2 sec
Memory limit : 32 M
Submitted : 2588, Accepted : 608
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
简单的树状数组的应用,本来以为时间会超,用打表判素数,后来发现并不会超时,反倒是内存超了,还有素数判定竟然忘了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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。