题解:CF1433D Districts Connection

一道简单构造题,一次性 AC。

一种想法是将所有值一样的点全部连到同一个不同值的点上,这样就是所有同一种值的点都有同一个父亲,即可避免连在一起的问题,无解的情况就是只有一种值。

时间复杂度 O(n2)O(n^2)

AC code:

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e6+5;
int t,n,a[maxn],c[maxn];
void solve(){
	cin>>n;
	int cnt=0;\
	unordered_map<int,unordered_map<int,int>>pm;//去重数组
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	bool flag=0;
	for(int i=1;i<=n;i++){//枚举每个点
		int pos=0;//找到的位置
		for(int j=1;j<=n;j++){
			if(a[j]!=a[i]){//第一个不同的值
				pos=j;
				break;
			}
		}
		if(pos==0){//没找到,即全是一个值
			cout<<"NO"<<endl;//无解
			return;
		}
		for(int j=1;j<=n;j++){
			if(a[j]==a[i]){//找与 i 相同的值
				if(flag==0){//没有输出 YES
					cout<<"YES"<<endl;//输出
					flag=1;//标记
				}
				if(pm[pos][j]==1){//去重
					continue;
				}
				cout<<pos<<' '<<j<<endl;//pos 与 j 是父子关系
				pm[pos][j]=pm[j][pos]=1;//标记去重数组
			}
		}
	}
	
}
signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}
posted @   KK_SpongeBob  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
点击右上角即可分享
微信分享提示