bzoj5334: [Tjoi2018]数学计算
Posted AKCqhzdy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj5334: [Tjoi2018]数学计算相关的知识,希望对你有一定的参考价值。
这是个悲伤的故事捂脸
噶爷爷安利了到水题,自然而然的被D飞
队长看了一眼说他不会
然而我写T了的时候他过来又看了下说粗略看没啥问题
OZY一眼就说我会nlogn的
结果题意看了20分钟没看懂。。。高兴的吼了起来
tkj:人家都秒了你才看懂题意
哈哈。然而我看懂题意也一眼秒啦。就是线段树把全部记录下来乱搞啊。
结果TLE了。噶爷爷没看出来,就怼怼我线段树模板都错学什么OI啊
l打成1真是没话说。。ORZ zory
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; LL mod; struct seg_tree { int l,r,lc,rc;LL c; }tr[210000];int trlen; void bt(int l,int r) { int now=++trlen; tr[now].l=l;tr[now].r=r;tr[now].c=1; tr[now].lc=tr[now].rc=-1; if(l<r) { int mid=(l+r)/2; tr[now].lc=trlen+1;bt(l,mid); tr[now].rc=trlen+1;bt(mid+1,r); } } void change(int now,int p,LL c) { if(tr[now].l==tr[now].r){tr[now].c=c;return ;} int lc=tr[now].lc,rc=tr[now].rc; int mid=(tr[now].l+tr[now].r)/2; if(p<=mid)change(lc,p,c); else change(rc,p,c); tr[now].c=(tr[lc].c*tr[rc].c)%mod; } LL getmul(int now,int l,int r) { if(tr[now].l==l&&tr[now].r==r){return tr[now].c;} int lc=tr[now].lc,rc=tr[now].rc; int mid=(tr[now].l+tr[now].r)/2; if(r<=mid) return getmul(lc,l,r); else if(mid+1<=l)return getmul(rc,l,r); else return (getmul(lc,l,mid)*getmul(rc,mid+1,r))%mod; } int main() { int T; scanf("%d",&T); while(T--) { int Q; scanf("%d%lld",&Q,&mod); trlen=0;bt(1,Q); int op;LL x; for(int i=1;i<=Q;i++) { scanf("%d%lld",&op,&x); if(op==1)change(1,i,x),printf("%lld\n",getmul(1,1,Q)); else change(1,x,1),printf("%lld\n",getmul(1,1,Q)); } } return 0; }
以上是关于bzoj5334: [Tjoi2018]数学计算的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ5334 [TJOI2018] 数学计算 线段树分治