Untitled
unknown
plain_text
2 years ago
4.2 kB
8
Indexable
#define MAXU 100002
#define MAXS 50002
#define MAXM 10
struct News
{
int _section;
int _cntRead;
bool _isActive;
};
News lNews[MAXS];
int lUser[MAXU];
int RES[MAXM + 1][MAXM]; //RES[10] do not depends on sections
int GN;
void init()
{
for (int i = 0; i < MAXU; i++)
lUser[i] = 10; // do not depends on sections
for (int i = 0; i <= MAXM; i++)
for (int j = 0; j < MAXM; j++)
RES[i][j] = -1;
}
int CheckPriority(int section, int nId1, int nId2)
{
if (nId2 == -1)
return 1;
int score1 = lNews[nId1]._section == section ? 10 + lNews[nId1]._cntRead : lNews[nId1]._cntRead;
int score2 = lNews[nId2]._section == section ? 10 + lNews[nId2]._cntRead : lNews[nId2]._cntRead;
if (score1 > score2 || (score1 == score2 && nId1 > nId2))
return 1;
return 0;
}
int Update(int section, int nId)
{
int nIdE = RES[section][MAXM - 1];
if (CheckPriority(section, nId, nIdE))
{
for (int i = 0; i < MAXM; i++)
{
if (CheckPriority(section, nId, RES[section][i]))
{
for (int j = MAXM - 1; j > i; j--)
RES[section][j] = RES[section][j - 1];
RES[section][i] = nId;
break;
}
}
return 1;
}
return 0;
}
int Remove(int section, int nId)
{
for (int i = 0; i < MAXM; i++)
{
if (RES[section][i] == nId)
{
for (int j = i; j < MAXM - 1; j++)
RES[section][j] = RES[section][j + 1];
RES[section][MAXM - 1] = -1;
return 1;
}
}
return 0;
}
void FindLastest(int section)
{
int maxScore = -1;
int nId = -1;
int score;
bool flag;
for (int i = 1; i <= GN; i++) //nId
{
if (!lNews[i]._isActive)
continue;
score = lNews[i]._section == section ? 10 + lNews[i]._cntRead : lNews[i]._cntRead;
if (score > maxScore || (score == maxScore && i > nId))
{
flag = true;
for (int j = 0; j < MAXM; j++)
{
if (RES[section][j] == -1)
break;
if (i == RES[section][j])
{
flag = false;
break;
}
}
if (flag)
{
maxScore = score;
nId = i;
}
}
}
//
if (nId != -1)
{
for (int i = 0; i < MAXM; i++)
if (RES[section][i] == -1)
{
RES[section][i] = nId;
break;
}
}
}
void addNews(int mSection, int mNewsId)
{
GN = mNewsId;
lNews[mNewsId]._section = mSection;
lNews[mNewsId]._cntRead = 0;
lNews[mNewsId]._isActive = true;
for (int i = 0; i <= MAXM; i++)
Update(i, mNewsId);
}
void eraseNews(int mNewsId)
{
lNews[mNewsId]._isActive = false;
for (int i = 0; i <= MAXM; i++)
if (Remove(i, mNewsId))
FindLastest(i);
}
void Check(int section, int nId)
{
int i;
bool flag;
if (Remove(section, nId))
{
for (i = 0; i < MAXM; i++)
if (RES[section][i] == -1)
break;
flag = CheckPriority(section, nId, RES[section][i - 1]);
if (flag) Update(section, nId);
else FindLastest(section);
return;
}
Update(section, nId);
}
void readNews(int mUserId, int mNewsId)
{
lUser[mUserId] = lNews[mNewsId]._section;
lNews[mNewsId]._cntRead++;
for (int i = 0; i <= MAXM; i++)
Check(i, mNewsId);
}
void changeSection(int mNewsId, int mSection)
{
int oldSection = lNews[mNewsId]._section;
lNews[mNewsId]._section = mSection;
Check(oldSection, mNewsId);
Check(mSection, mNewsId);
}
int getList(int mUserId, int mList[])
{
int i;
int section = lUser[mUserId];
for (i = 0; i < MAXM; i++)
{
if (RES[section][i] == -1)
break;
mList[i] = RES[section][i];
}
return i;
}
Editor is loading...