ZOJ 4102ポケットの中の2019年浙江省人種質問Cアレイ

最初は、貪欲な最小セットを取るが、Aにおける集合Bの最大要素を充填しなかったプラスセット内の要素の数が満たされるように、それは要素の残りの数よりも大きくない、または要素を取ります。
2 2 3 3 1 1 3
2
第二部材2は数3、Aの残りを加え残り以上(6/2)(6つの残りの要素に番号3を充填する場合数)
ので2番目の要素は3つだけ満たすことができることは
、もちろんの場合より冒頭素子N / 2不可能出力より。

#include<bits/stdc++.h>
using namespace std;
const int M=1e5+10;
int a[M],b[M];
int c[M],cc[M];
typedef pair<int,int> P;
set<P> s1,s2;
set<P>::iterator it,mx;
int main(){
	int t,n;
	cin>>t;
	while(t--){
		scanf("%d",&n);
		for(int i=1;i<=n;i++){
			a[i]=b[i]=c[i]=cc[i]=0;
		}
		s1.clear();s2.clear();
		for(int i=1;i<=n;i++){
			scanf("%d",&a[i]);
			c[a[i]]++;cc[a[i]]+=2;
			
		}
		for(int i=1;i<=n;i++){
			if(c[i]){
				s1.insert(P(i,c[i]));
			    s2.insert(P(cc[i],i));
			}
			
		}
		//int temp=(*(--s2.end()))->first;
		it=s2.end();
		it--;
		int temp=it->first;
		if(temp>n){
			printf("Impossible\n");
			continue;
		}
		
		for( int i=1;i<=n;i++){
			s2.erase(P(cc[a[i]],a[i]));
			s2.insert(P(--cc[a[i]],a[i]));
			 it=s1.begin();
			 mx=s2.end();
			 mx--;
			if(mx->first==n-i+1){
				b[i]=mx->second;
			}
			else {
				if(a[i]==it->first)it++;
				b[i]=it->first;
			}
			s1.erase(P(b[i],c[b[i]]));
			c[b[i]]--;
			s2.erase(P(cc[b[i]],b[i]));
			cc[b[i]]--;
			if(c[b[i]])s1.insert(P(b[i],c[b[i]]));
			if(cc[b[i]])s2.insert(P(cc[b[i]],b[i]));
		}
		cout<<b[1];
		for(int i=2;i<=n;i++){
			printf(" %d",b[i]);
		}
		printf("\n");
	}
}
公開された18元の記事 ウォンの賞賛9 ビュー899

おすすめ

転載: blog.csdn.net/weixin_42859385/article/details/90082549