题意:给出一个长为n的序列,求出最长的递增序列且该序列公差为1.
解法:首先可以发现n只有2e5,但是数字范围a是1-1e9. n相比a很小,所以一贯的套路就是离散化n个数字。
由于这个递增序列公差必须为1,我们考虑dp,递推式就是dp[i]=dp[i-1]+1,i代表当前数字大小,dp[i]代表算上i最长的序列是多长。
由于数字太大,不可能开1e9的dp数组,所以就回到了离散化的问题上。最直接的方法就是用map来代替数组。
复杂度为O(nlogn)
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
const long long INF = 1e18;
int n, ans = 0, a[maxn], Max = 0;
map <int, int> Map;
int main() {
ios::sync_with_stdio(0);
cin >> n;
for(int i = 1, tmp; i <= n; i++) {
cin >> tmp;
a[i] = tmp;
if(Map.find(tmp - 1) == Map.end()) {
Map[tmp] = 1;
if(ans < Map[tmp]) {
ans = Map[tmp];
Max = tmp;
}
} else {
Map[tmp] = max(Map[tmp - 1] + 1, Map[tmp]);
if(ans < Map[tmp]) {
ans = Map[tmp];
Max = tmp;
}
}
}
cout << ans << endl;
int p = Max - ans + 1;
for(int i = 1; i <= n; i++) {
if(a[i] == p) {
cout << i;
p++;
if(p > Max)
cout << '\n';
else
cout << ' ';
}
}
return 0;
}