Zhejiang Race C matriz en el bolsillo (codicioso)

Eso Italia: de A a una matriz, una petición B, de manera que A y B es la matriz completa, y una posición arbitraria en un [i] = a [j], encontrar la condición lexicográficamente más pequeña matriz B !.

Pensamientos: empiezan desde cero cada vez que poner el elemento más pequeño, determina el número de todos los elementos además de toda la posición de reposo Una vez que la corriente es menor que el número de elementos de matriz restantes a ni. Set + violín con la cola de prioridad en la línea.

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[100005];
int b[100005];
int m[100005];
int m1[100005];
int ans[100005];
set<int> s;
struct node{
	int val,pos;
	node(){
	}
	node(int q,int w)
	{
		val=q;pos=w;
	}
	bool friend operator <(node q,node w)
	{
		return q.val<w.val;
	}
};
int p[100005];
int vis[100005];
int main()
{
	ios::sync_with_stdio(false);
	int t;
	cin>>t;
	while(t--)
	{
		priority_queue<node> q;
		int n;
		cin>>n;memset(m,0,sizeof(m));
		memset(m1,0,sizeof(m1));memset(p,0,sizeof(p));memset(vis,0,sizeof(vis));
		s.clear();
		
		for(int i=1; i<=n; i++)
		{
			cin>>a[i];
			m[a[i]]++;
			m1[a[i]]++;
			s.insert(a[i]);
		}
		for(int i=1; i<=n; i++)
		{
			int val=(a[i]);
			int key=m[a[i]];
			if(vis[val]==0)
			{
				q.push(node(key+m1[val],val));
				vis[val]=1;
			}
		}
		int flag=1;
		for(int i=1;i<=n;i++)
		{
			set<int>::iterator it=s.begin();
			int f=0;
			while(it!=s.end())
			{
				int val=(*it);
				int key=m[(*it)];
				if(val!=a[i]&&key-1+m1[val]<=n-i)
				{
					while(!q.empty())
					{
						node u=q.top();q.pop();
						u.val-=p[u.pos];
						q.push(u);
						if(p[u.pos]==0)
						{
							int l=u.val;
							if(u.pos==a[i]||u.pos==val) l--;
							if(l<=n-i)
							{
								f=1;break;
							}
							else{
								f=0;break;
							}						
						}
						p[u.pos]=0;
					}
					if(f==1)
					{
						ans[i]=val;
						m[val]--;
						p[val]++;
						if(key-1==0)
						{
							s.erase(it);
						}					
					}
				}
				it++;
				if(f==1) break;
			}
			if(f==0)
			{
				flag=0;break;
			}
			m1[a[i]]--;
			p[a[i]]++;
		}
		if(flag==0) printf("Impossible\n");
		else
		{
			for(int i=1;i<=n;i++) printf("%d%c",ans[i],i==n?'\n':' ');
		}
	}
	return 0;
}

 

Publicados 155 artículos originales · ganado elogios 32 · Vistas a 30000 +

Supongo que te gusta

Origin blog.csdn.net/qq_37632935/article/details/89639569
Recomendado
Clasificación