HOJ 1867 经理的烦恼 【 树状数组 】

题意:给出一个区间,求这个区间里面素数的个数

这道题wa了好多次---是因为add操作没有写对

每次更新的时候,应该先判断没有加上y是不是质数,加上了y是不是质数

如果从质数变成不是质数,那么add(x,-1)

如果从不是质数变成是质数,那么add(x,1)

另外还pe了,,printf("\n")就不对,puts("")就对了

---不懂--------

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include <cmath>
 5 #include<stack>
 6 #include<vector>
 7 #include<map>
 8 #include<set>
 9 #include<queue>
10 #include<algorithm>
11 using namespace std;
12
13 typedef long long LL;
14 const int INF = (1<<30)-1;
15 const int mod=1000000007;
16 const int maxn=1000005;
17
18 int a[maxn];
19 int c[maxn];//树状数组
20 int C,N,M;
21
22 int is(int x){
23     if( x <= 1) return 0;
24     if(x == 2) return 1;
25     int tmp = sqrt(x);
26     for(int i=2;i<=tmp;i++)
27     if(x % i == 0) return 0;
28     return 1;
29 }
30
31 int lowbit(int x){ return x & (-x);}
32
33 int sum(int x){
34     int ret=0;
35     while(x>0){
36         ret+=c[x];x-=lowbit(x);
37     }
38     return ret;
39 }
40
41 void add(int x,int d){
42     while(x <= maxn){
43         c[x]+=d; x+=lowbit(x);
44     }
45 }
46
47 int main(){
48     int kase=0;
49     while(scanf("%d %d %d",&C,&N,&M) != EOF){
50         if( C == 0 && N ==0 && M == 0) break;
51         memset(c,0,sizeof(c));
52         memset(a,0,sizeof(a));
53
54         int x = is(M);
55         for(int i=1;i<=maxn;i++) a[i] = M,add(i,x);
56
57         printf("CASE #%d:\n",++kase);
58         int cmd;
59         while(N--){
60             scanf("%d",&cmd);
61             if(cmd == 0){
62                 int x,y;
63                 scanf("%d %d",&x,&y);
64                 int tmp = a[x];
65                 a[x] += y;
66
67             //    printf("tmp = %d  a[%d] = %d\n",tmp,x,a[x]);
68                 if(is(a[x])){
69                     if(!is(tmp)) add(x,1);
70                 }
71                 else {
72                     if(is(tmp)) add(x,-1);
73                 }
74             }
75             if(cmd == 1){
76                 int l,r;
77                 scanf("%d %d",&l,&r);
78                 printf("%d\n",sum(r) - sum(l-1));
79             }
80         }
81         puts("");
82     }
83     return 0;
84 }

时间: 2024-08-01 22:46:59

HOJ 1867 经理的烦恼 【 树状数组 】的相关文章

hoj 1867 经理的烦恼 树状数组

链接:http://acm.hit.edu.cn/hoj/problem/view?id=1867 谁说是入门题啊,真想拍他一巴掌 经理的烦恼 My Tags   (Edit)   Source : HCPC 2005 Spring   Time limit : 2 sec   Memory limit : 32 M Submitted : 2578, Accepted : 606 Jerry是一家公司销售部门的经理.这家公司有很多连锁店,编号为1,2,3,... Jerry每天必须关注每家连锁

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]区间内的连锁店中商品数量为素数的有多少家,但是现在

BZOJ 1935 SHOI 2007 Tree 园丁的烦恼 树状数组

题目大意:给出平面中的一些点,询问平面中的一些矩形中有多少点. 思路:正常应该是二维树状数组,然后数据范围太大.所以就只能按照一个坐标排序,另一个坐标跑树状数组.注意离线操作,一个问题拆成4个. CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 500010 #define RANGE 10000010 using n

BZOJ 1935 SHOI2007 园丁的烦恼 树状数组

题目大意:给定平面上的一些点,多次询问某个矩形中有多少个点 将每个询问拆成4个 然后把所有询问和点都按照横坐标排序 对于每个询问,将所有x值小于等于这个询问的x的点的y值加入树状数组 然后在树状数组上查询小于等于这个询问的y值的点的数量 别被1000W吓到了 如果不爆内存的话1E也是能搞的 套个log就没多少了 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm&

Hoj 1867 经理的烦恼(树状数组)

Jerry是一家公司销售部门的经理.这家公司有很多连锁店,编号为1,2,3,... Jerry每天必须关注每家连锁店的商品数量及其变化,一项很乏味的工作.在连锁店比较少的时候,Jerry喜欢计算编号在[i,j]区间内的连锁店中商品数量为素数的有多少家,但是现在连锁店的数量急剧增长,计算量很大,Jerry很难得出结果. 输入格式 题目有多组输入.每组输入第一行有三个整数:C 连锁店的数量 N 指令的条数 M 每家连锁店初始的商品数量 接下来有N行,每行有一条指令.指令的格式为: 0 x y 连锁店

BZOJ 1935: [Shoi2007]Tree 园丁的烦恼 [树状数组 离线 离散化]

传送门 刚才我还在郁闷网上怎么没人用$CDQ$分治做 突然发现根本没有时间序.... #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int N=3e6+5; inline int read(){ char c=getchar();int x=0,f=1; whi

区间素数个数 树状数组 HIT 1867 经理的烦恼

http://acm.hit.edu.cn/hoj/problem/view?id=1867 经理的烦恼   Source : HCPC 2005 Spring   Time limit : 2 sec   Memory limit : 32 M Submitted : 2994, Accepted : 686 Jerry是一家公司销售部门的经理.这家公司有很多连锁店,编号为1,2,3,... Jerry每天必须关注每家连锁店的商品数量及其变化,一项很乏味的工作.在连锁店比较少的时候,Jerry

HOJ1867 经理的烦恼【树状数组】

题目链接: http://acm.hit.edu.cn/hoj/problem/view?id=1867 题目大意: 有C家连锁店,编号1~C,有N条指令,每家店初始的商品数目都是M.接下来N行是命令. 命令0:0 x w,连锁店x的商品数量变化为w,w > 0商品数量增加,w < 0商品数量减少. 命令1:1 x y,询问编号区间为[x,y]的连锁店商品为素数的商店有多少家. 思路: 因为区间比较大,所以用树状数组来做.用一个数组Shop[]来存放每家店的商品数目,Tree[] 表示树状数组

树状数组实践-HIT经理的烦恼

点击打开HIT 1867 思路: 树状数组 分析: 1 题目要求的是给定一个区间求这个区间质数的个数 2 题目给定n条命令和每个店的初始的值,那么我们初始化的时候就要通过判断给定的初始值是否为质数来初始化 3 因为要求的是质数的个数,那么我们可以这么想,假设现在改变了店铺x的值,那么我们通过判断前后是否是质数的关系来更新树状数组 4 求区间的质数的个数的时候直接求即可 <span style="font-size:14px;">#include <cmath>