zoukankan      html  css  js  c++  java
  • 【HOJ1867】经理的烦恼-区间求和+判素数

    题目大意:有一个数列,有两种操作:1.增加或减少其中某个元素的值。2.询问区间[i,j]内的值为素数的元素的个数。对于每个询问,给出正确的答案。

    做法:对于每一个修改操作,如果原来的值不是素数,修改后值为素数,或者原来的值是素数,修改后值不是素数时才进行修改。由于数据不大,判断素数只需要简单的枚举就可以了。

    以下是本人代码(树状数组):

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int n,m,k;
    int a[1000010]={0},c[1000010]={0};
    bool v[1000010]={0};
    
    int lowbit(int i)
    {
      return i&(-i);
    }
    
    void add(int x,int a)
    {
      for(int i=x;i<=k;i+=lowbit(i))
        c[i]+=a;
    }
    
    int sum(int x)
    {
      if (x<1) return 0;
      int s=0;
      for(int i=x;i>0;i-=lowbit(i))
        s+=c[i];
      return s;
    }
    
    bool check(int x)
    {
      if (x<2) return 0;
      for(int i=2;i*i<=x;i++)
        if (x%i==0) return 0;
      return 1;
    }
    
    int main()
    {
      scanf("%d %d %d",&k,&n,&m);
      int t=1;
      while(k!=0||n!=0||m!=0)
      {
        int op,x,y,flag;
    	memset(c,0,sizeof(c));
    	memset(v,0,sizeof(v));
    	printf("CASE #%d:
    ",t);
    	flag=check(m);
    	for(int i=1;i<=k;i++) {a[i]=m;if (flag) {v[i]=1;add(i,1);}}
    	for(int i=1;i<=n;i++)
    	{
    	  scanf("%d %d %d",&op,&x,&y);
    	  if (op==0)
    	  {
    	    a[x]+=y;
    		flag=check(a[x]);
    		if (!v[x]&&flag) {v[x]=1;add(x,1);}
    		if (v[x]&&!flag) {v[x]=0;add(x,-1);}
    	  }
    	  else printf("%d
    ",sum(y)-sum(x-1));
    	}
    	scanf("%d %d %d",&k,&n,&m);
    	t++;
    	printf("
    ");
      }
      
      return 0;
    }
    


  • 相关阅读:
    [BZOJ4631]踩气球
    [BZOJ1998][Hnoi2010]Fsk物品调度
    [BZOJ3624][Apio2008]免费道路
    [BZOJ1064][Noi2008]假面舞会
    [BZOJ4154][Ipsc2015]Generating Synergy
    [BZOJ1941][Sdoi2010]Hide and Seek
    [BZOJ2850]巧克力王国
    [BZOJ2683][BZOJ4066]简单题
    万年历(calendar)
    SACD ISO镜像中提取DSDIFF(DFF)、DSF文件
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793989.html
Copyright © 2011-2022 走看看