Robots líderes (recuperación física + pila monótona)

Inserte la descripción de la imagen aquíInserte la descripción de la imagen aquí
Mi pensamiento inicial para esta pregunta es que la aceleración es de pequeña a grande, y luego la posición de la misma aceleración es de pequeña a grande, y luego la complejidad del tiempo de enumeración es n cuadrado. Obviamente no funcionará. Después del final, miré la solución del problema del hermano mayor y luego entendí. . . . . .
Clasificar sigue siendo mi forma de pensar. Pero es realmente difícil pensar en estas dos condiciones cuando se trata de quién se pone al día con quién.
Condiciones:
1. Si la clasificación está por detrás, entonces si su posición es mayor que la del frente, entonces el frente definitivamente no tiene posibilidades de ser el primero.
2. Si hay a, b, c. Entonces, la condición para que c alcance a b es que el tiempo para que b alcance a a debe ser menor que el tiempo para que c alcance a b. Si es mayor o igual que, entonces b ha sido excedido por c antes de alcanzar a a. Entonces, en este momento b no tiene ninguna posibilidad de ser el primero.
¡Entonces esta es la condición!
En la segunda condición, puede usar la fórmula física para resolver, ponerlos en el mismo punto de partida y luego resolver el tiempo:
Inserte la descripción de la imagen aquí
resolver t1, t2 y luego hacer Sa = Sb, Sb = Sc para averiguarlo, de modo que AC Puede ser obtenido.
Es muy difícil pensar en esto. Las condiciones son demasiado detalladas.
Código AC:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; 
const ll maxn=5e4+10;
struct Node{
    
    
	ll x,a;
}ro[maxn];

bool Judge(Node A,Node B,Node C){
    
    
	return (B.x-C.x)*(B.a-A.a)-(C.a-B.a)*(A.x-B.x)<=0;
}
bool cmp(Node A,Node B){
    
    
	if(A.a!=B.a)return A.a<B.a;
	else return A.x<B.x;
}
map<pair<ll,ll>,ll> mp;
ll n,top,Stack[maxn];
int main(){
    
    
	ll T;
	scanf("%lld",&T);
	while(T--){
    
    
		mp.clear();//用来确保不重复的 
		scanf("%lld",&n);
		for(ll i=0;i<n;i++){
    
    
			scanf("%lld %lld",&ro[i].x,&ro[i].a);
			pair<ll,ll> p;
			p.first=ro[i].a;
			p.second=ro[i].x;
	        mp[p]++;	
		}
		sort(ro,ro+n,cmp);
		ll top=0;
		for(ll i=0;i<n;i++){
    
    
			while((top>0&&ro[i].x>=ro[Stack[top]].x)||(top>1&&Judge(ro[Stack[top-1]],ro[Stack[top]],ro[i]))){
    
    //如果top>=0并且ro[i]的位置在顶部元素的后面,那么前面的就不可能得到第一, 
					top--;
			}
			Stack[++top]=i;
		}
		ll ans=top;
		for(ll i=1;i<=top;i++){
    
    	
			pair<ll,ll> p;
			p.first=ro[Stack[i]].a;
			p.second=ro[Stack[i]].x;
			if(mp[p]>1)ans--;
		}
		printf("%lld\n",ans);
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_44555205/article/details/107582680
Recomendado
Clasificación