Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
4.2 kB
2
Indexable
Never
#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;
}