zoukankan      html  css  js  c++  java
  • HOJ1867 经理的烦恼

    My Tags   (Edit)
      Source : HCPC 2005 Spring
      Time limit : 2 sec   Memory limit : 32 M

    Submitted : 2946, Accepted : 672

    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

    这题可以用树状数组做,先更新所有店的商品个数是m,判断m是不是素数,如果是素数的话,所有的点flag[i]都是1,还要更新树状数组b[i],接下来依次读入操作,如果之前是素数变成非素数-1,之前非素数变成素数+1。

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<vector>
    #include<map>
    #include<queue>
    #include<stack>
    #include<string>
    #include<algorithm>
    using namespace std;
    #define maxn 1000005
    int b[maxn],a[maxn],flag[maxn];
    int lowbit(int x){
    	return x&(-x);
    }
    void update(int pos,int num)
    {
    	while(pos<=maxn){
    		b[pos]+=num;pos+=lowbit(pos);
    	}
    }
    
    int getsum(int pos)
    {
    	int num=0;
    	while(pos>0){
    		num+=b[pos];pos-=lowbit(pos);
    	}
    	return num;
    }
    
    int isprime(int x)
    {
    	int num,i,j,flag;
    	if(x<=1)return 0;
    	if(x==2)return 1;
    	flag=0;
    	for(i=2;i*i<=x;i++){
    		if(x%i==0){
    			flag=1;break;
    		}
    	}
    	if(flag==1)return 0;
    	return 1;
    }
    
    int main()
    {
    	int n,m,i,j,d,e,f,q,num1=0;
    	while(scanf("%d%d%d",&n,&q,&m)!=EOF)
    	{
    		if(q==0 && n==0 && m==0)break;
    		num1++;
    		printf("CASE #%d:
    ",num1);
    		memset(b,0,sizeof(b));
    		memset(a,0,sizeof(a));
    		for(i=1;i<=n;i++){
    		       flag[i]=1;a[i]=m;
            }
            if(isprime(m)){
            	for(i=1;i<=n;i++)update(i,1);
            }
            else {memset(flag,0,sizeof(flag));}
            
    		for(i=1;i<=q;i++){
    			scanf("%d%d%d",&d,&e,&f);
    			if(d==0){
    				a[e]+=f;
    				if(isprime(a[e])==1 && flag[e]==0){
    					update(e,1);flag[e]=1;
    				}
    				else if(isprime(a[e])==0 && flag[e]==1){
    					update(e,-1);flag[e]=0;
    				}
    			}
    			else printf("%d
    ",getsum(f)-getsum(e-1));
    		}
    		printf("
    ");
    	}
    	return 0;
    }


  • 相关阅读:
    八数码难题 (codevs 1225)题解
    小木棍 (codevs 3498)题解
    sliding windows (poj 2823) 题解
    集合删数 (vijos 1545) 题解
    合并果子 (codevs 1063) 题解
    等价表达式 (codevs 1107)题解
    生理周期 (poj 1006) 题解
    区间 (vijos 1439) 题解
    区间覆盖问题 题解
    种树 (codevs 1653) 题解
  • 原文地址:https://www.cnblogs.com/herumw/p/9464769.html
Copyright © 2011-2022 走看看