题目链接: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 long using 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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/wlxsq/article/details/46916281