SCOI2018 ABNS

ABNS

【Descripción del título】

ABNS vive en un universo de diferentes dimensiones en el que todos pueden viajar libremente, y el tiempo de este universo satisface una estructura peculiar. Las personas pueden desplazarse libremente a cualquier punto de tiempo anterior, y se genera una nueva línea de tiempo a partir de este punto de tiempo. Obviamente, esta es una estructura de árbol. Para gestionar convenientemente el comportamiento de cada ciudadano en el viaje en el tiempo, se establece una agencia de gestión del tiempo y el espacio separada de la línea de tiempo. La agencia de gestión del tiempo y el espacio es responsable de ayudar a los ciudadanos en el viaje en el tiempo y registrar el árbol de viaje en el tiempo de cada ciudadano Habrá un índice de índice único, que indica el orden de creación del nodo. Es decir, para cada nuevo evento, la Administración de espacio-tiempo creará un nuevo nodo de tiempo para el personal relevante.

La gente de allí es muy aficionada a tomar bebidas. Hay muchas bebidas en una tienda de bebidas. Una bebida está representada por tres parámetros, a representa el contenido de calorías, b representa el costo yc representa la delicia. (Todo por unidad de volumen, la cantidad total de cada bebida es ilimitada)

A veces, ABNS es codicioso y quiere comprar algunas bebidas con sabor mixto, pero tiene un control estricto sobre los indicadores, es decir, las calorías (contenido calórico total) no pueden exceder A, el costo no puede exceder B, y la bebida con sabor mixto es la más deliciosa.

Como ABNS es una persona muy exigente, cada vez que compra una bebida, el indicador cambia. Al mismo tiempo, para satisfacer las necesidades de tantos clientes como sea posible, la tienda de bebidas agregará una bebida en algún momento. Finalmente, ABNS puede optar por cruzar a otro punto de tiempo en el punto de tiempo actual.

【Formato de entrada】

Un número entero n en la primera línea representa un total de n eventos.
En las siguientes n líneas, hay un evento por línea, y el evento es uno de los siguientes tres (establecemos la respuesta de los últimos 2 eventos a lastanes, que es 0 al principio):

  1. agregar abc significa que la tienda de bebidas tiene una bebida con calorías por unidad de volumen, costo y delicia de a lastanes, b lastanes y c ^ lastanes.
  2. compre AB, lo que significa que el índice de sabor de ABNS para comprar bebidas es A lastanes y B lastanes. (Garantía de que hay bebidas para comprar en este momento)
  3. índice de retorno significa que, debido al viaje en el tiempo de ABNS, el tiempo salta después del índice de eventos ^ lastans (los eventos están numerados del 1) (asegúrese de que el índice ^ lastans sea un evento determinado antes de esto).

El símbolo ^ anterior indica el XOR bit a bit en c ++.

【Formato de salida】

Para cada segunda operación, se emite el sabor más delicioso de la bebida con sabor mixto (redondeado a un entero, y los datos garantizan que la respuesta está dentro de int, y lastans es un entero después del redondeo).

【Entrada de muestra】

4
agregar 1 3 1
agregar 2 2 1
agregar 3 1 1
comprar 2 3

[Salida de muestra]

1

[Descripción de la muestra]

Una forma legal de comprar bebidas es (0.75, 0.25, 0.25), es decir, la primera bebida compra 0.75 volúmenes, la segunda y tercera compra 0.25 volúmenes, la respuesta es 1.25 en este momento, redondeada a 1.

【Rango de datos y acuerdo】

Punto de prueba 1: n <= 100, a, b, A, B <= 33000, a = b
punto de prueba 2: n <= 100, a, b, A, B <= 33000, a = b
punto de prueba 3: n <= 100, a, b, A, B <= 33000, A = B
punto de prueba 4: n <= 100, a, b, A, B <= 33000, A = B
punto de prueba 5: n <= 500 , A, b, A, B <= 33000, par de datos a, b, A, B
punto de prueba aleatorio 6: n <= 500, a, b, A, B <= 33000
punto de prueba 7: n <= 5000, a, b, A, B <= 660000, par de datos a, b, A, B
punto de prueba aleatorio 8: n <= 5000, a, b, A, B <= 660000
punto de prueba 9: n <= 100000, a , B, A, B <= 33000000, par de datos aleatorios a, b, A, B
Punto de prueba 10: n <= 100000, a, b, A, B <= 33000000, datos aleatorios a, b, A, B
Punto de prueba 11: n <= 100000, a, b, A, B <= 33000000, sin evento 3
punto de prueba 12: n <= 100000, a, b, A, B <= 33000000, sin evento 3
punto de prueba 13: n <= 100000, a, b, A, B <= 33000000, sin evento 3
punto de prueba 14: n <= 100000, a, b, A, B <= 33000000, sin evento 3
punto de prueba 15: n <= 100000 , A, b, A, B <= 33000000
punto de prueba 16: n <= 100000, a, b, A, B <= 33000000
Punto de prueba 17: n <= 100000, a, b, A, B <= 33000000
punto de prueba 18: n <= 100000, a, b, A, B <= 33000000
punto de prueba 19: n <= 100000, a, b , A, B <= 33000000
punto de prueba 20: n <= 100000, a, b, A, B <= 33000000
todos los datos c <= 1000, asegúrese de que la entrada sea un número entero positivo.
Los puntos de datos 1 y 2 en la carpeta del reproductor cumplen los puntos de prueba 5 y 9 respectivamente.

Solución

https://blog.csdn.net/Izumi_Hanako/article/details/79834054

Esta pregunta es realmente similar a la aleación [JSOI2007].

Primero, estandarizamos todas las bebidas de acuerdo con \ (a \) . Es decir, lo que originalmente era \ ((a, b, c) \) , ahora se convierte en \ ((1, \ frac ba, \ frac ca) \) , que es equivalente al problema original después de la conversión. (Lo siguiente está estandarizado por defecto)

Luego dibuje todos los puntos en el sistema de coordenadas de acuerdo con \ ((x = \ frac ba, y = \ frac ca) \) . Se puede encontrar que las bebidas útiles forman un orden parcial bidimensional, como se muestra en la figura a continuación,

esos puntos enmarcados por rectángulos no son óptimos, como los puntos cruzados en la figura

Luego descubrimos que debido a que la bebida se puede mezclar, si un punto está por debajo de la conexión de los otros dos puntos, entonces este punto no es excelente.

Debido a que cada punto en esta imagen representa una bebida, todas las bebidas en la línea se pueden juntar. Entonces el mismo costo es definitivamente una gran contribución


Entonces se vuelve así, los puntos que se cruzan no son excelentes

En este momento, de hecho, hemos obtenido un casco convexo superior cuyas coordenadas horizontales y verticales solo aumentan, y las mejores bebidas están todas en el casco convexo.

Luego, para una consulta \ (A, B \) , en este momento seleccionamos el punto donde la abscisa en el casco convexo es \ (\ frac BA \) , que es definitivamente óptima.

¿Qué sucede si \ (\ frac BA \) es menor que la abscisa del punto más a la izquierda o mayor que la abscisa del punto más a la derecha? En el casco convexo, debe agregar el origen \ ((0,0) \) y el punto infinito \ ((\ infty, y_ {max}) \) .

Luego mantenga el casco convexo dinámico persistente (problema del tumor humano), para que este problema se resuelva perfectamente.

Pero la persona que creó la pregunta no la forzó en línea ... así que, de hecho, no necesita ser persistente, solo deshaga la operación en el árbol. Poner el código de violencia primero

struct node {float128 x,y;};
IN bool operator<(CO node&a,CO node&b){
	return a.x!=b.x?a.x<b.x:a.y<b.y;
}
IN node operator-(CO node&a,CO node&b){
	return (node){a.x-b.x,a.y-b.y};
}
IN float128 cross(CO node&a,CO node&b){
	return a.x*b.y-a.y*b.x;
}

CO int N=1e5+10;
struct event {int o;float128 x,y;} que[N];
vector<int> to[N];
float128 ans[N];
set<node> conv;

void solve(int x){
//	cerr<<x<<endl;
	vector<node> stk;
	bool flag=0;
	if(que[x].o==1 and !conv.count((node){que[x].x,que[x].y})){
		node p=(node){que[x].x,que[x].y};
		conv.insert(p),flag=1;
		node l=*--conv.find(p),r=*++conv.find(p);
		if(cross(p-l,r-l)>=0) conv.erase(p),flag=0;
		else{
			while(1){
				set<node>::iterator i=conv.find(p);
				if(++i==conv.end()) break;
				node r1=*i;
				if(++i==conv.end()) break;
				node r2=*i;
				if(cross(r1-p,r2-p)>=0) conv.erase(r1),stk.push_back(r1);
				else break;
			}
			while(1){
				set<node>::iterator i=conv.find(p);
				if(i==conv.begin()) break;
				node l1=*--i;
				if(i==conv.begin()) break;
				node l2=*--i;
				if(cross(l1-p,l2-p)<=0) conv.erase(l1),stk.push_back(l1);
				else break;
			}
		}
	}
	else if(que[x].o==2){
		node p=(node){que[x].x,0};
		conv.insert(p);
		node l=*--conv.find(p),r=*++conv.find(p);
		if(r.x==1e9) r.y=l.y;
		ans[x]=(r.y-l.y)/(r.x-l.x)*(p.x-l.x)+l.y;
		ans[x]*=que[x].y;
		conv.erase(p);
	}
	for(int i=0;i<(int)to[x].size();++i) solve(to[x][i]);
	if(que[x].o==1 and flag){
		conv.erase((node){que[x].x,que[x].y});
		for(int i=0;i<(int)stk.size();++i) conv.insert(stk[i]);
	}
}
int main(){
	freopen("ABNS.in","r",stdin),freopen("ABNS.out","w",stdout);
	int n=read<int>();
	que[0].o=0;
	for(int i=1;i<=n;++i){
		char opt[10];scanf("%s",opt);
		if(opt[0]=='a'){
			que[i].o=1;
			float128 a=read<int>(),b=read<int>(),c=read<int>();
			que[i].x=b/a,que[i].y=c/a;
			to[i-1].push_back(i);
		}
		else if(opt[0]=='b'){
			que[i].o=2;
			float128 A=read<int>(),B=read<int>();
			que[i].x=B/A,que[i].y=A;
			to[i-1].push_back(i);
		}
		else{
			que[i].o=0;
			to[read<int>()].push_back(i);
		}
	}
	conv.insert((node){0,0});
	conv.insert((node){1e9,0});
	solve(0);
	for(int i=1;i<=n;++i)if(que[i].o==2)
		printf("%.9Lf\n",ans[i]);
	return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/autoint/p/10541999.html
Recomendado
Clasificación