Untitled
unknown
plain_text
2 years ago
3.5 kB
12
Indexable
#define N 1000001
//#include <iostream>
//using namespace std;
class Node {
public:
int id;
int team;
Node *next,*prev;
};
Node a[N];
void connect(Node *a,Node *b)
{
a->next = b;
b->prev = a;
}
class LL{
public:
static void erase(Node *node)
{
connect(node->prev, node->next);
}
Node *head,*tail;
LL() {
head= new Node();
tail = new Node();
connect(head, tail);
}
void add(Node *cur)
{
Node *p =tail->prev;
connect(p,cur);
connect(cur, tail);
}
bool isEmpty(){
return head->next == tail;
}
void merge2(LL *link2) {
if(link2->isEmpty())return;
Node *n2 = link2->head->next;
Node *p2 = link2->tail->prev;
Node *p1 = tail->prev;
connect(p1,n2);
connect(p2,tail);
connect(link2->head, link2->tail);
// if (link2->isEmpty())return;
//connect(tail->prev, link2->head->next);
//connect(link2->tail->prev, tail);
//list->initialize();
}
void printAll(){
Node *cur = head->next;
while(cur !=tail)
{
//cout<<cur->id <<" ";
cur = cur->next;
}
//cout<<"\n";
}
};
//khoi tao
LL ll[6][6];
void init()
{
for(int i=1;i<=5;i++)
{
for(int j=1;j<=5;j++){
ll[i][j].head= new Node();
ll[i][j].tail = new Node();
connect(ll[i][j].head, ll[i][j].tail);
}
}
}
// them linh mID , thuoc team mTeam, danh tieng = mScore
void hire(int mID, int mTeam, int mScore)
{
a[mID].id = mID;
a[mID].team = mTeam;
ll[mTeam][mScore].add(a+mID);
//ll[mTeam][mScore].printAll();
}
// loai linh mID
void fire(int mID)
{
LL::erase(a+mID);
//cout<<"xoa "<<mID<<"\n";
}
// sua danh tieng cua linh mID thanh mScore
void updateSoldier(int mID, int mScore)
{
LL::erase(a+mID);
//a[mID].data = mScore;
ll[a[mID].team][mScore].add(a+mID);
//cout<<"sua diem cua "<<mID<<" thanh "<<mScore<<"\n";
}
// sua danh tieng cua team mTeam them mChangeScore ( tu 1=>5)
void updateTeam(int mTeam, int mChangeScore)
{
//cout<<"update team\n";
if(mChangeScore<0){
for(int i=1;i<=5;i++)if(!ll[mTeam][i].isEmpty()){
int u= i + mChangeScore;
if(u>5)u=5;else if(u<1)u=1;
if(u!=i)ll[mTeam][u].merge2(&ll[mTeam][i]);
//cout<<"diem "<<u<<": ";
//ll[mTeam][u].printAll();
}
}else if(mChangeScore>0)
{
for(int i=5;i>=1;i--)if(!ll[mTeam][i].isEmpty()){
int u= i + mChangeScore;
if(u>5)u=5;else if(u<1)u=1;
if(u!=i)ll[mTeam][u].merge2(&ll[mTeam][i]);
//cout<<"diem "<<u<<": ";
//ll[mTeam][u].printAll();
}
}
}
// dua ra id cua linh co danh tieng cao nhat
int bestSoldier(int mTeam)
{
int maxScore=0;
for (int i = 5; i >= 1; i--)
{
if (!ll[mTeam][i].isEmpty())
{
maxScore = i;
break;
}
}
int mID = 0;
if(maxScore){
Node *cur = ll[mTeam][maxScore].head->next;
while (cur != ll[mTeam][maxScore].tail)
{
if (mID < (cur->id))
mID = cur->id;
cur = cur->next;
}
}
//cout<<"best team"<<mTeam<<" la "<<mID<<"\n";
return mID;
}Editor is loading...