Untitled
unknown
plain_text
2 years ago
6.3 kB
3
Indexable
#define MAX_USER_ID 100001 #define MAX_NEWS 50001 #define MAX_SECTION 10 typedef struct News { int Score; int Section; int Id; int HeapPos; int ClubbedScore; }; News news[MAX_NEWS]; News* newsPtr[MAX_NEWS]; News* HeapArray[MAX_SECTION][MAX_NEWS]; int HeapSize[MAX_SECTION]; int UserIDMap[MAX_USER_ID]; void init() { //register int n = 2500100001; for (register int i = 0; i < MAX_SECTION; i++) { HeapSize[i] = 0; } for (register int i = 0; i < MAX_USER_ID; i++) { UserIDMap[i] = -1; } } void HeapifyUp(News* heapArray[], register int section, register int upPos) { register int Child = upPos; register int Parent = (Child - 1) / 2; register int tempPos; News* tempPtr; while (heapArray[Parent]->ClubbedScore < heapArray[Child]->ClubbedScore) { tempPos = heapArray[Parent]->HeapPos; heapArray[Parent]->HeapPos = heapArray[Child]->HeapPos; heapArray[Child]->HeapPos = tempPos; tempPtr = heapArray[Parent]; heapArray[Parent] = heapArray[Child]; heapArray[Child] = tempPtr; Child = Parent; Parent = (Child - 1) / 2; } } void HeapifyDown(News* heapArray[], register int section, register int DownPos) { register int Size = HeapSize[section]; register int Parent = DownPos; register int Max; register int tempPos; News* tempPtr; register int LC; register int RC; while (1) { LC = 2 * Parent + 1; RC = LC + 1; Max = Parent; if (LC < Size && (heapArray[Max]->ClubbedScore < heapArray[LC]->ClubbedScore )) { Max = LC; } if (RC < Size && (heapArray[Max]->ClubbedScore < heapArray[RC]->ClubbedScore )) { Max = RC; } if (Max != Parent) { tempPos = heapArray[Parent]->HeapPos; heapArray[Parent]->HeapPos = heapArray[Max]->HeapPos; heapArray[Max]->HeapPos = tempPos; tempPtr = heapArray[Parent]; heapArray[Parent] = heapArray[Max]; heapArray[Max] = tempPtr; Parent = Max; } else { break; } } } void Insert(News* heapArray[], News* ptr, register int section) { register int size = HeapSize[section]; ptr->HeapPos = HeapSize[section]; heapArray[size] = ptr; if (size == 0) { HeapSize[section]++; return; } HeapifyUp(heapArray, section, size); HeapSize[section]++; } void Erase(News* heapArray[], register int section, register int pos) { register int size = --HeapSize[section]; heapArray[size]->HeapPos = heapArray[pos]->HeapPos; heapArray[pos] = heapArray[size]; if (size == 1) return; HeapifyUp(heapArray, section, pos); HeapifyDown(heapArray, section, pos); } void addNews(register int sec, register int id) { //prregister intf("addNews sec = %d id = %d\n", sec, id); News* ptr = &news[id]; ptr->Id = id; ptr->Score = 0; ptr->ClubbedScore = id; ptr->Section = sec; newsPtr[id] = ptr; Insert(HeapArray[sec], ptr, sec); } void eraseNews(register int id) { ////prregister intf("eraseNews id = %d\n", id); News* ptr = newsPtr[id]; register int sec = ptr->Section; Erase(HeapArray[sec], sec, ptr->HeapPos); } void readNews(register int uid, register int id) { News* ptr = newsPtr[id]; register int section = ptr->Section; //prregister intf("readNews sec = %d id = %d uid = %d\n", section, id, uid); UserIDMap[uid] = section; ptr->Score++; ptr->ClubbedScore = ptr->Score * MAX_NEWS + id; HeapifyUp(HeapArray[section], section, ptr->HeapPos); HeapifyDown(HeapArray[section], section, ptr->HeapPos); } void changeSection(register int id, register int sec) { News* ptr = &news[id]; eraseNews(id); //prregister intf("changeSection from sec = %d to sec = %d id = %d \n", ptr->Section, sec, id); ptr->Section = sec; Insert(HeapArray[sec], ptr, sec); } typedef struct Info { int sec; int id; int pos; }; int getList(register int uid, register int mList[]) { //prregister intf("getList uid = %d \n", uid); Info info[21]; Info temp; register int CurrentIndex = 0; register int counter = 0; Info* currentInfo; for (register int i = 0; i < 10; i++) { if (HeapSize[i] > 0) { currentInfo = &info[CurrentIndex]; currentInfo->id = HeapArray[i][0]->Id; currentInfo->pos = 0; currentInfo->sec = i; CurrentIndex++; } } register int UserSec = UserIDMap[uid]; for (register int i = 0; i < 10; i++) { register int index = -1; register int maxScore = -65535; register int id = -1; register int score; for (register int j = 0; j < CurrentIndex; j++) { score = HeapArray[info[j].sec][info[j].pos]->ClubbedScore; if (UserSec == info[j].sec) { score += 10 * MAX_NEWS; } if (score > maxScore ) { index = j; maxScore = score; } } if (index == -1) break; id = info[index].id; CurrentIndex--; temp = info[index]; info[index] = info[CurrentIndex]; mList[counter++] = id; register int LC = 2 * temp.pos + 1; register int RC = LC + 1; if (RC < HeapSize[temp.sec]) { currentInfo = &info[CurrentIndex]; currentInfo->id = HeapArray[temp.sec][RC]->Id; currentInfo->pos = RC; currentInfo->sec = temp.sec; CurrentIndex++; } if (LC < HeapSize[temp.sec]) { currentInfo = &info[CurrentIndex]; currentInfo->id = HeapArray[temp.sec][LC]->Id; currentInfo->pos = LC; currentInfo->sec = temp.sec; CurrentIndex++; } } return counter; }
Editor is loading...