• ZOJ 2015 10月份 月赛 3911 Prime Query


    这道题我改啊,改啊,交啊,就对了。

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include<cstring>
    #include<algorithm> 
    using namespace std;
    const int N = 10000005;
    const int M = 100005;
    int a[N];
    int p[M];
    int tree[M*4],cover[M*4];
    void Prime()
    {
            a[1] = 1;
            for (int i=2; i<sqrt(N); i++) {
                if(a[i]);
                else{
                    for (int j=2*i; j<N ;j+=i) {
                            a[j]=1;
                    }
                }
            }
    }
    void down(int i,int l,int r)
    {
        
    int k;
    int mid=(l+r)>>1;
        if (cover[i] != -1)
        {
            if(l!=r){cover[i<<1]=cover[i<<1|1]=cover[i];
            if(!a[cover[i]])k=1;
            else k=0;
            tree[i<<1]=k*(mid-l+1);
            tree[i<<1|1]=k*(r-mid);}
            else p[l]=cover[i];
            cover[i]=-1;
        }
    }
    void build(int rt,int l,int r)
    {
        if(l==r){
            if(!a[p[l]])
            tree[rt]=1;
            else tree[rt]=0;
            return;
        }
        int mid=(l+r)>>1;
        build(rt<<1,l,mid);
        build(rt<<1|1,mid+1,r);
        tree[rt]=tree[rt<<1]+tree[rt<<1|1];
    }
    void A(int v,int l,int rt,int L,int R)
    {    down(rt,L,R);
        if(L==R){
            if(!a[p[l]+=v])
            tree[rt]=1;
            else tree[rt]=0;
            return;
        }
    
        int mid=(L+R)>>1;
        if(l<=mid)A(v,l,rt<<1,L,mid);
        if(l>mid)A(v,l,rt<<1|1,mid+1,R);
        tree[rt]=tree[rt<<1]+tree[rt<<1|1];    
    }
    int Q(int l,int r,int rt,int L,int R)
    {    down(rt,L,R);
            if(L>=l&&R<=r){
            return tree[rt];
        }
        int ans=0;
    
        int mid=(L+R)>>1;
        if(l<=mid)ans+=Q(l,r,rt<<1,L,mid);
        if(r>mid)ans+=Q(l,r,rt<<1|1,mid+1,R);
        return ans;
    }
    void Re(int k,int l,int r,int rt,int L,int R)
    {down(rt,L,R);    
        if(L>=l&&R<=r){
            if(!a[k])
            tree[rt]=R-L+1;
            else tree[rt]=0;
            cover[rt]=k;
            return;
        }
    
        int mid=(L+R)>>1;
        if(l<=mid)Re(k,l,r,rt<<1,L,mid);
        if(r>mid)Re(k,l,r,rt<<1|1,mid+1,R);
        tree[rt]=tree[rt<<1]+tree[rt<<1|1];    
    }
    int main() {
        Prime();
         int T,n,m;
         scanf("%d",&T);
         while(T--)
         {
             scanf("%d%d",&n,&m);
             for(int i=1;i<=n;i++)
             {
                 scanf("%d",&p[i]);
             }
             build(1,1,n);
            memset(cover,-1,sizeof cover);
             char s[10];
             while(m--)
             {
                 scanf("%s",s);
                 if(s[0]=='A')
                 {
                     int v,l;
                     scanf("%d%d",&v,&l);
                     A(v,l,1,1,n);
                     //for(int i=1;i<=n;i++)printf("%d ",p[i]);
                    // puts(""); 
                 }
                 else if(s[0]=='Q')
                 {
                     int l,r;
                     scanf("%d%d",&l,&r);
                     printf("%d
    ",Q(l,r,1,1,n));
                    //for(int i=1;i<=n;i++)printf("%d ",p[i]);
                    // puts(""); 
                 }
                 else if(s[0]=='R')
                 {
                     int x,l,r;
                     scanf("%d%d%d",&x,&l,&r);
                     Re(x,l,r,1,1,n);
                    // for(int i=1;i<=n;i++)printf("%d ",p[i]);
                //    puts(""); 
                 }
             }
         }   
    }

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N = 10000005;
    const int M = 100005;
    int a[N];
    int p[M];
    int tree[M*4],cover[M*4];
    void Prime()
    {
            a[1] = 1;
            for (int i=2; i<sqrt(N); i++) {
                if(a[i]);
                else{
                    for (int j=2*i; j<N ;j+=i) {
                            a[j]=1;
                    }
                }
            }
    }
    void down(int i,int l,int r)
    {
        
    int k;
    int mid=(l+r)>>1;
        if (cover[i] != -1)
        {
            if(l!=r){cover[i<<1]=cover[i<<1|1]=cover[i];
            if(!a[cover[i]])k=1;
            else k=0;
            tree[i<<1]=k*(mid-l+1);
            tree[i<<1|1]=k*(r-mid);}
            else p[l]=cover[i];
            cover[i]=-1;
        }
    }
    void build(int rt,int l,int r)
    {
        if(l==r){
            if(!a[p[l]])
            tree[rt]=1;
            else tree[rt]=0;
            return;
        }
        int mid=(l+r)>>1;
        build(rt<<1,l,mid);
        build(rt<<1|1,mid+1,r);
        tree[rt]=tree[rt<<1]+tree[rt<<1|1];
    }
    void A(int v,int l,int rt,int L,int R)
    {    down(rt,L,R);
        if(L==R){
            if(!a[p[l]+=v])
            tree[rt]=1;
            else tree[rt]=0;
            return;
        }

        int mid=(L+R)>>1;
        if(l<=mid)A(v,l,rt<<1,L,mid);
        if(l>mid)A(v,l,rt<<1|1,mid+1,R);
        tree[rt]=tree[rt<<1]+tree[rt<<1|1];    
    }
    int Q(int l,int r,int rt,int L,int R)
    {    down(rt,L,R);
            if(L>=l&&R<=r){
            return tree[rt];
        }
        int ans=0;

        int mid=(L+R)>>1;
        if(l<=mid)ans+=Q(l,r,rt<<1,L,mid);
        if(r>mid)ans+=Q(l,r,rt<<1|1,mid+1,R);
        return ans;
    }
    void Re(int k,int l,int r,int rt,int L,int R)
    {down(rt,L,R);    
        if(L>=l&&R<=r){
            if(!a[k])
            tree[rt]=R-L+1;
            else tree[rt]=0;
            cover[rt]=k;
            return;
        }

        int mid=(L+R)>>1;
        if(l<=mid)Re(k,l,r,rt<<1,L,mid);
        if(r>mid)Re(k,l,r,rt<<1|1,mid+1,R);
        tree[rt]=tree[rt<<1]+tree[rt<<1|1];    
    }
    int main() {
        Prime();
         int T,n,m;
         scanf("%d",&T);
         while(T--)
         {
             scanf("%d%d",&n,&m);
             for(int i=1;i<=n;i++)
             {
                 scanf("%d",&p[i]);
             }
             build(1,1,n);
            memset(cover,-1,sizeof cover);
             char s[10];
             while(m--)
             {
                 scanf("%s",s);
                 if(s[0]=='A')
                 {
                     int v,l;
                     scanf("%d%d",&v,&l);
                     A(v,l,1,1,n);
                     //for(int i=1;i<=n;i++)printf("%d ",p[i]);
                    // puts("");
                 }
                 else if(s[0]=='Q')
                 {
                     int l,r;
                     scanf("%d%d",&l,&r);
                     printf("%d ",Q(l,r,1,1,n));
                    //for(int i=1;i<=n;i++)printf("%d ",p[i]);
                    // puts("");
                 }
                 else if(s[0]=='R')
                 {
                     int x,l,r;
                     scanf("%d%d%d",&x,&l,&r);
                     Re(x,l,r,1,1,n);
                    // for(int i=1;i<=n;i++)printf("%d ",p[i]);
                //    puts("");
                 }
             }
         }   
    }

  • 相关阅读:
    SSM整合——实现书籍的增删改查
    [web]获取用户当前所在城市
    [mysql]pymysql插入500万数据
    [Flask] 01 ORM方法列表
    [少儿编程] 03-龟兔赛跑(下)
    [少儿编程] 02-龟兔赛跑(上)
    [少儿编程] 00-入门课程大纲
    [少儿编程] 01-少儿编程环境搭建
    [Linux] Centos7 部署django项目
    [Linux] centos7 安装Mariadb
  • 原文地址:https://www.cnblogs.com/newadi/p/4875904.html
Copyright © 2020-2023  润新知