rendered paste body#include <iostream>
#include <stdio.h>
#include <vector>
#include <climits>
using namespace std;
struct Balle {
int vitesse;
int position;
int numero;
};
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;
};
int detectCollision(Balle b1, Balle b2)
{
if(b1.vitesse == 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;
if (((b2.position - b1.position) % (b1.vitesse - b2.vitesse)) == 0) {
return (b2.position - b1.position) / (b1.vitesse - b2.vitesse);
} else {
return ((b2.position - b1.position) / (b1.vitesse - b2.vitesse)) + 1;
}
}
void handleCollision(Collision c, int temps, Scenario& s)
{
int numero = s.balles[c.b1].numero;
s.balles[c.b1].numero = s.balles[c.b2].numero;
s.balles[c.b2].numero = numero;
}
void solve(Scenario& s) {
while(s.temps > 0)
{
int shortestTimeToCollision = INT_MAX;
vector<Collision> listUpdate;
for(int b1 = 0; b1 < (int)s.balles.size() - 1; ++b1)
{
for(int b2 = b1+1; b2 < (int)s.balles.size(); ++b2)
{
int tempTime = detectCollision(s.balles[b1], s.balles[b2]);
if(tempTime > 0 && tempTime < shortestTimeToCollision)
{
shortestTimeToCollision = tempTime;
listUpdate.clear();
}
if(tempTime == shortestTimeToCollision)
{
listUpdate.push_back(Collision(b1, b2));
}
}
}
if (shortestTimeToCollision > s.temps)
{
shortestTimeToCollision = s.temps;
listUpdate.clear();
}
for(int i = 0; i < (int)listUpdate.size(); ++i)
{
handleCollision(listUpdate[i], shortestTimeToCollision, s);
}
for(int i = 0; i < (int)s.balles.size(); ++i)
{
s.balles[i].position += s.balles[i].vitesse * shortestTimeToCollision;
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 = 100;
s.balles[i].vitesse = 0;
}
}
s.temps -= shortestTimeToCollision;
}
for(int i = 0; i < (int)s.balles.size(); ++i)
{
if(s.balles[i].numero == s.trackedBall_i)
{
cout << s.balles[i].position;
}
}
}
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.position <= 0)
balle.vitesse = 0;
scenario.balles.push_back(balle);
}
cin >> scenario.trackedBall_i >> scenario.temps;
solve(scenario);
if (i != (n-1)) cout << endl;
}
return 0;
}