题目大意
一些导弹按照时间从前往后的顺序以一定高度发过来,一个导弹拦截系统随时间的推移只能拦截高度不上升的一组导弹。问一个系统最多能拦截多少导弹,以及要拦截所有导弹至少需要多少个系统。
思路
#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 ", 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 ", ans); return 0; }