题目大意
一些导弹按照时间从前往后的顺序以一定高度发过来,一个导弹拦截系统随时间的推移只能拦截高度不上升的一组导弹。问一个系统最多能拦截多少导弹,以及要拦截所有导弹至少需要多少个系统。
思路
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX_N = 100010;
int A[MAX_N];
struct BIT
{
private:
int C[MAX_N];
int N;
int Lowbit(int x)
{
return x & -x;
}
public:
void Init(int n)
{
N = n;
memset(C, 0, sizeof(C));
}
void Update(int p, int delta)
{
if (p < 1)
return;
while (p <= N)
{
C[p] = max(C[p], delta);
p += Lowbit(p);
}
}
int Query(int p)
{
int ans = 0;
while (p > 0)
{
ans = max(ans, C[p]);
p -= Lowbit(p);
}
return ans;
}
}g;
int main()
{
int n = 1;
while (~scanf("%d", A + n))
n++;
n--;
int maxVal = 0;
for (int i = 1; i <= n; i++)
maxVal = max(maxVal, A[i]);
int ans = 0;
g.Init(maxVal);
for (int i = 1; i <= n; i++)
{
int qAns = g.Query(maxVal - A[i] + 1) + 1;
ans = max(ans, qAns);
g.Update(maxVal - A[i] + 1, qAns);
}
printf("%d\n", ans);
g.Init(maxVal);
ans = 0;
for (int i = 1; i <= n; i++)
{
int qAns = g.Query(A[i] - 1) + 1;
ans = max(ans, qAns);
g.Update(A[i], qAns);
}
printf("%d\n", ans);
return 0;
}