洛谷1020 NOIP1999 飛彈攔截 dp

2021-08-19 18:34:48 字數 985 閱讀 8924

我這裡講的是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 第二問,最少需要...