zoukankan      html  css  js  c++  java
  • 143

    Prime Query

    Time Limit: 1 Second      Memory Limit: 196608 KB

    You are given a simple task. Given a sequence A[i] with N numbers. You have to perform Q operations on the given sequence.

    Here are the operations:

    • A v l, add the value v to element with index l.(1<=V<=1000)
    • R a l r, replace all the elements of sequence with index i(l<=i<= r) with a(1<=a<=10^6) .
    • Q l r, print the number of elements with index i(l<=i<=r) and A[i] is a prime number

    Note that no number in sequence ever will exceed 10^7.

    Input

    The first line is a signer integer T which is the number of test cases.

    For each test case, The first line contains two numbers N and Q (1 <= N, Q <= 100000) - the number of elements in sequence and the number of queries.

    The second line contains N numbers - the elements of the sequence.

    In next Q lines, each line contains an operation to be performed on the sequence.

    Output

    For each test case and each query,print the answer in one line.

    Sample Input

    1
    5 10
    1 2 3 4 5
    A 3 1      
    Q 1 3
    R 5 2 4
    A 1 1
    Q 1 1
    Q 1 2
    Q 1 4
    A 3 5
    Q 5 5
    Q 1 5
    

    Sample Output

    2
    1
    2
    4
    0
    4
    

    题解:线段树的单点更新,区间修改,区间查询

    写的很挫

    ///1085422276
    #include<bits/stdc++.h>
    using namespace std ;
    typedef long long ll;
    #define mem(a) memset(a,0,sizeof(a))
    #define meminf(a) memset(a,127,sizeof(a));
    #define TS printf("111111
    ");
    #define FOR(i,a,b) for( int i=a;i<=b;i++)
    #define FORJ(i,a,b) for(int i=a;i>=b;i--)
    #define READ(a,b,c) scanf("%d%d%d",&a,&b,&c)
    #define inf 100000
    inline ll read()
    {
        ll x=0,f=1;
        char ch=getchar();
        while(ch<'0'||ch>'9')
        {
            if(ch=='-')f=-1;
            ch=getchar();
        }
        while(ch>='0'&&ch<='9')
        {
            x=x*10+ch-'0';
            ch=getchar();
        }
        return x*f;
    }
    //****************************************
    #define maxn 1000000+5
    
    bool P[10000101];
    ll a[1000000+5];
    struct ss
    {
        ll l,r,v,tag,sum;
    }tr[maxn*5];
    
    void pushdown(int k)
    {
        if(!tr[k].tag)return;
       if(tr[k].l==tr[k].r){
         tr[k].v=tr[k].tag;
         if(!P[tr[k].v])
                tr[k].sum=1;
            else tr[k].sum=0;
       }
       else {
        if(!P[tr[k].tag])tr[k].sum=tr[k].r-tr[k].l+1;
        else {tr[k].sum=0;}
        tr[k<<1].tag=tr[k].tag;
        tr[k<<1|1].tag=tr[k].tag;
       }
       tr[k].tag=0;
    }
    void pushup(int k)
    {
        pushdown(k<<1);
        pushdown(k<<1|1);
        tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum;
    }
    void build(int k,int s,int t)
    {
        tr[k].l=s;
        tr[k].r=t;
        tr[k].tag=0;
        tr[k].sum=0;
        if(s==t)
            {tr[k].v=a[s];if(!P[a[s]])tr[k].sum=1;else tr[k].sum=0;return;}
        int mid=(s+t)>>1;
        build(k<<1,s,mid);
        build(k<<1|1,mid+1,t);
        pushup(k);
    }
    void add(int k,int x,int y)
    {
        pushdown(k);
        if(x==tr[k].l&&tr[k].l==tr[k].r)
        {
            tr[k].v+=y;
            if(!P[tr[k].v])
                tr[k].sum=1;
            else tr[k].sum=0;
            return ;
        }
        int mid=(tr[k].l+tr[k].r)>>1;
        if(x<=mid)
            add(k<<1,x,y);
        else add(k<<1|1,x,y);
       pushup(k);
    }
    void update(int k,int x,int y,int c)
    {
        pushdown(k);
        if(x==tr[k].l&&y==tr[k].r)
        {
           tr[k].tag=c;
           return ;
        }
        int mid=(tr[k].l+tr[k].r)>>1;
        if(y<=mid)update(k<<1,x,y,c);
        else if(x>mid)update(k<<1|1,x,y,c);
        else {
            update(k<<1,x,mid,c);
            update(k<<1|1,mid+1,y,c);
        }
        pushup(k);
    }
    ll ask(int k,int x,int y)
    {
        pushdown(k);
        if(x==tr[k].l&&y==tr[k].r)
        {
           return tr[k].sum;
        }
        int mid=(tr[k].l+tr[k].r)>>1;
        if(y<=mid)return ask(k<<1,x,y);
        else if(x>mid)return ask(k<<1|1,x,y);
        else {
            return (ask(k<<1,x,mid)+ask(k<<1|1,mid+1,y));
        } pushup(k);
    }
    int main()
    {
        P[1]=1;
        for(int i=2;i<=10000000;i++)
        {
            if(!P[i])
            for(int j=i+i;j<=10000000;j+=i)
                P[j]=1;
        }
        ll n,q,c;
        int T=read();
        while(T--)
        {
            scanf("%lld%lld",&n,&q);
            FOR(i,1,n)
            {
                scanf("%lld",&a[i]);
            }
            char ch[30];
            ll x,y;
            build(1,1,n);
            FOR(i,1,q)
            {
                scanf("%s%lld%lld",&ch,&x,&y);
                if(ch[0]=='A')
                {
                    add(1,y,x);
                }
                else if(ch[0]=='R')
                {
                    scanf("%lld",&c);
                    update(1,y,c,x);
                }
                else if(ch[0]=='Q')
                {
                    printf("%lld
    ",ask(1,x,y));
                }
            }
        }
        return 0;
    }
    挫挫的代码
  • 相关阅读:
    LeetCode 345. Reverse Vowels of a String 题解
    LeetCode 344. Reverse String 题解
    LeetCode 27. Remove Element 题解
    LeetCode 61. Rotate List 题解
    LeetCode 19.Remove Nth Node From End of List 题解
    Android耗电量
    Android 使用adb查看和修改电池信息
    Android AOP AspectJ 插桩
    Flask相关用法
    Monkey日志信息的11种Event percentage
  • 原文地址:https://www.cnblogs.com/zxhl/p/4869742.html
Copyright © 2011-2022 走看看