Untitled

 avatar
unknown
plain_text
a year ago
4.1 kB
6
Indexable
package H2118;

class UserSolution {

	static Person[] listSoildier = new Person[100001];
	static int idSold = 0;

	static Person[][] mapHead = new Person[6][6];
	static Person[][] mapTail = new Person[6][6];

	public void init() {
		listSoildier = new Person[100001];
		idSold = 0;
		for (int team = 1; team <= 5; team++) {
			for (int score = 1; score <= 5; score++) {
				mapHead[team][score] = new Person();
				mapTail[team][score] = new Person();

				mapHead[team][score].next = mapTail[team][score];
				mapTail[team][score].prev = mapHead[team][score];
			}
		}
	}

	void insertFirst(Person solider, int score) {
		solider.next = mapHead[solider.mTeam][score].next;
		solider.prev = mapHead[solider.mTeam][score];
		mapHead[solider.mTeam][score].next.prev = solider;
		mapHead[solider.mTeam][score].next = solider;
	}

	boolean isEmpty(int team, int score) {
		return mapHead[team][score].next == mapTail[team][score];
	}

	public void hire(int mID, int mTeam, int mScore) {
		listSoildier[mID] = new Person(mID, mTeam, mScore);
		insertFirst(listSoildier[mID], mScore);
	}

	public void fire(int mID) {
		// delete(mID, listSoildier[mID].mScore);
		listSoildier[mID].prev.next = listSoildier[mID].next;
		listSoildier[mID].next.prev = listSoildier[mID].prev;

		// size[listSoildier[mID].mTeam][listSoildier[mID].mScore]--;
		listSoildier[mID].mID = -1;
		listSoildier[mID].mTeam = -1;
		listSoildier[mID].mScore = -1;
	}

	public void updateSoldier(int mID, int mScore) {
		listSoildier[mID].prev.next = listSoildier[mID].next;
		listSoildier[mID].next.prev = listSoildier[mID].prev;
		listSoildier[mID].mScore = mScore;

		insertFirst(listSoildier[mID], mScore);
	}

	public void updateTeam(int mTeam, int mChangeScore) {
		if (mChangeScore > 0) {
			for (int i = 1; i <= mChangeScore; i++) {
				int scoreGroup = 4;
				while (scoreGroup >= 1) {
					if (mapHead[mTeam][scoreGroup].next == mapTail[mTeam][scoreGroup]) {
						scoreGroup--;
						continue;
					}
					mapHead[mTeam][scoreGroup].next.prev = mapTail[mTeam][scoreGroup + 1].prev;
					mapTail[mTeam][scoreGroup + 1].prev.next = mapHead[mTeam][scoreGroup].next;

					mapTail[mTeam][scoreGroup].prev.next = mapTail[mTeam][scoreGroup + 1];
					mapTail[mTeam][scoreGroup + 1].prev = mapTail[mTeam][scoreGroup].prev;

					// reset rong
					mapHead[mTeam][scoreGroup].next = mapTail[mTeam][scoreGroup];
					mapTail[mTeam][scoreGroup].prev = mapHead[mTeam][scoreGroup];

					scoreGroup--;
				}
			}
		} else if (mChangeScore < 0) {
			for (int i = 1; i <= (-mChangeScore); i++) {
				int scoreGroup = 2;
				while (scoreGroup <= 5) {
					if (mapHead[mTeam][scoreGroup].next == mapTail[mTeam][scoreGroup]) {
						scoreGroup++;
						continue;
					}
					mapTail[mTeam][scoreGroup - 1].prev.next = mapHead[mTeam][scoreGroup].next;
					mapHead[mTeam][scoreGroup].next.prev = mapTail[mTeam][scoreGroup - 1].prev;

					mapTail[mTeam][scoreGroup].prev.next = mapTail[mTeam][scoreGroup - 1];
					mapTail[mTeam][scoreGroup - 1].prev = mapTail[mTeam][scoreGroup].prev;

					// reset rong
					mapHead[mTeam][scoreGroup].next = mapTail[mTeam][scoreGroup];
					mapTail[mTeam][scoreGroup].prev = mapHead[mTeam][scoreGroup];

					scoreGroup++;
				}
			}
		}

	}

	public int bestSoldier(int mTeam) {
		int id = -1;
		for (int i = 5; i >= 1; i--) {
			id = -1;
			Person head = mapHead[mTeam][i];
			Person tail = mapTail[mTeam][i];

			Person temp = head;
			while (temp != null && temp.next != tail) {
				temp = temp.next;
				if (id < temp.mID) {
					id = temp.mID;
				}
			}
			if (id != -1) {
				return id;
			}
		}

		return id;
	}
}

class Person {
	int mTeam;
	int mScore;
	int mID;

	Person next;
	Person prev;

	public Person() {
		super();
		mID = -1;
		mTeam = -1;
		mScore = -1;
		next = prev = null;
	}

	public Person(int ID, int mTeam, int mScore) {
		super();
		this.mID = ID;
		this.mTeam = mTeam;
		this.mScore = mScore;
		next = prev = null;
	}
}
Editor is loading...
Leave a Comment