HDU 3074

来源:互联网 发布:java double e 编辑:程序博客网 时间:2024/04/29 11:40

这道题目我用一般线段树写,发现超时了,后来用结构体,就过了,于是才知道结构体速度会快好多!代码如下:#include <iostream>#include <cstdio>#include <cstring>const int maxn=50005;const int D=1000000007;__int64 a[maxn];using namespace std;struct node{    int l,r;    long long  sum;}root[4*maxn];void build(int u,int l,int r){    root[u].l=l;    root[u].r=r;    if(l==r)    {        root[u].sum=a[l];        return;    }    int mid=(l+r)>>1;    build(2*u,l,mid);    build(2*u+1,mid+1,r);    root[u].sum=(root[2*u].sum*root[2*u+1].sum)%D;}void update(int u,int l,int r,int pos,int tre){    if(root[u].l==root[u].r&&root[u].l==pos)    {        root[u].sum=tre;        return ;    }    int mid=(l+r)>>1;    if(pos<=mid)update(2*u,l,mid,pos,tre);    else update(2*u+1,mid+1,r,pos,tre);    root[u].sum=(root[2*u].sum*root[2*u+1].sum)%D;}long long query(int u,int l,int r,int tl,int tr){    if(root[u].l>=tl&&root[u].r<=tr)    {        return root[u].sum;    }    int mid=(l+r)>>1;    if(tr<=mid) query(2*u,l,mid,tl,tr);    else if(tl>mid) query(2*u+1,mid+1,r,tl,tr);    else    {        __int64 t1=query(2*u,l,mid,tl,mid);        __int64 t2=query(2*u+1,mid+1,r,mid+1,tr);        return (t1*t2)%D;    }}int main(){    int t,n,i,p,b,c,k;     scanf("%d",&t);        while(t--)        {            scanf("%d",&n);            for(i=1; i<=n; i++)                scanf("%I64d",&a[i]);            build(1,1,n);            scanf("%d",&p);            for(i=0; i<p; i++)            {                scanf("%d%d%d",&k,&b,&c);                if(k==0)                {                    __int64 ans;                    ans=query(1,1,n,b,c);                    printf("%I64d\n",ans);                }                else if(k==1)                {                    update(1,1,n,b,c);                }            }        }    return 0;}