codeforces 1041C Coffee Break

Coffee Break

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Recently Monocarp got a job. His working day lasts exactly mm minutes. During work, Monocarp wants to drink coffee at certain moments: there are nn minutes a1,a2,…,ana1,a2,…,an , when he is able and willing to take a coffee break (for the sake of simplicity let's consider that each coffee break lasts exactly one minute).

However, Monocarp's boss doesn't like when Monocarp takes his coffee breaks too often. So for the given coffee break that is going to be on minute aiai , Monocarp must choose the day in which he will drink coffee during the said minute, so that every day at least dd minutes pass between any two coffee breaks. Monocarp also wants to take these nn coffee breaks in a minimum possible number of working days (he doesn't count days when he is not at work, and he doesn't take coffee breaks on such days). Take into account that more than dd minutes pass between the end of any working day and the start of the following working day.

For each of the nn given minutes determine the day, during which Monocarp should take a coffee break in this minute. You have to minimize the number of days spent.

Input

The first line contains three integers nn , mm , dd (1≤n≤2⋅105,n≤m≤109,1≤d≤m)(1≤n≤2⋅105,n≤m≤109,1≤d≤m)  — the number of coffee breaks Monocarp wants to have, the length of each working day, and the minimum number of minutes between any two consecutive coffee breaks.

The second line contains nn distinct integers a1,a2,…,ana1,a2,…,an (1≤ai≤m)(1≤ai≤m) , where aiai is some minute when Monocarp wants to have a coffee break.

Output

In the first line, write the minimum number of days required to make a coffee break in each of the nn given minutes.

In the second line, print nn space separated integers. The ii -th of integers should be the index of the day during which Monocarp should have a coffee break at minute aiai . Days are numbered from 11 . If there are multiple optimal solutions, you may print any of them.

Examples

Input

Copy

4 5 3
3 5 1 2

Output

Copy

3
3 1 1 2 

Input

Copy

10 10 1
10 5 7 4 6 3 2 1 9 8

Output

Copy

2
2 1 1 2 2 1 2 1 1 2 

Note

In the first example, Monocarp can take two coffee breaks during the first day (during minutes 11 and 55 , 33 minutes will pass between these breaks). One break during the second day (at minute 22 ), and one break during the third day (at minute 33 ).

In the second example, Monocarp can determine the day of the break as follows: if the minute when he wants to take a break is odd, then this break is on the first day, if it is even, then this break is on the second day.

思路:

这道题m貌似真的没啥用,说说题意吧(看了一个小时问了三个人最后队友专门讲解才搞懂什么意思orz),大致就是有某人要在n天内喝n杯咖啡,每杯咖啡都有一个喝的时间点单位是min,如果两杯咖啡在一天喝,那么它们之间至少要相隔d min,要求输出最少几天可以喝完,并输出对应题目输入的每一杯咖啡是在第几天喝的(假设输出第一个数w,w代表第一杯咖啡是在第w天喝的)

当然,输出不唯一,那么我们可以找出一种情况是最早喝的那杯咖啡(ai min )在某一天中一定是第一杯,我们就直接让它在第一天被喝,由此可以推出下一杯咖啡时间至少要 >= ai + d + 1,于是一直往下找即可,如果找不到就说明这一天已经不能喝了,另开一天即可

写了一份很麻烦的代码,硬生生把O((n^2)logn)的复杂度超时了(大哭)

代码:

AC:

#include
using namespace std;
const int maxn = (int)2e5 + 10;
int a[maxn],b[maxn];
set > se;
int main()
{
    int n,m,d;
    scanf("%d %d %d",&n,&m,&d);
    for (int i = 0;i < n;i ++)
    {
        scanf("%d",&a[i]);
        se.insert(make_pair(a[i],i));
    }
    int cnt = 0,pos;
    while (!se.empty())
    {
        pos = se.begin() -> second;
        b[pos] = ++ cnt;
        se.erase(se.begin());
        while (1)
        {
            auto t = se.lower_bound({a[pos] + d + 1,0});
            if (t == se.end())
                break;
            pos = t -> second;
            b[pos] = cnt;
            se.erase(t);
        }
    }
    printf("%d\n%d",cnt,b[0]);
    for (int i = 1;i < n;i ++)
        printf(" %d",b[i]);
    return 0;
}

TLE:

#include
using namespace std;
const int maxn = (int)2e5 + 10;
struct node
{
    int num,id;
}a[maxn];
bool cmp(node x,node y)
{
    return x.num < y.num;
}
bool cmp1(node x,node y)
{
    return x.id < y.id;
}
map mp;
vector ve;
int main()
{
    int n,m,d;
    scanf("%d %d %d",&n,&m,&d);

    for (int i = 0;i < n;i ++)
    {
        scanf("%d",&a[i].num);
        a[i].id = i;
    }
    sort(a,a + n,cmp);
    int day = 0;
    ve.push_back(a[0].num);
    mp[a[0].num] = ++ day;//
    for (int i = 1;i < n;i ++)
    {
        int t = lower_bound(ve.begin(),ve.end(),a[i].num - d) - ve.begin();
        if (!t)
        {
            mp[a[i].num] = ++ day;
            ve.push_back(a[i].num);
        }
        else
        {
            mp[a[i].num] = mp[ve[t - 1]];
            ve.erase(ve.begin() + t - 1);
            ve.push_back(a[i].num);
        }
    }
    sort(a,a + n,cmp1);
    printf("%d\n",day);
    bool flag = 0;
    printf("%d",mp[a[0].num]);
    for (int i = 1;i < n;i ++)
        printf(" %d",mp[a[i].num]);
    return 0;
}

 

你可能感兴趣的:(codeforces)