本来觉得这不是经典的贪心吗。。果断水一次,wa了,看了看discuss,发现貌似不好水,土土的DP了一下,复杂度很高了,又T了。。。然后想想单调队列,二分什么的。。。不好往上加,直接搞了标记数组flag,暴力从大到小,遍历寻找,然后就过了。。。这算是优化吗,瞎搞。。。
1
#include <cstring>
2
#include <cstdio>
3
#include <
string
>
4
#include <iostream>
5
#include <algorithm>
6
#include <cmath>
7
using
namespace
std;
8
struct
node
9
{
10
int
x,y;
11
}p[
100001
];
12
int
dp[
100001
];
13
int
flag[
100001
];
14
int
cmp(node a,node b)
15
{
16
if
(a.x ==
b.x)
17
return
a.y <
b.y;
18
else
19
return
a.x <
b.x;
20
}
21
int
main()
22
{
23
int
n,i,j,ans,maxz,top;
24
scanf(
"
%d
"
,&
n);
25
for
(i =
0
;i < n;i ++
)
26
{
27
scanf(
"
%d%d
"
,&p[i].x,&
p[i].y);
28
}
29
memset(flag,-
1
,
sizeof
(flag));
30
sort(p,p+
n,cmp);
31
ans =
1
;
32
dp[
0
] =
1
;
33
flag[
1
] = p[
0
].y;
34
top =
1
;
35
for
(i =
1
;i < n;i ++
)
36
{
37
maxz =
0
;
38
for
(j = top;j >=
1
;j --
)
39
{
40
if
(p[i].x >
flag[j])
41
{
42
maxz =
j;
43
break
;
44
}
45
}
46
dp[i] = maxz +
1
;
47
if
(flag[maxz+
1
] == -
1
)
48
{
49
flag[maxz+
1
] =
p[i].y;
50
top ++
;
51
}
52
else
53
flag[maxz+
1
] = min(flag[maxz+
1
],p[i].y);
54
}
55
printf(
"
%d\n
"
,top);
56
}

