題意:找出子串行中,連續嚴格上公升的序列的最大長並列印位置。
這裡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中就可以了。麻煩的地方在於要做邊界 檢查。另一種反向思路 雙指標...