• HDU3074: Multiply game(线段树单点更新,区间查询)


    题目: 传送门

    题解:线段树模板题目。

    对递归的题目始终理解不好,我的痛啊,在水的题目都要写很长时间。

    #include <iostream>
    #include <string.h>
    #include <stdio.h>
    #include <algorithm>
    typedef __int64  ll;
    #define inf 0x3f3f3f3f
    #include <math.h>
    #include <queue>
    #define mod 1000000007
    #define N 50010
    using namespace std;
    int n,m;
    struct node
    {
        int l,r;
        ll w;
    }q[4*N];
    void pushup(int rt)
    {
        q[rt].w=(q[rt<<1].w*q[rt<<1|1].w)%mod;
    }
    void build(int l,int r,int rt)
    {
        q[rt].l=l;
        q[rt].r=r;
        q[rt].w=0;
        if(l==r)
        {
            scanf("%I64d",&q[rt].w);
            return ;
        }
        int mid=(l+r)>>1;
        build(l,mid,rt<<1);
        build(mid+1,r,rt<<1|1);
        pushup(rt);
        return ;
    }
    void update(int lf,int key,int l,int r,int rt)
    {
        if(l==r&&lf==l)
        {
            q[rt].w=key;
            return ;
        }
        int mid=(l+r)>>1;
        if(lf<=mid) update(lf,key,l,mid,rt<<1);
        else update(lf,key,mid+1,r,rt<<1|1);
        pushup(rt);
        return ;
    }
    ll query(int lf,int rf,int l,int r,int rt)
    {
        if(lf<=l&&rf>=r)
        {
            return q[rt].w;
        }
        ll L=1;//区别于全局变量
        int mid=(l+r)>>1;
        if(lf<=mid)  L=(L*query(lf,rf,l,mid,rt<<1))%mod;
        if(rf>mid)   L=(L*query(lf,rf,mid+1,r,rt<<1|1))%mod;
        return L;
    }
    int main()
    {
        int T,se,xx,yy;
        scanf("%d",&T);
        while (T--)
        {
            scanf("%d",&n);
            build(1,n,1);
            scanf("%d",&m);
            for(int i=0;i<m;i++)
            {
                scanf("%d%d%d",&se,&xx,&yy);
                if(se==0)
                {
                    ll tt=query(xx,yy,1,n,1);
                    printf("%I64d
    ",tt%mod);
                }
                else if(se==1)
                {
                    update(xx,yy,1,n,1);
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    截取文件路径组成新文件路径
    jsoup选择器
    正则小示例
    一个没有经过优化的过滤指定目录下的指定扩展名文件的算法
    正则表达式生成问题
    链接中带换行的页面查找替换问题
    数组扩容测试
    LeetCode 3.无重复字符的最长子串
    LeetCode 200.岛屿数量
    LeetCode 560.和为K的子数组
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/4328465.html
Copyright © 2020-2023  润新知