WA 3求调
查看原帖
WA 3求调
868864
zjinze楼主2025/1/21 21:53
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define mp(a,b) make_pair(a,b)
const int N=1e5+7;
int t,n,k,a[N],cnt=0;
map<int,int>ma;
priority_queue<pii>que; 
void clear(priority_queue<pii>&p){
	priority_queue<pii>q;
	swap(p,q);
	return ;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>t;
	while(t--){
		cin>>n>>k;
		ma.clear();
		for(int i=1;i<=n;i++)cin>>a[i],++ma[a[i]];
		sort(a+1,a+n+1);
		int cnt=0,maxn=0;
		for(int i=0;;i++){
			if(ma[i])maxn=i+1;
			else{
				if(cnt==k || i+1>n)break;
				cnt++;
				maxn=i+1;
			}
		}
		cnt=0;
		a[0]=a[n+1]=-1;
		for(int i=1;i<=n;i++)if(a[i]!=a[i-1])++cnt;
		int lst=0;
		for(int i=1;i<=n;i++){
			if(a[i]==lst)++lst;
		}
		clear(que);
		int sum=0;
		for(int i=n;i>=1;i--){
			if(k==0)break;
			if(a[i]>=maxn && a[i]!=a[i+1]){
				sum+=ma[a[i]];
				que.push({-ma[a[i]],a[i]});
			}
			if(a[i]<maxn)break;
		}
		if(sum<k){
			for(int i=n;i>=1;i--){
				if(k==0)break;
				if(a[i]>=maxn){
					k--;
					ma[a[i]]--;
					++cnt;
					if(ma[a[i]]==0)--cnt;
					ma[lst]++;
					a[i]=lst;
					++lst;
					while(ma[lst]){
						++lst;
					}
				}
				if(a[i]<maxn)break;
			}
		}
		else{
			while(!que.empty()){
				int u=-que.top().first,v=que.top().second;
				que.pop();
				if(u<=k){
					while(u){
						while(ma[lst])++lst;
						k--;
						u--;
						ma[v]--;
						ma[lst]++;
						cnt++;
						if(ma[v]==0)cnt--;
					}
				}
				else{
					while(k){
						while(ma[lst])++lst;
						k--;
						u--;
						ma[v]--;
						ma[lst]++;
						cnt++;
						if(ma[v]==0)cnt--;
					}
				}
				if(k==0)break;
			}
		}
		for(int i=n;i>=1;i--){
			if(k==0)break;
			if(a[i]>=maxn && ma[a[i]]==1){
				k--;
				ma[a[i]]--;
				++cnt;
				if(ma[a[i]]==0)--cnt;
				ma[lst]++;
				a[i]=lst;
				++lst;
				while(ma[lst]){
					++lst;
				}
			}
			else break;
		}
		for(int i=1;i<=n;i++){
			while(k>0 && ma[a[i]]>1){
				k--;
				ma[a[i]]--;
				ma[lst]++;
				lst++;
				++cnt;
			}
		}
		for(int i=1;i<=n;i++){
			if(a[i]==lst)++lst;
		}
		cout<<cnt-maxn<<"\n";
	}
	return 0;
}
2025/1/21 21:53
加载中...