BZOJ5334: [Tjoi2018]数学计算

BZOJ5334: [Tjoi2018]数学计算

https://lydsy.com/JudgeOnline/problem.php?id=5334

分析:

  • 线段树按时间分治即可。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
#define N 100050
#define ls p<<1
#define rs p<<1|1
int mod;
typedef long long ll;
int n,bg[N],ed[N],op[N],xx[N],M;
ll tr[N<<2];
void build(int l,int r,int p) {
	tr[p]=1; 
	if(l==r) return ;
	int mid=(l+r)>>1;
	build(l,mid,ls); build(mid+1,r,rs);
}
void update(int l,int r,int x,int y,int v,int p) {
	if(x<=l&&y>=r) {
		tr[p]=tr[p]*v%mod; return ;
	}
	int mid=(l+r)>>1;
	if(x<=mid) update(l,mid,x,y,v,ls);
	if(y>mid) update(mid+1,r,x,y,v,rs);
}
void dfs(int l,int r,int p,ll now) {
	now=now*tr[p]%mod;
	if(l==r) {printf("%lld\n",now); return ;}
	int mid=(l+r)>>1;
	dfs(l,mid,ls,now); dfs(mid+1,r,rs,now);
}
void solve() {
	scanf("%d%d",&n,&mod);
	int i;
	for(i=1;i<=n;i++) {
		scanf("%d",&op[i]);
		if(op[i]==1) {
			scanf("%d",&xx[i]);
			bg[i]=i, ed[i]=n;
		}else {
			scanf("%d",&xx[i]);
			ed[xx[i]]=i-1;
		}
	}
	build(1,n,1);
	for(i=1;i<=n;i++) {
		if(op[i]==1) {
			update(1,n,bg[i],ed[i],xx[i],1);
		}
	}
	dfs(1,n,1,1);
}
int main() {
	int T;
	scanf("%d",&T);
	while(T--) solve();
}
posted @ 2019-01-06 19:55  fcwww  阅读(157)  评论(0编辑  收藏  举报