codeforces 977F dp回溯路徑

2022-05-21 04:56:01 字數 1471 閱讀 9403

題意:找出子串行中,連續嚴格上公升的序列的最大長並列印位置。

這裡dp[i]表示第i個結尾的最大上公升長度。

dp[i]=max(dp[i-1]+1)。

這裡a[i]很大,我們採用map。題目要求列印路徑我們就記錄乙個前驅(我這裡寫的略顯臃腫,腦子抽了)。

#include#include#include#include#include#include#include#include#include#include#include//#include#include#define up(i,a,b)  for(int i=a;ib;i--)

#define upd(i,a,b) for(int i=a;i<=b;i++)

#define dwd(i,a,b) for(int i=a;i>=b;i--)

//#define local

typedef long long ll;

const double esp = 1e-6;

const double pi = acos(-1.0);

const int inf = 0x3f3f3f3f;

const int inf = 1e9;

using namespace std;

ll read()

while (ch >= '0' && ch <= '9')

return x * f;

}typedef pairpir;

#define lson l,mid,root<<1

#define rson mid+1,r,root<<1|1

#define lrt root<<1

#define rrt root<<1|1

int n;

const int n = 2e5 + 10;

ll a[n];

struct node

else if (a > k.a)return true;

else return false;

} };

map> mp;

int pre[n];

int main()

if (mp[a[i]].empty()) ); pre[i] = pos; }

else if ((*mp[a[i]].begin()).a <= temp)

);pre[i] = pos;

} }ll ans = 0;

int pos = 0;

for (auto k : mp) }

cout << ans << endl;

vectorvec;

for (; pos!= -1; pos = pre[pos])

vec.push_back(pos);

reverse(vec.begin(), vec.end());

for (auto k : vec)cout << k << " ";

}

codeforces 977非官方題解

打了差不多一年的cf發現自己是div3選手,也可能是div4 選手。這一題就是簡單的模擬題。include using namespace std long long main else cout n endl return 0 這題是說要算一下哪個長度為2的子串出現次數最多,那麼就統計一下吧。in...

977 有序陣列的平方

利用 陣列 nums 已經按照公升序排序 這個條件。顯然,如果陣列 nums 中的所有數都是非負數,那麼將每個數平方後,陣列仍然保持公升序 如果陣列 nums 中的所有數都是負數,那麼將每個數平方後,陣列會保持降序。因此就可以使用歸併的方法進行排序。使用兩個指標分別指向位置 0 和 n 1,每次比較...

977 有序陣列的平方

題意理解 給定遞增陣列,把陣列元素平方後遞增輸出。思路 可能含有負數,但是存在乙個負數和正數的分界線neg。利用雙指標,從neg和neg 1向兩邊遍歷,把小的push進ans中,直至到達一邊的邊界,這時把另一邊剩下的順序push進ans中就可以了。麻煩的地方在於要做邊界 檢查。另一種反向思路 雙指標...