Untitled
unknown
plain_text
2 years ago
2.3 kB
21
Indexable
struct soldier
{
int mid, mteam;
soldier *next, *prev;
}s_arr[100002], head[6][6] = { 0 };
void init()
{
for (int i = 1; i <= 5; i++)
{
for (int j = 1; j <= 5; j++)
{
head[i][j] = { 0, 0, &head[i][j], &head[i][j] };
}
}
}
void hire(int mID, int mTeam, int mScore)
{
s_arr[mID].mid = mID;
s_arr[mID].mteam = mTeam;
s_arr[mID].prev = &head[mTeam][mScore];
s_arr[mID].next = head[mTeam][mScore].next;
s_arr[mID].prev->next = s_arr[mID].next->prev = &s_arr[mID];
}
void fire(int mID)
{
s_arr[mID].prev->next = s_arr[mID].next;
s_arr[mID].next->prev = s_arr[mID].prev;
}
void updateSoldier(int mID, int mScore)
{
fire(mID);
hire(mID, s_arr[mID].mteam, mScore);
}
void moveList(int mTeam, int from, int to) {
soldier *src_head = &head[mTeam][from];
soldier *dst_head = &head[mTeam][to];
if (src_head->next != src_head) {
src_head->prev->next = dst_head->next; // connecting tail of src to head of dst
dst_head->next->prev = src_head->prev; // connecting head of dst to tail of src
dst_head->next = src_head->next; // head of dst will be changed to first node of src
dst_head->next->prev = dst_head; // setting up previous pointer first node
src_head->next = src_head->prev = src_head; // empty src as it has been moved to dst
}
}
void updateTeam(int mTeam, int mChangeScore) {
if (mChangeScore < 0) {
for (int from = 2; from <= 5; from++) {
int to = from + mChangeScore;
to = (to > 1) ? to : 1;
moveList(mTeam, from, to);
}
} else if (mChangeScore > 0) {
for (int from = 4; from > 0; from--) {
int to = from + mChangeScore;
to = (to < 5) ? to : 5;
moveList(mTeam, from, to);
}
}
}
int bestSoldier(int mTeam) {
int bid = 0, score = 5;
while (score > 0 && head[mTeam][score].next == &head[mTeam][score])
score--;
for (soldier *ptr = head[mTeam][score].next; ptr != &head[mTeam][score]; ptr = ptr->next) {
if (ptr->mid > bid)
bid = ptr->mid;
}
return bid;
}Editor is loading...
Leave a Comment