Untitled
unknown
plain_text
a year ago
5.0 kB
6
Indexable
#define MAXL (10) #define max_U 10//10005 #define max_M 50//50005 #include<unordered_map> #include<set> #include<string> #include<vector> #include<iostream> using namespace std; struct mess { int id; int point; int par; int root_p; bool isDel; int uID; //mess(int _id, int _point, int _par, int _root, int _uID, bool _isDel) //{ // id = _id; // point = _point; // par = _par; // root_p = _root; // uID = _uID; // isDel = _isDel; //} }; struct U { string name; int point; }; struct comM { bool operator()(mess a, mess b) { if(a.point == b.point) return a.id < b.id; return a.point > b.point; } }; struct comU { bool operator()(U a, U b) { if(a.point == b.point) return a.name < b.name; return a.point > b.point; } }; mess poolMess[max_M]; U poolUser[max_U]; set<U, comU> sortUser; set<mess, comM> sortMess; unordered_map<string, int> hashName; unordered_map<int, int> hashID; vector<mess> storeChill[max_M]; int userID, meID; void init() { sortMess.clear(); sortUser.clear(); hashName.clear(); hashID.clear(); userID = meID = 0; return; } int check_User(char *str, int uPoint) { if (hashName.find(str) == hashName.end()) { hashName[str] = userID; // create new user poolUser[userID].name = str; poolUser[userID].point = 0; userID++; } int id = hashName[str]; // increase the point of user sortUser.erase(poolUser[id]); // update point in tree set of user poolUser[id].point += uPoint; sortUser.insert(poolUser[id]); return id; } void write_mess(int _id, int _point, int _par, int _root, int _uID, bool _isDel, int wid) { poolMess[wid].id = _id; poolMess[wid].point = _point; poolMess[wid].par = _par; poolMess[wid].root_p = _root; poolMess[wid].uID = _uID; poolMess[wid].isDel = _isDel; } int writeMessage(char mUser[], int mID, int mPoint) { int Uid = check_User(mUser, mPoint); // User side // message side hashID[mID] = meID; write_mess(mID, mPoint, -1, mPoint, Uid, false, meID); // create new message storeChill[meID].clear(); // prepare to store chill sortMess.insert(poolMess[meID]); // tree set message meID++; cout << poolUser[Uid].point << endl; return poolUser[Uid].point; } int findpath(int id) { int pid = id; while (poolMess[pid].par != -1) { pid = poolMess[pid].par; } return pid; } int commentTo(char mUser[], int mID, int mTargetID, int mPoint) { int Uid = check_User(mUser, mPoint); // mess side int parID = hashID[mTargetID]; // get par int RootId = findpath(parID); // search root mess sortMess.erase(poolMess[RootId]); // update root mess in tree set poolMess[RootId].point += mPoint; sortMess.insert(poolMess[RootId]); hashID[mID] = meID; write_mess(mID, mPoint, parID, mPoint, Uid, false, meID); // create new mess/ comment/ replies storeChill[parID].push_back(poolMess[meID]); // add chill for parent node storeChill[meID].clear(); // prepare for new chil meID++; cout << poolMess[RootId].point << endl; return poolMess[RootId].point; } void delete_chil(int Mid, int Root) { for(auto it : storeChill[Mid]) { int deUid = hashID[it.id]; if (!it.isDel) { int userID_del = poolMess[deUid].uID; // user sortUser.erase(poolUser[userID_del]); poolUser[userID_del].point -= poolMess[deUid].root_p; sortUser.insert(poolUser[userID_del]); // mess poolMess[deUid].isDel = true; poolMess[Root].point -= poolMess[deUid].root_p; delete_chil(deUid, Root); } } } int erase(int mID) { int mesID = hashID[mID]; int RootId = findpath(mesID); int userID_er = poolMess[mesID].uID; // mess sortMess.erase(poolMess[RootId]); // delete child delete_chil(mesID, RootId); poolMess[mesID].isDel = true; poolMess[RootId].point -= poolMess[mesID].root_p; sortMess.insert(poolMess[RootId]); // user sortUser.erase(poolUser[userID_er]); poolUser[userID_er].point -= poolMess[mesID].root_p; sortUser.insert(poolUser[userID_er]); if (poolMess[mesID].par == -1) { cout << poolUser[userID_er].point << endl; return poolUser[userID_er].point; } cout << poolMess[RootId].point << endl; return poolMess[RootId].point; } void getBestMessages(int mBestMessageList[]) { int i = 0; for(auto it : sortMess) { mBestMessageList[i] = it.id; i++; if(i >= 5) break; } for (int i = 0; i < 5; i++) { cout << mBestMessageList[i] << " "; } cout << endl; return; } void getBestUsers(char mBestUserList[][MAXL + 1]) { int i = 0; for (auto it : sortUser) { int j = 0; for(; j < it.name.size(); j++) { mBestUserList[i][j] = it.name[j]; } mBestUserList[i][j] = '\0'; i++; if(i >= 5) break; } for (int i = 0; i < 5; i++) { int j = 0; while (mBestUserList[i][j] != '\0') { cout << mBestUserList[i][j]; j++; } cout << " "; } cout << endl; return; }
Editor is loading...
Leave a Comment