CodeFroces 977F. Consecutive Subsequence

题意:给出一个长为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
using namespace std;
const int maxn = 2e5 + 5;
const long long INF = 1e18;

int n, ans = 0, a[maxn], Max = 0;
map  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;
}

你可能感兴趣的:(————动态规划————)