rendered paste body#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <climits>
#include <cmath>
using namespace std;
struct Balle {
float vitesse;
float position;
int numero;
bool collided;
};
struct Scenario {
std::vector<Balle> balles;
int trackedBall_i;
int temps;
};
struct Collision {
Collision(int &a, int &b): b1(a), b2(b) {}
int b1, b2;
};
bool sortByPosition (Balle i, Balle j) { return (i.position<j.position); }
struct CollisionRange
{
int startIndex;
vector<int> indexRange;
};
float detectCollision(Balle b1, Balle b2)
{
if(b1.vitesse == b2.vitesse)
return -1;
if(b1.position == 0 || b2.position == b2.vitesse)
return -1;
if(b1.position > b2.position && b1.vitesse > 0 && b2.vitesse < 0)
return -1;
if(b1.position < b2.position && b1.vitesse < 0 && b2.vitesse > 0)
return -1;
return (float)((b2.position - b1.position) / (b1.vitesse - b2.vitesse));
}
void swap(Balle& b1, Balle& b2)
{
float temp = b1.position;
b1.position = b2.position;
b2.position = temp;
temp = b1.vitesse;
b1.vitesse = b2.vitesse;
b2.vitesse = temp;
}
void fastForward(Scenario& s, float time)
{
for(int i = 0; i < (int)s.balles.size(); ++i)
{
s.balles[i].position += s.balles[i].vitesse * time;
if(s.balles[i].position >= 100)
{
s.balles[i].position = 100;
s.balles[i].vitesse = 0;
}
if(s.balles[i].position <= 0)
{
s.balles[i].position = 0;
s.balles[i].vitesse = 0;
}
}
}
void solve(Scenario& s) {
sort(s.balles.begin(), s.balles.end(), sortByPosition);
float timeLeft = s.temps;
while(timeLeft > 0)
{
vector<int> collisions;
float timeTillCollision = 100000000;
for(int i = 0; i < (int)s.balles.size()-1; ++i)
{
float tempTime = detectCollision(s.balles[i], s.balles[i+1]);
if(tempTime > 0 && tempTime < timeTillCollision)
{
timeTillCollision = tempTime;
collisions.clear();
}
if(fabs(tempTime - timeTillCollision) < 0.00000000001)
{
collisions.push_back(i);
}
}
if(timeTillCollision > timeLeft)
{
timeTillCollision = timeLeft;
collisions.clear();
}
if(collisions.size() > 0 )
{
fastForward(s, (timeTillCollision));
for(int i = 0; i < (int)collisions.size(); ++i)
swap(s.balles[collisions[i]], s.balles[collisions[i]+1]);
timeLeft -= timeTillCollision;
collisions.clear();
}
else
{
fastForward(s, timeLeft);
timeLeft = 0;
}
}
for(int i = 0; i < (int)s.balles.size(); ++i)
{
if(s.balles[i].numero == s.trackedBall_i)
{
cout << (int)floor(s.balles[i].position+0.5);
}
}
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
Scenario scenario;
int nbBalles;
cin >> nbBalles;
for (int j = 0; j < nbBalles; j++) {
Balle balle;
cin >> balle.position >> balle.vitesse;
balle.numero = j + 1;
if(balle.position >= 100)
{
balle.vitesse = 0;
balle.position = 100;
}
if(balle.position <= 0)
{
balle.vitesse = 0;
balle.position = 0;
}
scenario.balles.push_back(balle);
}
cin >> scenario.trackedBall_i >> scenario.temps;
solve(scenario);
cout << endl;
}
return 0;
}