标签:val int 题解 ll tr mid maxn 数学计算
题目连接
分析:
题意很清楚,首先不要没有头绪,我们想一想如果是区间乘%一个数怎么做?直接线段树,然后再看本题,搞一个数组,如果是操作1,对应的数字就是val,操作2对应的就是1,然后对于操作1,就是求1到i的乘积,对于2,直接求1到val-1和val+1到i的乘积.解决问题.
代码:
#include <cstdio> #define ll long long const int maxn=1e5+10; ll mod; struct TREE{ ll val; int l; int r; ll lazyp; ll lazym; }tr[maxn*4]; void build(int x,int l,int r){ tr[x].l=l; tr[x].r=r; tr[x].lazym=1; tr[x].lazyp=0; if(l==r){ tr[x].val=1; return; } int mid=(l+r)/2; build(x*2,l,mid); build(x*2+1,mid+1,r); tr[x].val=(tr[x*2].val*tr[x*2+1].val)%mod; } ll cha(int x,int l,int r){ if(tr[x].l>=l&&tr[x].r<=r) return tr[x].val; int mid=(tr[x].l+tr[x].r)/2; ll ans=1; if(l<=mid) ans*=cha(x*2,l,r); ans%=mod; if(r>=mid+1) ans*=cha(x*2+1,l,r); ans%=mod; return ans; } void chan(int x,int s,ll ke){ if(tr[x].l==tr[x].r){ tr[x].val=ke; return; } int mid=(tr[x].l+tr[x].r)/2; if(s<=mid) chan(x*2,s,ke); if(s>=mid+1) chan(x*2+1,s,ke); tr[x].val=tr[x*2].val*tr[x*2+1].val%mod; } int w[maxn]; ll val[maxn]; int main(){ int t; scanf("%d",&t); for(int jsjs=1;jsjs<=t;jsjs++){ int q; scanf("%d%lld",&q,&mod); build(1,1,q); for(int i=1;i<=q;i++){ scanf("%d%d",&w[i],&val[i]); if(w[i]==1) chan(1,i,val[i]); else chan(1,val[i],1); printf("%lld\n",cha(1,1,i)%mod); } } return 0; }
标签:val,int,题解,ll,tr,mid,maxn,数学计算
来源: https://www.cnblogs.com/wish-all-ac/p/12967378.html
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。