UVALive 5798 Jupiter Atacks!(线段树)
来源:互联网 发布:js查找字符串中字符 编辑:程序博客网 时间:2024/06/06 00:51
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25634
题意:每组case给你B, P, L and N,代表常数B,取摸数P,数组长度L,N个操作。一开始数组【1-L】每个位置都为0,然后输入N个操作‘E' x y 代表把x位置的数改为y; 'H' x y 代表输出区间[ x , y ]按题目所给公式算出的值。
题解:线段树。有公式 f=B0f5 + B1f4 + B2f3 + B3f2 可以转换成 f=B3f2+B2f3+B1f4+B0f5 ,这样我们用线段树维护区间的 f 值,区间合并时假设fl代表左区间的f值,fr代表 右区间的 f 值,rnum 代表右区间的元素的个数
则 f = B ^ (rnum) *fl + fr; 查询时也同理
#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <string>#include <map>#include <cstdlib>#include <cmath>#include <vector>#include <set>#include <queue>#define lson id<<1,l,m#define rson id<<1|1,m+1,rusing namespace std;const int maxn=1e5+100;typedef long long ll;ll mod[maxn];ll b,p;int n,m;ll sum[maxn*4];void get_mod() { mod[0]=1; for(int i=1; i<=n; i++) mod[i]=(mod[i-1]*b)%p;}ll link_range(ll a,ll b,int k) { return (b+a*mod[k])%p;}void update(int id,int l,int r,int pos,int v) { if(l==r) { sum[id]=v; return ; } int m=(l+r)>>1; if(m>=pos) update(lson,pos,v); else update(rson,pos,v); sum[id]=link_range(sum[id<<1],sum[id<<1|1],r-m);}ll query(int id,int l,int r,int a,int b) { if(l>=a&&b>=r) { return sum[id]; } int m=(l+r)>>1; ll rs,ls; rs=ls=0; if(a<=m) ls=query(lson,max(a,l),min(b,m)); if(b>m) rs=query(rson,max(m+1,a),min(b,r)); int rk=max(b-max(m+1,a)+1,0); return link_range(ls,rs,rk);}int main() {#ifdef ONLINE_JUDGE#else freopen("in.txt","r",stdin);#endif while(~scanf("%lld%lld%d%d",&b,&p,&n,&m)) { if(n==0) break; getchar(); memset(sum,0,sizeof(sum)); get_mod(); for(int i=1; i<=m; i++) { char c; int x,y; scanf("%c %d %d",&c,&x,&y); getchar(); if(c=='E') update(1,1,n,x,y); else printf("%lld\n",query(1,1,n,x,y)); } puts("-"); } return 0;}
0 0
- UVALive 5798 Jupiter Atacks!(线段树)
- UVAlive 5798 Jupiter Atacks!(树状数组)
- BNU 12680 Jupiter Atacks! (线段树)
- 5798 - Jupiter Atacks!
- Jupiter Atacks!
- [树状数组]uva 5798 Jupiter Atacks!
- UVAlive5798 Jupiter Atacks!
- UVALIVE 5789 线段树
- uvalive 3989(线段树)
- uvalive 4108(线段树)
- UVALive 6838 (线段树)
- UVALive 6834 (线段树)
- 【UVALive】4108 SKYLINE 线段树
- [UVALive]7338 树链剖分+线段树
- acm 乘法逆元 或线段树 UVALive 5798
- UVALive 4329 Ping pong(线段树)
- 【UVALive】6709 Mosaic 二维线段树
- UVALive 5881 Unique Encryption Keys【线段树】
- iOS开发网络篇—搭建本地服务器
- 后台获取 已存在的 ApplicationContext 对象
- js找出两个数组中的相同元素
- iOS loadView,viewDidLoad,viewDidUnload用法
- Git之初识版本控制工具
- UVALive 5798 Jupiter Atacks!(线段树)
- Scanf连续调用多次并且存在%c的问题
- 浅谈Feature Scaling
- Android - 手机淘宝启动页(Splash)是如何实现的?
- IPhone开发工具篇-利用xcode profile和analyze进行性能优化
- jQuery基本选择符
- 多条件查询
- oracle分页查询
- cosnt修饰符