您的位置:首页 > Web前端

并查集 xcoj 1234 ZJTZYRC筛offer

2016-05-22 22:37 288 查看


1234: ZJTZYRC筛offer

时间限制: 5 Sec  内存限制: 128 MB
提交: 40  解决: 10

标签
提交统计讨论版


题目描述

ZJTZYRC同学作为牛头冲最强就业战斗力,每天都会收到大量offer。 有一天ZJTZYRC同学决定筛选一下offer,就像hr筛简历一样。 首先,ZJTZYRC同学把所有offer进行了一次排名,依次从1到n。 接着,ZJTZYRC同学根据各方面信息,把某两个offer同归为两者之中较高的排名。如果某个offer有相同排名的其他offer,那么其他offer也会被归入较高的排名。 注意该操作不会导致其余offer排名变动。
偶尔,ZJTZYRC同学会想知道某个offer究竟被他排名到哪儿去了,偶尔也会想要知道,当前还剩下多少个排名等级。 偶尔,ZJTZYRC同学会脑袋抽风,把两个相同等级的公司合并,此时无视该操作就行。


输入

第一行一个n,表示有多少家公司的offer。 接下来n行,每行一个公司名称,表示ZJTZYRC收到了这家公司的offer。保证公司名称是唯一的。公司名称的顺序对应它的初始排名(1~n) 第n+1行一个数字m,表示ZJTZYRC同学进行了总共几次操作。 接下来m行,每行表示一个操作。操作描述如下: "a 公司名a 公司名b":ZJTZYRC把这两家公司合并。 "q 公司名":ZJTZYRC想要知道这家公司当前的排名。 "t":ZJTZYRC希望知道当前还有多少个排名等级
我们保证n<=10000,m<=20000,公司名称是一串大写字母开头的英文字符(不包含任何空格在内的特殊字符)


输出

对于每个q操作,输出一行包含一个整数表示这家公司当前的排名。 对于每个t操作,输出一行包含一个整数表示当前还有多少个排名等级。


样例输入

5TencentHuaweiShanbeiBaiduAli7ta Baidu Huaweia Shanbei Alia Baidu Aliq
Tencentq Baidut


样例输出

5122

提交统计讨论版

并查集与map联用,比赛的时候脑子抽了......

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef long double LD;
const double pi = acos(-1.0);
///////////////////////////////

int par[10008];
map<string, int>M;

int find(int u) {
if (u == par[u]) {
return u;
}
else {
return par[u] = find(par[u]);
}
}

void aunion (int a, int b) {
int x = find(a);
int y = find(b);

if (x<y) {
par[y] = x;
}
else{
par[x] = y;
}
}

///////////////////////////////
int main(int argc, char**argv) {
//ios_base::sync_with_stdio(0); cin.tie(0);
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
////////////////////////////

int n, m;
cin >> n;
for (int i = 1; i <= n; i++) {
string in;
cin >> in;
M[in] = i;
}

cin >> m;

for (int i = 1; i <= n; i++) {
par[i] = i;
}

while (m--) {
char sw[3];
scanf("%s",sw);

if (sw[0] == 't') {
int ans = 0;

for (int i = 1; i <= n; i++) {
if (find(i) == i) {
ans++;
}
}

printf("%d\n",ans);
}
if (sw[0] == 'a') {
string fr;
string se;
cin >> fr >> se;

int u = M[fr];
int v = M[se];

aunion(u, v);

}
if (sw[0] == 'q') {

string in;
cin >> in;

int u = M[in];

int ans = find(u);

printf("%d\n",ans);

}

}

////////////////////////////
//system("pause");
return 0;

}
//END

/**************************************************************
Problem: 1234
User: 2015217298
Language: C++
Result: 正确
Time:4469 ms
Memory:2608 kb
****************************************************************/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xcoj 数据结构