hdu 3074 求区间乘积

线段树水题

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

#define LL(x) (x<<1)
#define RR(x) ((x<<1)|1)
long long num[4*50000];
int update(int L,int R,int pos,int k,int mark)
{
    if(L==pos&&R==pos)
    {
        num[mark]=k;
        return 0;
    }
    int mid=(L+R)/2;
    if(pos<=mid)
    {
        update(L,mid,pos,k,LL(mark));
    }
    else
    {
        update(mid+1,R,pos,k,RR(mark));
    }
    num[mark]=(num[LL(mark)]%1000000007)*(num[RR(mark)]%1000000007)%1000000007;
    return 0;
}
long long find(int L,int R,int left,int right,int mark)
{
    long long sum=1;
    if(L==left&&R==right)
    {
        sum=num[mark];
        return sum;
    }
    int mid=(L+R)/2;
    if(right<=mid)
    {
        sum=find(L,mid,left,right,LL(mark));
    }
    else if(left>mid)
    {
        sum=find(mid+1,R,left,right,RR(mark));
    }
    else
    {
        sum=(find(L,mid,left,mid,LL(mark))%1000000007)*(find(mid+1,R,mid+1,right,RR(mark))%1000000007)%1000000007;
    }
    return sum;
}
int main()
{
    int n,m,T,i,j,a,b,c;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(i=1;i<=4*n;i++)
        num[i]=1;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a);
            update(1,n,i,a,1);
        }
        scanf("%d",&m);
        for(i=1;i<=m;i++)
        {
            scanf("%d%d%d",&c,&a,&b);
            if(c==0)
            {
                printf("%lld\n",find(1,n,a,b,1));
            }
            else
            {
                update(1,n,a,b,1);
            }
        }
    }
    return 0;
}
时间: 2024-08-04 01:51:05

hdu 3074 求区间乘积的相关文章

!HDU 5317 求区间里两个数的质因数个数的gcd的最大值-预处理

题意:设一个数i的质因数个数为F(i),现给你一个区间[l~r],求max(F[i],F[j])  数据范围:10^6 分析: 预处理出所有的F[i],O(nlgn),10^6不会超时:然后查询用O(7),查询不能用O(n),因为有多个查询会超时. 区间问题减少查询时间复杂度多半类似一个区间的和用两个前缀和相减的方式,前缀和可以在预处理的时候计算,然后区间查询是用两个前缀和相减就行了.如sum[l~r]=sum[r]-sum[l-1],再比如之前的什么我想不起来一时,想起来加上. 代码: #in

HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)

Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5101    Accepted Submission(s): 2339 Problem Description Mario is world-famous plumber. His “burly” figure and amazing jumping abilit

hdu 2665 可持久化线段树求区间第K大值(函数式线段树||主席树)

http://acm.hdu.edu.cn/showproblem.php?pid=2665 Problem Description Give you a sequence and ask you the kth big number of a inteval. Input The first line is the number of the test cases. For each test case, the first line contain two integer n and m (

HDU 4343 多查询求区间内的最大不相交区间个数-思维&amp;贪心-卡时间&amp;二分&amp;剪枝

题意:给你一些区间,现在有m个查询,求出每个查询的区间内的最大的不相交区间个数 分析: 几天前那道说谎问题时用dp的摞箱子模型求的最大的不相交区间个数,但是这题不能用这个方法,因为这题是动态的查询,不可能每个查询dp一次,超时. 这题用贪心策略.求区间[l~r]里的最大不相交区间,贪心策略就应该先选该区间内右端点最小的,这样给以后待选的区间留下更大的空间,所以我们的做法就是先按照区间的右端点排序,然后每次查询依次挑出查询区间里右端点最小的,并且把查询区间的左端点更新为刚才挑出的区间的右端点(这个

hdu 5443 (2015长春网赛G题 求区间最值)

求区间最值,数据范围也很小,因为只会线段树,所以套了线段树模板=.= Sample Input3110011 151 2 3 4 551 21 32 43 43 531 999999 141 11 22 33 3 Sample Output1002344519999999999991 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm>

HDU 3473-Minimum Sum(划分树-求区间sigma最小值)

Minimum Sum Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3710    Accepted Submission(s): 852 Problem Description You are given N positive integers, denoted as x0, x1 ... xN-1. Then give you

树状数组求区间最值

树状数组求区间最值 树状数组(Binary Index Tree)利用二进制的一些性质巧妙的划分区间,是一种编程,时间和空间上都十分理想的求区间和的算法,同样我们可以利用树状数组优美的区间划分方法来求一个序列的最值 约定以 num[]  表示原数组, 以 idx[] 表示索引数组, Lowbit(x)=x&(-x) 树状数组求和时通过构造数组 idx[] 使 idx[k]=sum(num[tk]), tk [k-Lowbit(k)+1,k], 使用同样的方法构造最值索引数组: 以最大值为例, 先

HDU 5726 GCD 区间GCD=k的个数

GCD Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2742    Accepted Submission(s): 980 Problem Description Give you a sequence of N(N≤100,000) integers : a1,...,an(0<ai≤1000,000,000). There ar

树状数组求区间最大值

------  一直用 线段树 求区间最大值,想换种思路,用树状数组试试,肯定是可以的. 首先要对 树状数组的每个 i 所管理的区间有一定的理解.详见上篇博客: 树状数组(BIT)