现在的位置: 首页 > 综合 > 正文

hdoj 3074 Multiply game(线段树…

2019年04月02日 ⁄ 综合 ⁄ 共 1533字 ⁄ 字号 评论关闭
题意:两种操作
0 k1 k2; you need to work out the multiplication of the subsequence
from k1 to k2, inclusive.
1 k p; the kth number of the sequence has been change to p.
(1<=k<=n)

思路:线段树 跟前面做的几道对比 有点简单了 但要注意要用__int64 而且每乘完后都要取模

//484MS   
2452K

#include <stdio.h>
#define M 50050
#define L(x) (x<<1)
#define R(x) ((x<<1)+1)
#define inf 1000000007
int num[M];
struct data
{
    int
l,r;
    __int64
ans;
}node[M*3];

void BuildTree(int left,int right,int u)
{
    node[u].l =
left;
    node[u].r =
right;
    if (left ==
right)
    {
       
node[u].ans = num[left];
       
return ;
    }
    int mid =
(left + right)>>1;
   
BuildTree(left,mid,L(u));
   
BuildTree(mid+1,right,R(u));
    node[u].ans
= (node[L(u)].ans * node[R(u)].ans)%inf;
}

__int64 query (int left,int right,int u)
{
    if
(node[u].l == left&&node[u].r ==
right)
       
return node[u].ans;
    int mid =
(node[u].l + node[u].r)>>1;
    if (right
<= mid)
       
return query (left,right,L(u));
    if (left
>= mid+1)
       
return query (left,right,R(u));
    __int64 a =
query (left,mid,L(u));
    __int64 b =
query (mid+1,right,R(u));
    return
(a*b)%inf;           
//这里没取模 WA了无数次啊!!
}

void updata (int loc,int num,int u)
{
    if
(node[u].l == loc&&node[u].r ==
loc)
    {
       
node[u].ans = num;
       
return ;
    }
    if (loc
<= node[L(u)].r)
       
updata (loc,num,L(u));
    if (loc
>= node[R(u)].l)
       
updata (loc,num,R(u));
    node[u].ans
= (node[L(u)].ans * node[R(u)].ans)%inf;
}
int main ()
{
    int
t,n,m,i,op,x,y;
    scanf
("%d",&t);
    while (t
--)
    {
       
scanf ("%d",&n);
       
for (i = 1;i <= n;i ++)
           
scanf ("%d",&num[i]);
       
BuildTree(1,n,1);
       
scanf ("%d",&m);
       
while (m --)
       
{
           
scanf
("%d%d%d",&op,&x,&y);

           
if (op == 0)
           
{
  

抱歉!评论已关闭.