Untitled
unknown
plain_text
2 years ago
4.6 kB
7
Indexable
#define HASH_SIZE 105001
#define NEWS_SIZE 50001
#define USER_SIZE 100001
#define SWAP(X, Y) if(X != Y) (X) ^= (Y) ^= (X) ^= (Y)
struct NewsData {
int score;
int section;
int call_count;
bool isErased;
};
struct News {
int id;
int score;
};
struct Heap {
News news[HASH_SIZE];
int size;
public:
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;
news[size].score = score;
int child = size;
int parent = (child - 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 = (child - 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 = left + 1;
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 news_data[NEWS_SIZE];
int user_data[USER_SIZE];
int call_number = 0;
Heap heap[11];
void init()
{
for(int i = 0 ; i < 11; i++) {
heap[i].size = 0;
}
for(int i = 0; i < USER_SIZE; i++) {
user_data[i] = 10;
}
}
void addNews(int mSection, int mNewsId)
{
int score;
for(int i = 0; i < 11; i++) {
score = (mSection == i ) ? 10 : 0;
heap[i].push(mNewsId, score);
}
news_data[mNewsId].section = mSection;
news_data[mNewsId].score = 0;
news_data[mNewsId].call_count = 0;
news_data[mNewsId].isErased = false;
}
void eraseNews(int mNewsId)
{
news_data[mNewsId].isErased = true;
}
void readNews(int mUserId, int mNewsId)
{
news_data[mNewsId].score++;
int score;
for(int i = 0; i < 11; i++) {
score = (news_data[mNewsId].section == i) ? (news_data[mNewsId].score + 10) : news_data[mNewsId].score;
heap[i].push(mNewsId, score);
}
user_data[mUserId] = news_data[mNewsId].section;
}
void changeSection(int mNewsId, int mSection)
{
int old_section = news_data[mNewsId].section;
heap[old_section].push(mNewsId, news_data[mNewsId].score);
heap[mSection].push(mNewsId, news_data[mNewsId].score + 10);
news_data[mNewsId].section = mSection;
}
int getList(int mUserId, int mList[])
{
call_number++;
int result = 0, news_id, score;;
int section = user_data[mUserId];
while(result < 10) {
News news = heap[section].pop();
if(news.id == 0) break;
news_id = news.id;
score = news.score;
if(!news_data[news_id].isErased
&& news_data[news_id].call_count < call_number
&& ((news_data[news_id].section != section && news_data[news_id].score == score)
|| (news_data[news_id].section == section && news_data[news_id].score == score - 10))) {
mList[result++] = news_id;
news_data[news_id].call_count = call_number;
}
}
for(int i = 0; i < result; i++) {
news_id = mList[i];
score = (news_data[news_id].section == section) ? news_data[news_id].score + 10 : news_data[news_id].score;
heap[section].push(news_id, score);
}
return result;
}Editor is loading...