zoukankan      html  css  js  c++  java
  • hdu 3074 Multiply game

    /* ***********************************************
    Author        :xryz
    Email         :523689985@qq.com
    Created Time  :4-30 21:25:25
    File Name     :Multiply game.cpp
    ************************************************ */
    
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <string>
    #include <math.h>
    #include <stdlib.h>
    #include <time.h>
    using namespace std;
    
    const int  mod=1000000007;
    struct node
    {
        int left,right;
        long long int sum;
    } t[200000+5];
    int a[50000+24];
    
    void make(int id,int l,int r)//建树
    {
        t[id].left=l;
        t[id].right=r;
        if(l==r)
        {
            t[id].sum=a[l];
        }
        else
        {
            int mid=(l+r)/2;
            make(id*2,l,mid);
            make(id*2+1,mid+1,r);
            t[id].sum=(t[id*2].sum*t[id*2+1].sum%mod);
        }
    }
    
    
    void mult(int id,int pos,int p)//单点更新
    {
        int mid=(t[id].left+t[id].right)/2;
        if(t[id].left==t[id].right&&t[id].left==pos)
        {
            t[id].sum=p;
            return ;
        }
        else if(pos>mid) mult(id*2+1,pos,p);
        else mult(id*2,pos,p);
        t[id].sum=(t[id*2].sum*t[id*2+1].sum)%mod;
        //if(t[id].sum==0) printf("%d
    ",id);
    }
    
    long long int query(int l,int r,int id)//查询
    {
        if(t[id].left==l&&t[id].right==r)
            return t[id].sum;
        else
        {
            int mid=(t[id].left+t[id].right)/2;
            if(r<=mid) return query(l,r,id*2);
            else if(l>mid) return query(l,r,id*2+1);
            else
                return (query(l,mid,id*2)*query(mid+1,r,id*2+1))%mod;
    
        }
    }
    
    int main()
    {
        int T,cmd,i,n,k,t1,t2;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            a[0]=1;
            for(i=1; i<=n; i++) scanf("%d",&a[i]);
            make(1,1,n);
            scanf("%d",&k);
            while(k--)
            {
                scanf("%d%d%d",&cmd,&t1,&t2);
                if(cmd==1)
                {
                    mult(1,t1,t2);
                    a[t1]=t2;
                    //int ans=query(2,5,1);printf("%d
    ",ans);
                }
                else
                {
                    int ans=query(t1,t2,1)%mod;
                    printf("%d
    ",ans);
                }
            }
        }
        return 0;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/

  • 相关阅读:
    【第五章】printf输出顺序
    【转载】面试_现在有4个石头,1000层的楼房,需要测定这个石头破碎的高度。求最少多少次一定可以测出来。
    卷积和积分运算
    【转载】SIFT算法分析(草稿)
    【第五章】指针类型转换
    【第八章】zigzag数组输出
    【转载】SURF算法源码分析(草稿)
    【第六章】const函数改变变量的值——mutable
    Surf算法
    jsp页面中文乱码总结
  • 原文地址:https://www.cnblogs.com/xryz/p/4848022.html
Copyright © 2011-2022 走看看