hdu3074-線段樹(求區間乘積)

來源:互聯網
上載者:User
/*hdu3074-求區間乘積,,注意區間有0的情況*/#include <stdio.h>#include <string.h>#define MAX 50000struct  TNode {        int       l , r;        __int64     mul;}segtree[4*MAX+5];__int64 ss[MAX+1];__int64 build(int n,int l,int r){    int mid = (l+r)/2;    segtree[n].mul = -1;    segtree[n].l = l;    segtree[n].r = r;    if(l!=r)    {        segtree[n].mul=(build(2*n,l,mid)*build(2*n+1,mid+1,r))%1000000007;        return segtree[n].mul;    }    else    {        return segtree[n].mul=ss[l];    }}void change(int n,int k,__int64 c,__int64 x=1){    int mid=(segtree[n].l+segtree[n].r)/2;    if(segtree[n].l==segtree[n].r)    {        segtree[n].mul=c;        return;    }    if(segtree[n].mul==-1)    {        segtree[n].mul=c;    }    else if(x==0)    {        ss[k]=c;        segtree[n].mul=1;        for(int i=segtree[n].l;i<=segtree[n].r;++i)            segtree[n].mul*=ss[i];    }    else    {        segtree[n].mul*=c;        segtree[n].mul/=x;    }    if(k<=mid)    {        change(2*n,k,c);    }    else    {        change(2*n+1,k,c);    }    segtree[n].mul=(segtree[n*2].mul*segtree[n*2+1].mul)%1000000007;}__int64 question(int n,int l,int r){    int mid=(segtree[n].l+segtree[n].r)/2;    if(segtree[n].l==l && segtree[n].r==r)    {        return segtree[n].mul;    }    if(r<=mid)    {        return question(2*n,l,r);    }    if(l>mid)    {        return question(2*n+1,l,r);    }    return (question(2*n,l,mid)*question(2*n+1,mid+1,r))%1000000007;}int main(){    int T,n,q,i,t,x1,x2,ch;    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        for(i=1;i<=n;i++)        {            scanf("%I64d",&ss[i]);        }        build(1,1,n);        scanf("%d",&q);        while(q--)        {            scanf("%d%d%d",&ch,&x1,&x2);            if(ch)            {                change(1,x1,x2,ss[x1]);                ss[x1]=x2;            }            else            {                printf("%I64d\n",question(1,x1,x2)%1000000007);            }        }    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.