101911A

md,这题一定要吐槽一下。
刚开始用结构体加sort写,发现tle了,以为是sort的锅,毕竟用了三次。然后改用set写,md还是tle。最后最后发现是输入没判断结束导致的tle,欲哭无泪呀。还有后边数组大小问题,还是乖乖的定义个全局N吧,改起来方便,不然又会多wa几发。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

int n, m, d;
int a[1000005];
int vis[1000005];
struct Node
{
int index;
int val;
int res;
} node[200005];

bool cmp1(Node a, Node b)
{
return a.val < b.val;
}

bool cmp2(Node a, Node b)
{
return a.index < b.index;
}

int main()
{
while (scanf("%d%d%d", &n, &m, &d)!=EOF) //FUCK..........
{
memset(vis,0,sizeof(int)*(n+5));
int data, temp_time;
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
node[i].val = a[i];
node[i].index = i;
}
sort(a + 1, a + n + 1); //按时间点大小排序
sort(node + 1, node + n + 1, cmp1); //先按时间点大小排序
data = 1;
temp_time = 0;
for (int i = 1; i <= n;)
{
if (vis[i])
{
i++;
continue;
}
if(temp_time==0)
{
node[i].res=data;
temp_time=node[i].val+d+1;
vis[i]=1;i++;
continue;
}
else if (temp_time <= m)
{
int inde = lower_bound(a + 1, a + n + 1, temp_time) - a;
while(vis[inde]) inde++; //刚开始没考虑到这个
if (inde == n + 1)
data++,temp_time = 0;
else
{
temp_time = node[inde].val + d + 1;
vis[inde]=1;
node[inde].res=data;
}
}
else
{
data++;
temp_time=0;
}
}
sort(node + 1, node + n + 1, cmp2); //恢复成按输入顺序排序
printf("%d\n",data);
for(int i=1;i<n;i++)
{
printf("%d ",node[i].res);
}
printf("%d\n",node[n].res);
}
return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <set>
using namespace std;

int n, m, d;
int a[1000005];
int res[1000005];
set<pair<int, int> > node; //val index
set<pair<int, int> >::iterator it;

int main()
{
while (scanf("%d%d%d", &n, &m, &d)!=EOF)
{
int data, temp_time;
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
node.insert(make_pair(a[i],i));
}
data = 1;
temp_time = 0;
while(node.size()!=0)
{
if(temp_time==0)
{
res[node.begin()->second]=data;
temp_time=node.begin()->first+d+1;
node.erase(node.begin());
continue;
}
else if (temp_time <= m)
{
it = node.lower_bound(make_pair(temp_time,0));
if (it == node.end())
data++,temp_time = 0;
else
{
temp_time=it->first+d+1;
res[it->second]=data;
node.erase(it);
}
}
else
{
data++;
temp_time=0;
}
}
printf("%d\n",data);
for(int i=1;i<n;i++)
{
printf("%d ",res[i]);
}
printf("%d\n",res[n]);
}
return 0;
}
坚持技术分享,如果帮助到了您,您的支持将鼓励我继续创作!