寒假集訓 專題二dp A 飛彈

2022-10-08 20:33:13 字數 1392 閱讀 3890

飛彈攔截工具每次只能攔截不大於前一次高度的飛彈。

給一組飛彈的資料,問:一次使用該工具最多能攔截多少飛彈,最少使用多少該工具能攔截全部飛彈。

一問:仔細思考後發現是最長不上公升子串行問題,採用lis的解法

二問:想要攔截所有飛彈,不妨想後乙個飛彈高度要小於或者等於前乙個飛彈可以全部攔截,若出現後乙個飛彈高於前乙個。

我的理解的改變:1.後乙個高於前乙個就加乙個工具使用,該思路明顯錯誤,因為後乙個可能可以被前面使用過的工具攔截。

轉化為lis,即求最長上公升子串行,為什麼不是最長不下降子串行?因為其中子串行的每乙個元素都代表著一段不上公升子串行終點

而lis 時間複雜度為n的解法,簡單來說就是用乙個單調序列來儲存,用二分來尋找和替換

lower_bound(begin,end,&val,greater())-begin

範圍[begin,end)

lower_bound等號時取到,upper表示等號時 取不到

預設是非遞減序列的大於(等於)val的位址

加入greater()就變為小於(等於)

若begin,end化成rbegin,rend,即反方向迭代,同理也要減rbegin(),

#includeusing namespace std;

#define fi first

#define se second

#define pb push_back

#define endl '\n'

#define debug(x) cout<<"------"<=b;--i)

#define ios ios::sync_with_stdio(false),cin.tie(0);

typedef pair pii;

typedef vector vi;

const int mod = 1e9+7;

const int inf =0x3f3f3f3f;

const int n=100001;

int b[n];

mapma;

vi goal;

vi tar;

int ans=-inf;

void solve()

int len=1;

goal.pb(0);

goal.pb(b[1]);

rep(i,2,cnt-1)

else

}tar.pb(0);

tar.pb(b[1]);

int len0=1;

rep(i,2,cnt-1)

else

}cout

寒假集訓搜尋專題

hdu1016素數環 給定n,0 1 需要先製作素數表,因為n在20以內,所以環中兩數相加小於40,素數表判斷到39即可 2 dfs求解,在乙個點中可以選用的數滿足 在給定n範圍內,與前乙個數相加為素數,沒有被選用過 需要注意開始的節點1是固定的,應該在dfs前判斷為已經走過或者dfs中永不遍歷數字...

TS寒假集訓線段樹專題B題

ts寒假集訓線段樹專題b題 對於任意乙個序列因為數字全是從0 n 1,所以我們發現對於任意x都有x個比他小的數n 1 x個比他大的數,所以當吧x從隊頭移到隊尾是就會增加n 1 x x個逆序。根據以上發現我們可以遞推的算出n個序列的逆序數代價是on。而求乙個序列逆序數的暴力演算法是n方的於是乎看見50...

寒假集訓二補題與題解

統計字首個數,一想到字串的字首,我們就應該想到字典樹,這個和字典一樣的字首樹.這道題目是字典樹模板的略微改動,我們發現這道題目和一般字典樹的查詢不一樣,字典樹一般查詢是看這個字串是否出現,而這道題目這是統計這個字串出現的次數.includeusing namespace std const int ...