我這裡講的是nlogn的做法。
首先看第一問,第一問就是要求乙個最長不下降子串行,這個o(n^2)的做法是很容易的。
我這裡介紹的nlogn的方法是用線段樹的。我們發現高度是不超過50000的,所以我們可以把線段樹的每乙個下標i的含義變為目前加進來的高度為i的最長不下降子串行的長度是多少。然後我們需要做的是從後往前掃,每到乙個位置,查詢當前線段樹從1到當前高度a[i]的區間最大值,當前的dp[i]即為那個最大值再加1,然後用dp[i]更新線段樹即可。
然後看第二問,據說有個關於偏序集的定理,但是我覺得不太好理解,於是我自己想了一種理解方式。
我們考慮如果需要多出一套系統,就意味著現在出現的這乙個飛彈的高度比上乙個飛彈高,這樣就不能用一套系統攔截這兩個飛彈了,我們此時就需要新加乙個系統。所以我們把第二問轉化為了求最長上公升子串行的長度。
下面是**:
#include using namespace std;
int n,a[200001],dp[200001],res;
struct node
tr[205002];
void build(int rt,int l,int r)
int mid=(l+r)>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
tr[rt].mx=0;
}void add(int rt,int le,int ri,int x)
int query(int rt,int le,int ri)
int main()
printf("%d\n",res);
memset(dp,0,sizeof(dp));
res=0;
build(1,1,50000);
for(int i=1;i<=n;i++)
printf("%d\n",res);
return 0;
}
洛谷1020攔截飛彈(NOIP1999)
洛谷1020攔截飛彈 noip1999 題目描述 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不...
洛谷P1020 NOIP1999 攔截飛彈
題意簡述 求最長不上公升子串行的長度,並求出最少有幾個不上公升子串行。解題思路 第一問直接用dp做,有o n 2 的也有優化後o nlgn 的,我才用的是前者。第二問可以用乙個陣列h來記錄當前所有系統的攔截高度,每次遇到乙個新元素,在h陣列中找乙個大於 a i 的最小的元素,並將其更新為 h j a...
P1020 NOIP1999 普及組 飛彈攔截
第一問,單個系統最多能攔截多少飛彈,求最長不公升序列即可.拿出lis的模板塗塗改改.bool cmp const int a,const int b for int i 1 i n i if s i dp len len dp len s i else printf d n len 第二問,最少需要...