+ Pensamiento árbol Segmento [TJOI2018] Matemáticas (Valle de Los P4588)

[TJOI2018] matemáticas

título Descripción

Hay una serie de adzuki x, Q tiene un valor inicial de 1. Las operaciones de adzuki, hay dos tipos de operaciones:

1 m: x = x × m salida x% mod;

2 Pos: x = x / número de veces de pos operación multiplicado (operaciones de punto de venta deben asegurarse de que el primer tipo 1, tipo 1 para la operación de cada otro será como máximo una vez) de salida x% mod;

Formato de entrada

Hay un conjunto de entrada t (t≤5);

Para cada conjunto de entrada, la primera línea es dos números Q, mod (Q≤100000, mod≤100000000);

Siguiente líneas Q, cada op comportamiento tipo de operación, el número de operación o el número se multiplica m (para asegurar que todas las entradas son válidas).

Formato de salida

Para cada operación, la fila de salida contiene el valor x% operación mod realiza después de


A primera vista pensé que era un título de simulación de ruta, una mirada más cercana se encuentra que longlong ráfaga, entonces pensé que era un problema de matemáticas;

De hecho, se puede llevar a cabo su árbol segmento, línea de árboles línea de productos intervalo de mantenimiento, cuando pos = 2, un solo punto de la modificación de la línea;

En muchos casos como este, el pensamiento es más importante que el algoritmo;

código:

#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,int>
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int N=100100;
const int M=2000100;
LL mod,m;
struct Node{
	int l,r;
	LL w;	
}tr[N*4];
void build(int l,int r,int k){
	tr[k].l=l,tr[k].r=r;
	if(l==r){
		tr[k].w=1;
		return;
	}
	int d=(l+r)>>1;
	build(l,d,ls);
	build(d+1,r,rs);
	(tr[k].w=tr[ls].w*tr[rs].w)%=mod;
}
void update(int pos,LL val,int k){
	if(tr[k].l==tr[k].r){
		tr[k].w=val;
		return;
	}
	int d=(tr[k].l+tr[k].r)>>1;
	if(pos<=d) update(pos,val,ls);
	else update(pos,val,rs);
	(tr[k].w=tr[ls].w*tr[rs].w)%=mod;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		int q;
		cin>>q>>mod;
		build(1,q,1);
		for(int i=1;i<=q;i++){
			int op;
			scanf("%d%lld",&op,&m);
			if(op==1){
				update(i,m,1);
				printf("%lld\n",tr[1].w);
			}
			else{
				update(m,1,1);
				printf("%lld\n",tr[1].w);
			}
		}
	}	
	return 0;
}
Publicados 264 artículos originales · alabanza won 46 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/qq_44291254/article/details/105316480
Recomendado
Clasificación