Submission #1319114

#TimeUsernameProblemLanguageResultExecution timeMemory
1319114neonglitchDEL13 (info1cup18_del13)C++20
0 / 100
1096 ms9860 KiB
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;
const int N=2e5+10;
int a[N],gap[N];
bool dp[N][200];
pair<int,int> bt[N][200];
set<int> cur[N];
void solve()
{
	int n,k;
	cin>>n>>k;
	for(int i=0;i<=n+1;i++)cur[i].clear();
	a[0]=0;
	for(int i=1;i<=k+1;i++)
	{
		if(i<=k)
			cin>>a[i];
		else{
			a[i]=n+1;
		}
		gap[i]=a[i]-a[i-1]-1;
		for(int x=a[i-1]+1;x<a[i];x++)cur[i].insert(x);
		// cout<<"At "<<i<<' '<<cur[i].size()<<endl;
	}
	// gap[i]<=2
	for(int i=0;i<=k+1;i++)for(int j=0;j<=n+1;j++)dp[i][j]=0;
	dp[1][gap[1]]=1;
	bt[1][gap[1]]={-1,-1};
	for(int i=1;i<=k+1;i++)
	{
		for(int j=n+1;j>=3;j--)
		{
			if(!dp[i][j])continue;
			dp[i][j-2]|=dp[i][j];
			bt[i][j-2]={i,j};
		}
		for(int j=0;j<=n+1;j++)
		{
			if(!dp[i][j])continue;
			if(j<=gap[i+1])
			{
				dp[i+1][gap[i+1]-j]|=dp[i][j];
				bt[i+1][gap[i+1]-j]={i,j};
			}
			for(int k1=gap[i+1]-2;j<=k1 and gap[i+1]>2;)
			{
				dp[i+1][k1-j]|=dp[i][j];
				bt[i+1][k1-j]={i+1,k1};
				if(k1>2)k1-=2;
				else break;
			}
		}
	}
	if(!dp[k+1][0])
	{
		cout<<-1<<endl;
		return;
	}
	int i=k+1,j=0;
	vector<int> ans;
	while(i!=1 or j!=gap[1])
	{
		int ni=bt[i][j].first,nj=bt[i][j].second;
		// cout<<"From "<<i<<' '<<j<<' '<<ni<<' '<<nj<<endl;
		if(ni==i)
		{
			// cout<<cur[i].size()<<endl;
			cur[i].erase(begin(cur[i]));
			int x=*begin(cur[i]);
			cur[i].erase(begin(cur[i]));
			cur[i].erase(begin(cur[i]));
			ans.push_back(x);
			cur[i].insert(x);
		}
		else{
			for(int p=0;p<nj;p++)
			{
				ans.push_back(a[ni]);
			}
		}
		i=ni,j=nj;
	}
	cout<<ans.size()<<endl;
	for(auto x:ans)cout<<x<<' ';
	cout<<endl;
}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin>>t;
	while(t--)
	{
		solve();
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...