博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 3074 Multiply game(模板级线段树)
阅读量:7062 次
发布时间:2019-06-28

本文共 1598 字,大约阅读时间需要 5 分钟。

离机房关门还有十分钟,这点时间能干些什么?故作沉思地仰望星空,重新捋一下一天的学习进度,或者,砍掉一棵模板级线段树。

纯模板,就是把单点更新,区间求和改为单点更新,区间求积。

1A。

 

#include
#include
#define M 1000000007#define N 50005struct node{ int x,y; __int64 sum;}a[N*3];void CreatTree(int t,int x,int y){ a[t].x=x; a[t].y=y; a[t].sum=0; if(x==y) return ; int temp=t*2; int mid=(x+y)/2; CreatTree(temp,x,mid); CreatTree(temp+1,mid+1,y); return ;}void InsertTree(int t,int x,int k){ if(a[t].x==a[t].y) { a[t].sum=k; return ; } int temp=t*2; int mid=(a[t].x+a[t].y)/2; if(x<=mid) InsertTree(temp,x,k); else InsertTree(temp+1,x,k); a[t].sum=a[temp].sum*a[temp+1].sum%M; return ;}__int64 FindTree(int t,int x,int y){ __int64 sum=1; if(a[t].x==x&&a[t].y==y) return a[t].sum; int temp=t*2; int mid=(a[t].x+a[t].y)/2; if(y<=mid) sum*=FindTree(temp,x,y); else if(x>mid) sum*=FindTree(temp+1,x,y); else { sum=FindTree(temp,x,mid)*sum%M; sum=FindTree(temp+1,mid+1,y)*sum%M; } return sum;}int main(){ int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); CreatTree(1,1,n); int i; for(i=1;i<=n;i++) { int x; scanf("%d",&x); InsertTree(1,i,x); } int m; scanf("%d",&m); while(m--) { int x,y,z; scanf("%d%d%d",&x,&y,&z); if(x==0) printf("%I64d\n",FindTree(1,y,z)); else InsertTree(1,y,z); } } return 0;}

 

 

转载地址:http://mknll.baihongyu.com/

你可能感兴趣的文章
安装CentOS 6停在selinux-policy-targeted卡住的问题解决
查看>>
Mysql初始化root密码和允许远程访问
查看>>
VMPlayer Ubuntu 16.04 Copy and Paste with Host 主机与宿机之间的复制粘贴
查看>>
Ubantu 16.04升级内核版本和还原到升级之前的内核版本的方法
查看>>
shiro 静态页面资源不显示 解决方案(转)
查看>>
js 事件详解 冒泡
查看>>
TransE论文剩余部分
查看>>
nodejs小问题拾遗
查看>>
数据结构与算法 - 字符串
查看>>
个人资源索引
查看>>
docker-dockerfile使用
查看>>
HW2017笔试编程题
查看>>
关于集合的size的操作
查看>>
对称加密算法 非对称加密算法
查看>>
SpringBoot Druid整合,SpringBoot 集成Druid
查看>>
Reddit CEO亲自诠释内容审核的无奈
查看>>
java性能优化读书笔记(1)
查看>>
【转】nGrinder 简易使用教程
查看>>
Java中char转为16进制
查看>>
Linux下逻辑地址、线性地址、物理地址详细总结
查看>>