HDU 3074 (线段树+模P乘法)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3074
题目大意:单点更新。维护序列乘法。mod 1000000007。
解题思路:
1000000007*1000000007~10^18<9*10^18(int64)
所以单步模P乘法可以直接计算。
(a*b)%p=[(a%p)*(b%p)]%p,PushUp维护即可。
Query的rson的时候,要先判下lson是否存在,不存在ret=Query(rson),否则ret=(Query(lson)*Query(rson))%p
#include "iostream"
#include "string"
#include "vector"
#include "cstring"
#include "fstream"
#include "cstdio"
using namespace std;
#define M 100005
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define LL long long
#define mod 1000000007
LL ans[M<<];
void PushUp(int root)
{
LL a=ans[root<<]%mod,b=ans[root<<|]%mod;
ans[root]=(a*b)%mod;
}
void build(int l,int r,int root)
{
if(l==r)
{
scanf("%I64d",&ans[root]);
return;
}
int mid=(l+r)>>;
build(lson);
build(rson);
PushUp(root);
}
void update(int p,int value,int l,int r,int root)
{
if(l==r)
{
ans[root]=value;
return;
}
int mid=(l+r)>>;
if(p<=mid) update(p,value,lson);
else update(p,value,rson);
PushUp(root);
}
LL Query(int L,int R,int l,int r,int root)
{
if(L<=l&&r<=R) return ans[root]%mod;
int mid=(l+r)>>;
LL ret=-;
if(L<=mid) ret=Query(L,R,lson);
if(R>mid)
{
LL rr=Query(L,R,rson);
if(ret!=-)
{
LL a=ret%mod,b=rr%mod;
ret=(a*b)%mod;
}
else ret=rr;
}
return ret;
}
int main()
{
//freopen("in.txt","r",stdin);
int n,q,ll,rr,p,k,v,cmd;
int T;scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
build(,n,);
scanf("%d",&q);
while(q--)
{
scanf("%d",&cmd);
if(cmd==)
{
scanf("%d%d",&k,&v);
update(k,v,,n,);
}
if(cmd==)
{
scanf("%d%d",&ll,&rr);
LL ans=Query(ll,rr,,n,);
printf("%I64d\n",ans%mod);
}
}
}
return ;
}
HDU 3074 (线段树+模P乘法)的更多相关文章
- hdu 3074(线段树)
Multiply game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- hdu 4578 线段树(标记处理)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others) ...
- hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- hdu 3974 线段树 将树弄到区间上
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3436 线段树 一顿操作
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- hdu 3397 线段树双标记
Sequence operation Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 4533 线段树(问题转化+)
威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- hdu 2871 线段树(各种操作)
Memory Control Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu 4052 线段树扫描线、奇特处理
Adding New Machine Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
随机推荐
- 服务器知识----IIS架设问题
1,基本配置,应用程序池,路径等. 2,权限设置 Iuser IIS_users 只读权限 3,isapi映射 framework安装目录下 运行 aspnet_regiis.exe -i 注 ...
- HTML5 – 4.canvas
1.绘制矩形 2.绘制圆形 3.绘制文字 4.保存文件 什么是 Canvas? HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成. < ...
- 重温WCF之发送和接收SOAP头(三)
SOAP头可以理解为一种附加信息,就是附加到消息正文的内容. 既然消息头是附加信息,那有啥用呢?你可别说,有时候还真有不少用处.举个例子,WCF的身份验证是不是很麻烦?还要颁发什么证书的(当然不是荣誉 ...
- Delphi中exit、break、continue等跳出操作的区别
Delphi中表示跳出的有break,continue,abort,exit,halt,runerror等 1.break 强制退出最近的一层循环(注意:只能放在循环里:而且是只能跳出最近的一层循环) ...
- 【131202】SQL
SELECT TOP 2 * FROM Persons SELECT *FROM PersonsWHERE ROWNUM <= 5 SELECT * FROM Persons WHERE C ...
- poj 1724:ROADS(DFS + 剪枝)
ROADS Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10777 Accepted: 3961 Descriptio ...
- Oracle优化 -- 关于Database Buffer Cache相关参数DB_CACHE_SIZE的优化设置
select size_for_estimate, buffers_for_estimate ,ESTD_PHYSICAL_READ_factor,ESTD_PHYSICAL_READS from v ...
- 利用IdentityServer3在ASP.NET 5和Angular中实现OAuth2 Implicit Flow
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:之前介绍过的IdentityServer3虽然是基于Katana开发的,不过同样可以托 ...
- 注解:【无连接表的】Hibernate单向N->1关联
Person与Address关联:单向N->1,[无连接表的] Person.java package org.crazyit.app.domain; import javax.persiste ...
- [转]svn常用命令
谢谢原作者:http://blog.sina.com.cn/s/blog_963453200101eiuq.html 1.检出svn co http://路径(目录或文件的全路径) [本地目录全路 ...