并查集 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 AliqTencentq 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
****************************************************************/
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)