• hdu3074 线段树求区间乘积(单点更新)


    题意:
          给你n个数,两种操作,(1) 把第b个数改成c (2)算出b-c的乘积,结果对1000000007取余。

    思路:

          线段树单点更新,简单题目,不多解释,具体看代码。



    #include<stdio.h>
    
    #define lson l ,mid ,t << 1
    #define rson mid + 1 ,r ,t << 1 | 1
    #define MOD 1000000007
    
    __int64 sum[50000*4+100];
    
    void Pushup(int t)
    {
        sum[t] = ((sum[t<<1] % MOD) * (sum[t<<1|1] % MOD)) % MOD;
    }
    
    void BuidTree(int l ,int r ,int t)
    {
        sum[t] = 1;
        if(l == r)
        {
            scanf("%I64d" ,&sum[t]);
            sum[t] %= MOD;
            return;
        }
        int mid = (l + r) >> 1;
        BuidTree(lson);
        BuidTree(rson);
        Pushup(t);
    }
    
    void Update(int l ,int r ,int t ,int a ,int b)
    {
         if(l == r)
         {
              sum[t] = b % MOD;
              return;
         }
         int mid = (l + r) >> 1;
         if(a <= mid) Update(lson ,a ,b);
         else Update(rson ,a ,b);
         Pushup(t);
    }
    
    __int64 Query(int l ,int r ,int t ,int a ,int b)
    {
        if(a <= l && b >= r)
        return sum[t];
        int mid = (l + r) >> 1;
        __int64 ans = 1;
        if(a <= mid) ans = Query(lson ,a ,b) % MOD;
        if(b > mid) ans *= Query(rson ,a ,b) % MOD;
        return ans % MOD;
    }
    
    int main ()
    {
        int t ,i ,n ,m ,a ,b ,c;
        scanf("%d" ,&t);
        while(t--)
        {
            scanf("%d" ,&n);
            BuidTree(1 ,n ,1);
            scanf("%d" ,&m);
            while(m--)
            {
               scanf("%d %d %d" ,&a ,&b ,&c);
               if(a) Update(1 ,n ,1 ,b ,c);
               else printf("%I64d
    " ,Query(1 ,n ,1 ,b ,c) % MOD);
            }
        }
        return 0;
    }
                      
        
       
    
    
    
    
    

  • 相关阅读:
    趣图:程序员告诉你为什么充钱后速度更快
    金三银四铜五铁六,面试得做好这个准备
    Java中如何模拟真正的同时并发请求?
    趣图:程序员最头疼的原因
    Java并发面试题
    linux内存分配与回收
    7.3 Set集合
    7.2 Java 11新增的Collection和Iterator接口
    7.1 Java集合概念
    6.5 正则表达式
  • 原文地址:https://www.cnblogs.com/csnd/p/12062827.html
Copyright © 2020-2023  润新知