Auteur du problème : | Imran AKKI |
Préparé par : | Imran AKKI |
Édité par : | Hasan Saleh (MathModel) |
Solution Le problème revient à obtenir la distance totale parcourue par chaque concurrent et à calculer combien de concurrents ont parcouru strictement plus que Bob.
Simulons la distance totale parcourue pour une vitesse et une diminution de vitesse : à chaque étape, on continue à diminuer d'un multiple de tant que la vitesse reste positive. Formellement, la distance totale sera :
Ici k=\lfloor \frac{s-1}{t} \rfloor, ce qui est la vitesse positive maximale atteignable.
Pour calculer la distance, notez que apparaît k+1 fois et que nous avons (1+2+3+...+k)t comme partie négative, et on sait que 1+2+3+...+k=\frac{k(k+1)}{2}. Ainsi, la distance totale est calculée comme :
Selon cela, calculez la distance pour le i_{ème} concurrent comme d_i, triez les valeurs et comptez combien de concurrents ont couru plus que Bob.
for _ in range(int(input())):
n,b=map(int,input().split())
s=list(map(int,input().split()))
t=list(map(int,input().split()))
a=[]
want=-1
for i in range(n):
x=s[i]
r=(s[i]-1)//t[i]
x+=s[i]*r
v=(r*(r+1))//2
x-=v*t[i]
a.append(x)
if(i+1==b):
want=x
a.sort()
ans=1
for i in range(n-1):
if(a[i]==want and a[i+1]>want):
ans=n-i
break
print(ans)Complexité \mathcal{O}(n \log n).