Untitled
unknown
plain_text
2 years ago
5.4 kB
5
Indexable
--------------------MAIN--------------------- #ifndef _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS #endif #include <stdio.h> #define ADDNEWS (100) #define ERASENEWS (200) #define READNEWS (300) #define CHANGESECTION (400) #define GETLIST (500) extern void init(); extern void addNews(int mSection, int mNewsId); extern void eraseNews(int mNewsId); extern void readNews(int mUserId, int mNewsId); extern void changeSection(int mNewsId, int mSection); extern int getList(int mUserId, int mList[]); ///////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// static int run() { int N; int cmd; int mSection, mUserId; int mNewsId; int res[10]; init(); int retVal = 1; scanf("%d", &N); for (int i = 0; i < N; ++i) { scanf("%d", &cmd); switch (cmd) { case ADDNEWS: scanf("%d %d", &mSection, &mNewsId); addNews(mSection, mNewsId); break; case ERASENEWS: scanf("%d", &mNewsId); eraseNews(mNewsId); break; case READNEWS: scanf("%d %d", &mUserId, &mNewsId); readNews(mUserId, mNewsId); break; case CHANGESECTION: scanf("%d %d", &mNewsId, &mSection); changeSection(mNewsId, mSection); break; case GETLIST: scanf("%d", &mUserId); int num = getList(mUserId, res); int numans; scanf("%d", &numans); if (numans != num) retVal = 0; for (int j = 0; j < numans; j++) { int ans; scanf("%d", &ans); if (ans != res[j]) retVal = 0; } break; } } return retVal; } int main() { setbuf(stdout, NULL); freopen("input.txt", "r", stdin); int T, MARK; scanf("%d %d", &T, &MARK); for (int tc = 1; tc <= T; tc++) { int score = run() ? MARK : 0; printf("#%d %d\n", tc, score); } return 0; } -------------------------USER--------------------------- #include <queue> #include <vector> #define USER 100001 #define NEWS 50001 #define HASH_SIZE 105001 #define SECTION 10 #define swap(x,y) if (x!=y) x ^= y ^= x ^= y using namespace std; struct NewsData{ int score; int section; bool isErase; }; struct News{ int id; int score; }; //News map[SECTION][NEWS]; //struct comparator{ // inline bool operator()(const News& news1, const News& news2){ // if(news1.score == news2.score){ // if(news1.cntRead != news2.cntRead ){ // return news1.cntRead < news2.cntRead; // } // return news1.id < news2.id; // } // else // return news1.score < news2.score; //}; struct Heap{ News news[HASH_SIZE]; int size; bool compare(int first, int second){ if(news[first].score > news[second].score || news[first].score == news[second].score && news[first].id > news[second].id) return true; return false; } void push(int id, int score){ news[size].id = id; int child = size; int parent = (size - 1)/2; while(parent >= 0){ if(compare(child, parent)){ swap(news[child].id, news[parent].id); swap(news[child].score, news[parent].score); child = parent; parent = (size - 1)/2; } else break; } size++; } News pop(){ News result; result.id = 0; if(size == 0) return result; result = news[0]; news[0] = news[size--]; int parent = 0; int left = 2*parent + 1; int right = 2*parent + 2; int replace = -1; while(left <= size){ if(right <= size){ if(compare(left,right)){ if(compare(left, parent)){ replace = left; } } else{ if(compare(right, parent)){ replace = right; } } } else{ if(compare(left, parent)){ replace = left; } } if(replace != -1){ swap(news[replace].id, news[parent].id); swap(news[replace].score, news[parent].score); parent = replace; left = 2 * parent + 1; right = left + 1; replace = -1; } else break; } return result; } }; NewsData newsData[NEWS]; int interested[USER]; Heap heap[11]; void init() { for(int i = 0; i < 11; i++){ heap[i].size = 0; } for(int i = 0; i < USER; i++){ interested[i] = 10; } } void addNews(int mSection, int mNewsId) { for(int i = 0; i < 11; i++){ heap[i].push(mNewsId, (mSection == i)? 10 : 0); } newsData[mNewsId].section = mSection; newsData[mNewsId].score = 0; } void eraseNews(int mNewsId) { newsData[mNewsId].isErase = true; } void readNews(int mUserId, int mNewsId) { for(int i = 0; i < 11; i++){ heap[i].push(mNewsId, (newsData[mNewsId].section == i)? (newsData[mNewsId].score + 10): newsData[mNewsId].score); } interested[mUserId] = newsData[mNewsId].section; } void changeSection(int mNewsId, int mSection) { int old_section = newsData[mNewsId].section; heap[old_section].push(mNewsId, newsData[mNewsId].score); heap[mSection].push(mNewsId, newsData[mNewsId].score + 10); newsData[mNewsId].section = mSection; } int getList(int mUserId, int mList[]) { int result = 0; int section = interested[mUserId]; while(result < 10){ News news = heap[section].pop(); if(news.id == 0) break; int newId = news.id; int score = news.score; if(!newsData[newId].isErase && (newsData[newId].section != section && newsData[newId].score == score) || (newsData[newId].section == section && newsData[newId].score + 10 == score)){ mList[result] = newId; result++; } } for(int i = 0; i < 10; i++){ int newId = mList[i]; heap[section].push(newId, (newsData[newId].section == section)? newsData[newId].score + 10 : newsData[newId].score ); } return result; }
Editor is loading...