用了两个map一个数组做的,10TLE,求助……
  • 板块P2814 家谱
  • 楼主Her_Lingxiao
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/7/7 21:31
  • 上次更新2023/11/6 23:29:14
查看原帖
用了两个map一个数组做的,10TLE,求助……
255540
Her_Lingxiao楼主2020/7/7 21:31

自己昨晚突发奇想写得,有些复杂。

#include <iostream>
#include <cstdio>
#include <map>
#include <string>
using namespace std;
const int Maxn = int(5e4) + 4;
map<string/*儿子*/, string/*爸爸*/> member;
map<int/*编号*/, string/*人物*/> Linking;//链接并查集和map的map 
int Relative[Maxn];//并查集
//以下都是对并查集的操作
void Init()
{
	for(int i = 1; i <= Maxn; i++)
		Relative[i] = i;
}
int Find(int x)
{
	return x == Relative[x] ? x : Find(Relative[x]);
}
void Union(int x, int y)
{
	x = Find(x);
	y = Find(y);
	if(x != y)
		Relative[x] = Relative[y];
}
int main()
{
	int i = 0, Father;
	char sign;
	string name, father;
	Init();
	scanf("%c", &sign);
	while(sign != '$' && ++i)
	{
		cin >> name;
		switch(sign)
		{
			case '#':
				Father = i;//定父亲位置 
				father = name;//记录父亲名字 
				Linking[i] = name;//找到连接点
				//因为Father是值,所以不对其进行操作 
				#if 0 
				printf("\n对父亲的操作已做\n\n");
				#endif
				break;
			
			case '+':
				Union(i, Father);//归属父亲部下 
				Linking[i] = name;//找到连接点 
				member[name] = father;//由儿子映射到父亲
				#if 0 
				printf("\n对儿子的操作已做\n\n");
				#endif
				break;
			
			case '?':
				cout << name << " " << member[name];
				#if 0 
				printf("\n输出操作已做\n\n");
				#endif
				break;
			 
		}
	}
	
	return 0;
}
2020/7/7 21:31
加载中...