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;
    }


  • 相关阅读:
    【Java并发】详解 AbstractQueuedSynchronizer
    【Java 并发】详解 ThreadLocal
    【应用】Markdown 在线阅读器
    【HTML5】Canvas 内部元素添加事件处理
    【HTML5】Canvas 实现放大镜效果
    分享一款Markdown的css样式
    【Pthreads】Pipeline Model(Assembly Line)示例
    简单实现依赖注入(无框架)
    JavaWeb 简单实现客户信息管理系统
    Python中模块的发布与安装
  • 原文地址:https://www.cnblogs.com/herumw/p/9464769.html
Copyright © 2011-2022 走看看