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
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 |
|