码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 3074 (线段树+模P乘法)

时间:2015-05-13 19:28:31      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=3074

题目大意:单点更新。维护序列乘法。mod 1000000007。

解题思路

1000000007*1000000007~10^18<9*10^18(int64)

所以单步模P乘法可以直接计算。

(a*b)%p=[(a%p)*(b%p)]%p,PushUp维护即可。

Query的rson的时候,要先判下lson是否存在,不存在ret=Query(rson),否则ret=(Query(lson)*Query(rson))%p

#include "iostream"
#include "string"
#include "vector"
#include "cstring"
#include "fstream"
#include "cstdio"
using namespace std;
#define M 100005
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define LL long long
#define mod 1000000007
LL ans[M<<2];
void PushUp(int root)
{
    LL a=ans[root<<1]%mod,b=ans[root<<1|1]%mod;
    ans[root]=(a*b)%mod;
}
void build(int l,int r,int root)
{
    if(l==r)
    {
        scanf("%I64d",&ans[root]);
        return;
    }
    int mid=(l+r)>>1;
    build(lson);
    build(rson);
    PushUp(root);
}
void update(int p,int value,int l,int r,int root)
{
    if(l==r)
    {
        ans[root]=value;
        return;
    }
    int mid=(l+r)>>1;
    if(p<=mid) update(p,value,lson);
    else update(p,value,rson);
    PushUp(root);
}
LL Query(int L,int R,int l,int r,int root)
{
    if(L<=l&&r<=R) return ans[root]%mod;
    int mid=(l+r)>>1;
    LL ret=-1;
    if(L<=mid) ret=Query(L,R,lson);
    if(R>mid)
    {
        LL rr=Query(L,R,rson);
        if(ret!=-1)
        {
            LL a=ret%mod,b=rr%mod;
            ret=(a*b)%mod;
        }
        else ret=rr;
    }
    return ret;
}
int main()
{
    //freopen("in.txt","r",stdin);
    int n,q,ll,rr,p,k,v,cmd;
    int T;scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        build(1,n,1);
        scanf("%d",&q);
        while(q--)
        {
            scanf("%d",&cmd);
            if(cmd==1)
            {
                scanf("%d%d",&k,&v);
                update(k,v,1,n,1);
            }
            if(cmd==0)
            {
                scanf("%d%d",&ll,&rr);
                LL ans=Query(ll,rr,1,n,1);
                printf("%I64d\n",ans%mod);
            }
        }
    }
    return 0;
}

 

HDU 3074 (线段树+模P乘法)

标签:

原文地址:http://www.cnblogs.com/neopenx/p/4501058.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!