关于D题
  • 板块灌水区
  • 楼主Fwio_
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/12/31 17:46
  • 上次更新2023/12/31 21:17:33
查看原帖
关于D题
965238
Fwio_楼主2023/12/31 17:46

推出来有循环了,思路是找循环节取余,但是我不到怎么快速求mex,#6#7T了

#include<iostream>
#include<cstring>
#include<algorithm>
#include<unordered_map>
#include<vector>
#define int long long
using namespace std;
int T;
const int N = 1000010;
int a[N] , b[N] , New[N];
unordered_map<int , int> h;
int n , k;
vector<int> g[11];
vector<int> Ans[11];
bool check(int x , int y){
	for(int i = 0;i < n;i++){
		if(g[x][i] != g[y][i]) return false;
	}
	return true;
}
signed main(){
	cin >> T;
	while(T--){
		h.clear();
		memset(Ans , 0 , sizeof Ans);
		memset(g , 0 , sizeof g);
		scanf("%lld%lld" , &n , &k); --k;
		for(int i = 1;i <= n;i++) scanf("%lld" , &a[i]);
		for(int d = 0;d < 4;d++){
			for(int i = 1;i <= n;i++){
				h.clear();
				for(int j = 1;j <= n;j++){
					if(j != i){
						h[a[j]]++;
					}
				}
				int mex = -1;
				for(int l = 0;l <= N;l++) if(!h[l]){
					mex = l;
					break;
				}
				New[i] = mex;
			}
			for(int i = 1;i <= n;i++) a[i] = New[i];
			for(int i = 1;i <= n;i++) g[d].push_back(New[i]);
		}
		int pos1 , pos2;
		for(int i = 0;i < 4;i++){
			for(int j = i + 1;j < 4;j++){
				if(check(i , j)){
					pos1 = i , pos2 = j;
					break;
				}
			}
		}
		int cnt = 0;
		int len = pos2 - pos1;
		int fr = pos1;
		for(int i = pos1;i < pos2;i++){
			for(auto j : g[i]) Ans[cnt].push_back(j);
			++cnt;
		}
		if(k < pos1){
			for(auto i : g[k]) printf("%lld " , i);
			cout << endl;
		}
		else{
			k -= fr;
			k %= len;
			for(auto i : Ans[k]) printf("%lld " , i);
			cout << endl;
		}
	}
	return 0;
}
2023/12/31 17:46
加载中...