HDU-3074-Multiply game-单点更新

来源:互联网 发布:买车贷款和全款 知乎 编辑:程序博客网 时间:2024/06/05 14:24

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

这个也是个线段树的单点更新的模板题;要是不懂的话可以去看看我写的这篇单点更新的,我的HDU1166敌兵布阵代码有详解;

链接:http://blog.csdn.net/wlxsq/article/details/46897219

#include<iostream>#include<string>#include<cstdio>#include<cstring>#include<queue>#include<map>#include<set>#include<vector>#include<algorithm>#define LL long longusing namespace std;struct node{    int l,r;    LL v;}node[50005<<2];void PushUp(int numb)       //  向父节点更新数据;{    node[numb].v=(node[numb<<1].v%1000000007)*(node[numb<<1|1].v%1000000007)%1000000007;}void build(int l,int r,int numb)     // 建树;{    node[numb].l=l;    node[numb].r=r;    node[numb].v=0;    if(l==r) return;    int mid=(l+r)>>1;    build(l,mid,numb<<1);    build(mid+1,r,numb<<1|1);}void Insert(int numb,int t,LL v)    //  插入数据;{    int l=node[numb].l,r=node[numb].r;    if(l==r&&l==t){        node[numb].v=v;        return;    }    int mid=(l+r)>>1;    if(t>mid) Insert(numb<<1|1,t,v);    else if(t<=mid) Insert(numb<<1,t,v);    PushUp(numb);}LL query(int l,int r,int numb)      //  查询数据;{    if(node[numb].l==l&&node[numb].r==r){        return node[numb].v;    }    int mid=(node[numb].l+node[numb].r)>>1;    if(l>mid) return query(l,r,numb<<1|1);    else if(r<=mid) return query(l,r,numb<<1);    else{        return (query(l,mid,numb<<1)*query(mid+1,r,numb<<1|1))%1000000007;    }}int main(){    int t,n,q,a,b;    scanf("%d",&t);    while(t--){        scanf("%d",&n);        build(1,n,1);        for(int i=1;i<=n;i++){            scanf("%d",&a);            Insert(1,i,a);        }        scanf("%d",&q);        for(int i=0;i<q;i++){            scanf("%d",&a);            if(a==0){                scanf("%d%d",&a,&b);                cout<<query(a,b,1)<<endl;            }else{                scanf("%d%d",&a,&b);                Insert(1,a,b);            }        }    }    return 0;}


 

0 0
原创粉丝点击