0
点赞
收藏
分享

微信扫一扫

Codeforces Round #767 (Div. 2) C. Meximum Array

工程与房产肖律师 2022-03-11 阅读 50
c++思路

题目链接:Problem - C - Codeforces

题目描述:

输入描述:

 

输出描述: 

样例及解释:

 

题意:

给定一个数组,求出字典序最大的nex数组

思路:

我们先处理出一个后缀nex数组

定义p = 0;当pj的nex 等于p(n - 1)的nex的时候这个nex就是最大的nex。更新p

#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
#define IOS ios::sync_with_stdio(false)
int arr[200005];
map<int, int> mp;
int nex[200005];
vector<int> ve;
int main(){
	IOS;
	int t;
	cin >> t;
	while(t--){
		ve.clear();
		int n;
		cin >> n;
		int a = 0;
		for(int i = 0; i < n; i++){
			cin >> arr[i];
		}
		for(int i = n - 1; i >= 0; i--){
			mp[arr[i]] = 1;
			while(mp[a]){
				a++;
			}
			nex[i] = a;
		}
		mp.clear();
		int p = 0;
		while(p < n){
			a = 0;
			for(int j = p; j < n; j++){
				mp[arr[j]] = 1;
				while(mp[a]){
					a++;
				}
				if(a == nex[p]){
					p = j + 1;
					ve.push_back(a);
					mp.clear();
					break;
				}
			}
		}
		cout << ve.size() << endl;
		for(int i = 0; i < ve.size(); i++){
			if(i != 0){
				cout << " ";
			}
			cout << ve[i];
		}
		cout << endl;
	}
	return 0;
}

 

举报

相关推荐

0 条评论