hdu 5475(线段树)
2015-09-27 23:27
260 查看
题意:
两个操作:① 当为1时 ,乘上后面的数
② 当为2时,除以第x次乘的数
还说了2操作后面的n不会重复(就这明显看出线段树- -,然而并没有看出来,还是靠的队友)
1则对每个节点赋值,2则将相应的点改为一,每次操作后进行一次询问
两个操作:① 当为1时 ,乘上后面的数
② 当为2时,除以第x次乘的数
还说了2操作后面的n不会重复(就这明显看出线段树- -,然而并没有看出来,还是靠的队友)
1则对每个节点赋值,2则将相应的点改为一,每次操作后进行一次询问
#include <cstdio> #define MAXN 100010 using namespace std; long long m,ans[MAXN],q[MAXN],tree[MAXN*50]; int n; long long build(int l,int r,int rt) { if(l==r) return(tree[rt]=q[l]>1?q[l]:1); int mid=(l+r)/2; return tree[rt]=(build(l,mid,rt*2)*build(mid+1,r,rt*2+1))%m; } long long change(int l,int r,int rt,int x) { if(l==r)return tree[rt]=1; int mid=(l+r)/2; if(x<=mid)return tree[rt]=(change(l,mid,rt*2,x)*tree[rt*2+1])%m; else return tree[rt]=(tree[rt*2]*change(mid+1,r,rt*2+1,x))%m; } long long query(int l,int r,int rt,int x) { if(r==x)return tree[rt]; int mid=(l+r)/2; if(x>mid)return (tree[rt*2]*query(mid+1,r,rt*2+1,x))%m; else return query(l,mid,rt*2,x); } int main() { int T; scanf("%d",&T); for(int t=1; t<=T; ++t) { scanf("%d%lld",&n,&m); int op; ans[0]=1; for(int i=1; i<=n; i++) { ans[i]=1; scanf("%d%lld",&op,&q[i]); q[i]%=m;if(op==2)q[i]=-q[i]; } build(1,n,1); printf("Case #%d:\n",t); for(int i=1; i<=n; i++) { if(q[i]>=0)ans[i]=(ans[i-1]*q[i])%m; else { change(1,n,1,-q[i]); ans[i]=query(1,n,1,i); } printf("%lld\n",ans[i]); } } return 0; }
相关文章推荐
- hdu 5475(线段树)
- 获取当天从0点开始的时间
- 我的ITEYE搬家到csdn
- 笔记
- 新版本Xcode 6的视图调试详解
- php多个数组求组合数
- Android 方法数超过限制的解决办法
- 今天是中秋节
- 新手必须知道的13个Xcode小技巧
- 线程与进程的关系与区别
- 咱也玩玩Wordpress
- 获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。
- 简单的图论题-湖南省第十一届 省赛
- Xcode 6.3.1Mac版 V6.4.Beta3免费下载
- numpy教程:统计函数Statistics
- Color转ArcEngine的IRgbColor与IColor
- Python学习之魔法方法、属性和迭代器
- numpy教程 - 统计函数
- 系统开发生命周期之分析阶段
- iOS-监听触摸事件的几种方式