Untitled
unknown
plain_text
a year ago
2.8 kB
10
Indexable
#include <iostream>
#include <vector>
#include <set>
using namespace std;
struct Solider {
int id, score, team;
Solider(int id = 0, int score = 0) : id(id), score(score) {}
// To use 'find' in set, we need to compare only by id.
bool operator<(const Solider& other) const {
return id < other.id;
}
};
Solider soliders[100001];
struct cmp {
bool operator()(const Solider &a, const Solider &b) const {
if (a.score == b.score) {
return a.id < b.id; // Sorting by id in ascending order if score is equal
}
return a.score > b.score; // Sorting by score in descending order
}
};
set<Solider, cmp> team[6]; // Teams from 1 to 5
void init() {
for (int i = 1; i <= 100000; i++) {
soliders[i] = Solider(); // Reset all soldiers
}
for (int i = 1; i <= 5; i++) {
team[i].clear(); // Clear all teams
}
}
void hire(int mID, int mTeam, int mScore) {
soliders[mID] = Solider(mID, mScore);
soliders[mID].team = mTeam;
team[mTeam].insert(soliders[mID]); // Insert soldier into the team
}
void fire(int mID) {
int t = soliders[mID].team;
if (t == 0) return; // Soldier is not in any team
auto it = team[t].find(soliders[mID]);
if (it != team[t].end()) {
team[t].erase(it); // Erase the soldier from the team
}
soliders[mID] = Solider(); // Reset the soldier
}
void updateSoldier(int mID, int mScore) {
int t = soliders[mID].team;
if (t == 0) return; // Soldier is not in any team
auto it = team[t].find(soliders[mID]);
if (it != team[t].end()) {
team[t].erase(it); // Erase the old record
}
soliders[mID].score = mScore; // Update soldier's score
team[t].insert(soliders[mID]); // Insert the updated record
}
void updateTeam(int mTeam, int mChangeScore) {
vector<Solider> updatedSoldiers; // Temporary vector to store updated soldiers
for (auto it = team[mTeam].begin(); it != team[mTeam].end(); ++it) {
int newScore = it->score + mChangeScore;
if (newScore > 5) newScore = 5;
if (newScore < 1) newScore = 1;
// Update soldier score and push to temporary vector
Solider updatedSolider = *it;
updatedSolider.score = newScore;
updatedSoldiers.push_back(updatedSolider);
// Update the global soldier record
soliders[updatedSolider.id].score = newScore;
}
team[mTeam].clear(); // Clear the team set
for (const auto& solider : updatedSoldiers) {
team[mTeam].insert(solider); // Reinsert updated soldiers
}
}
int bestSoldier(int mTeam) {
if (team[mTeam].empty()) return -1; // No soldier in the team
return team[mTeam].begin()->id; // The first soldier has the highest score
}
Editor is loading...
Leave a Comment