zoukankan      html  css  js  c++  java
  • hdu 3074(线段树)

    Multiply game

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 2211    Accepted Submission(s): 794


    Problem Description
    Tired of playing computer games, alpc23 is planning to play a game on numbers. Because plus and subtraction is too easy for this gay, he wants to do some multiplication in a number sequence. After playing it a few times, he has found it is also too boring. So he plan to do a more challenge job: he wants to change several numbers in this sequence and also work out the multiplication of all the number in a subsequence of the whole sequence.
      To be a friend of this gay, you have been invented by him to play this interesting game with him. Of course, you need to work out the answers faster than him to get a free lunch, He he…

     
    Input
    The first line is the number of case T (T<=10).
      For each test case, the first line is the length of sequence n (n<=50000), the second line has n numbers, they are the initial n numbers of the sequence a1,a2, …,an,
    Then the third line is the number of operation q (q<=50000), from the fourth line to the q+3 line are the description of the q operations. They are the one of the two forms:
    0 k1 k2; you need to work out the multiplication of the subsequence from k1 to k2, inclusive. (1<=k1<=k2<=n)
    1 k p; the kth number of the sequence has been change to p. (1<=k<=n)
    You can assume that all the numbers before and after the replacement are no larger than 1 million.
     
    Output
    For each of the first operation, you need to output the answer of multiplication in each line, because the answer can be very large, so can only output the answer after mod 1000000007.
     
    Sample Input
    1 6 1 2 4 5 6 3 3 0 2 5 1 3 7 0 2 5
     
    Sample Output
    240 420
     
    线段树一直交给队友弄,,好久没练过,自己手打错了好多次,,看来还是要多练练。。
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    typedef long long LL;
    const int N = 50005;
    const LL mod =1000000007;
    LL a[N];
    struct Tree{
        int l,r,mid;
        LL v;
    }tree[N<<2];
    void build(int l,int r,int idx){
        tree[idx].l = l;
        tree[idx].r = r;
        tree[idx].mid = (l+r)>>1;
        if(l==r){
            tree[idx].v=a[l];
            return;
        }
        build(l,tree[idx].mid,idx<<1);
        build(tree[idx].mid+1,r,idx<<1|1);
        tree[idx].v =(tree[idx<<1].v%mod)*(tree[idx<<1|1].v%mod)%mod;
    }
    void update(int pos,LL v,int idx){
        if(tree[idx].l==tree[idx].r){
            tree[idx].v = v;
            return;
        }
        if(pos<=tree[idx].mid) update(pos,v,idx<<1);
        else update(pos,v,idx<<1|1);
        tree[idx].v =(tree[idx<<1].v%mod)*(tree[idx<<1|1].v%mod)%mod;
    }
    LL query(int l,int r,int idx){
        if(tree[idx].l==l&&tree[idx].r==r){
            return tree[idx].v%mod;
        }
        if(r<=tree[idx].mid) return query(l,r,idx<<1)%mod;
        else if(l>tree[idx].mid) return query(l,r,idx<<1|1)%mod;
        else return (query(l,tree[idx].mid,idx<<1)%mod)*(query(tree[idx].mid+1,r,idx<<1|1)%mod)%mod;
    }
    int main()
    {
        int n;
        int tcase;
        scanf("%d",&tcase);
        while(tcase--){
            scanf("%d",&n);
            for(int i=1;i<=n;i++){scanf("%lld",&a[i]);}
            build(1,n,1);
            int Q;
            scanf("%d",&Q);
            while(Q--){
                int a,b,c;
                scanf("%d%d%d",&a,&b,&c);
                if(a==0){
                    query(b,c,1);
                    printf("%lld
    ",query(b,c,1));
                }else update(b,(LL)c,1);
            }
        }
        return 0;
    }
  • 相关阅读:
    问题:android学习内容破碎,我个人关于如何学习android的一些个人经历
    问题:一球从某高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第n次落地时,共经过多少米?第n次反弹多高?
    问题:alias设置与删除
    问题:从键盘读取特定类型的数据(使用Scanner读取int类型)
    求一个数组当中最大(最小)值的两种计算方法
    Mysql5.7安装
    maven下载及安装
    Ubuntu下修改DNS重启也能用的方法
    删除CNNIC证书
    字符编码ASCII, Unicode和UTF-8概念扫盲
  • 原文地址:https://www.cnblogs.com/liyinggang/p/5531237.html
Copyright © 2011-2022 走看看