首页 > 其他分享 > [蓝桥杯 2019 省 A] 修改数组 ———并查集练习(大学复健)

[蓝桥杯 2019 省 A] 修改数组 ———并查集练习(大学复健)

时间:2023-03-09 21:59:35浏览次数:50  
标签:复健 ch int 查集 蓝桥 while isdigit getchar

本题拿到第一反应桶排序思想似乎可以水过,但是很明显出问题了。

#include <bits/stdc++.h>
using namespace std;

int N;

inline int kd(){
	int x=0,f=1;char ch=getchar();
	while(isdigit(ch)==false){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)==true){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*f;
}
int tong[5000009];
int num[500009];
int main(){
	cin>>N;
	for(int i=1;i<=N;i++){
		num[i]=kd();
		if(tong[num[i]]==1){
			while(tong[num[i]]!=0){
				num[i]++;
			}
			tong[num[i]]++;
			printf("%d ",num[i]);
		}
		else{
			tong[num[i]]++;
			printf("%d ",num[i]);
		}
		//for(int j=1;j<=10;j++)cout<<tong[j]<<" ";cout<<endl;
	}
	return 0;
} 

在代码中有一个一步一步往前跳的步骤,非常耗时间,所以最后T的两个点是因为这个地方的复杂度过高

while(tong[num[i]]!=0){
	num[i]++;
}

那么考虑什么算法可以快速查找或者跳过呢?

很明显,倍增不行,链表不行(其实想一下和并查集差不多)

那么与这种优化相似的并查集的路径压缩非常适合这种情况捏!!!()


#include <bits/stdc++.h>
using namespace std;

int N;
int num[500009];
int fa[500009];
inline int kd(){
	int x=0,f=1;char ch=getchar();
	while(isdigit(ch)==false){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)==true){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*f;
}

int find_fa(int now){
	if(fa[now]==now)return now;
	return fa[now]=find_fa(fa[now]);
}

int main(){
	cin>>N;
	for(int i=1;i<=100005;i++)fa[i]=i;
	for(int i=1;i<=N;i++){
		num[i]=kd();
		num[i]=find_fa(num[i]);
		fa[num[i]]=find_fa(num[i]+1);
		//for(int j=1;j<=5;j++)cout<<fa[j]<<" ";cout<<endl;
	}
	for(int i=1;i<=N;i++)cout<<num[i]<<" "; 
	return 0;
}

标签:复健,ch,int,查集,蓝桥,while,isdigit,getchar
From: https://www.cnblogs.com/1129-tangqiyuan/p/17201595.html

相关文章

  • SPAF(虽然已经死了)判断负环—(大学复健第二篇)
    SPAF判断负环存在其实就是bellman-fold的优化,加了一个队列来判断是否需要松弛操作。而判断负环上其实由于如果存在那么一定会有边被多次访问,而一定有负环的时候,访问数一定......
  • 蓝桥-13届-C++-B组-省赛-I题-李白打酒加强版
    最直接的做法,算是回溯吧:生成指定01数的序列挨个检查是否满足题意并计数能不能将生成和判断的过程统一呢?能不能记忆前面的序列呢瞄一眼题解,往动态规划的方向上靠#inc......
  • 2022年第十三届蓝桥杯大赛软件类省赛C/C++大学A组真题
    Preface周末没什么比赛打索性开始准备下蓝桥杯,然后就想着找一下去年的真题来做一下结果yysy去年的真题说实话有点难度的,感觉出题风格偏向OI比赛而和ACM的风格不太像啊感......
  • 蓝桥杯-考勤刷卡
    蓝桥杯-考勤刷卡​​1、问题描述​​​​2、解题思路​​​​3、代码实现​​1、问题描述  小蓝负责一个公司的考勤系统,他每天都需要根据员工刷卡的情况来确定每个员工......
  • 蓝桥杯-超级质数
    蓝桥杯-超级质数​​1、问题描述​​​​2、解题思路​​​​3、代码实现​​1、问题描述  如果一个质数P的每位数字都是质数,而且每两个相邻的数字组成的两位数是质......
  • 2020年蓝桥杯省赛 数字三角形 ------动态规划
    。。。。。。。。。 importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannerinput=newScanner(System.in......
  • 蓝桥杯 & 青蛙过河(最快贪心) (不用并查集)
      点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=1000000+7;lla[N];llb[N];llc[N];lln,x;boolcheck(ll......
  • 蓝桥杯集训资料题
    6296:迷宫描述 一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n*n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行。同......
  • 并查集模板
    #include<bits/stdc++.h>usingnamespacestd;intfa[10005];intm,n;intfind(intx){ if(fa[x]!=x){ fa[x]=find(fa[x]); } returnfa[x];}booljudge(intx,......
  • 蓝桥杯备战日志(Python)20-受伤的皇后-(矩阵搜索、递归)
    原题有一个  的国际象棋棋盘( 行  列的方格图),请在棋盘中摆放  个受伤的国际象棋皇后,要求:任何两个皇后不在同一行。任何两个皇后不在同一列。如果两个皇后在同一条45......