题目链接:http://acm.swust.edu.cn/problem/1091/

Time limit(ms): 1000      Memory limit(kb): 32768
 

人都有缺钱的时候,缺钱的时候要是有个朋友肯帮助你,那将是一件非常幸福的事情。有N个人(编号为1到N),一开始他们互相都不认识,后来发生了M件事情,事情分为2个种类,1:A和B成为了朋友,并且A的所有朋友都成了B的朋友,B的所有朋友也都成了A的朋友。2:A缺钱了,请求帮助,他需要向他朋友中钱最多的请求帮助,若不止一位,选择编号最小的。

Description

多组测试数据,每组第一行是整数N(2<=N<=100000),表示有N个人,第二行N个数据,依次表示每个人有多少钱,第三行是M(1<=M<=100000),表示发生了M个事件。接下来是M行,首先输入事件种类P(1或者2),然后是对应的两个或者一个整数A,B或者A。数据保证都在32位以内。

Input

对于每一个事件2,输出A需要请求的人的编号,若没有人能够帮助他,输出"NO ONE CAN HELP!"。

Output
1
2
3
4
5
6
7
3
1 2 3
3
2 1
1 1 3
2 1
 
Sample Input
1
2
3
NO ONE CAN HELP!
3
 
Sample Output
输出换行请使用\r\n
 
解题思路:直接的一个并查集能过所有的数据,但是数据量过大,单纯的并查集会直接超时;
     那么在使用并查集将最大与次大元素找出,然后维护就可以了
(之所以找最大和次大,在并查集合并过程中初始化最大元素为自己,恩,你懂得~~)
代码如下:
 #include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
int n, m, a, b, c, f[], val[];
struct tuhao{
int pos, money;
};
struct node{
tuhao max[];
}x[];
int cmp(const void *x, const void *y){
if ((*(tuhao *)x).money == (*(tuhao *)y).money)
return (*(tuhao *)x).pos - (*(tuhao *)y).pos;
return (*(tuhao *)y).money - (*(tuhao *)x).money;
}
void init(){
memset(x, , sizeof(x));
for (int i = ; i <= n; i++){
x[i].max[].money = val[i];
x[i].max[].pos = f[i] = i; }
}
int findset(int k){
int i = k, j = k, r;
while (i != f[i])
i = f[i];
while (j != i){
r = f[j];
f[j] = i;
j = r;
}
return i;
}
void mergy(int a, int b){
int tx = findset(a), ty = findset(b), i;
if (tx != ty){
f[ty] = tx;
for (i = ; i < ; i++){
x[tx].max[i].pos = x[ty].max[i - ].pos;
x[tx].max[i].money = x[ty].max[i - ].money;
}
qsort(x[tx].max, , sizeof(x[tx].max[]), cmp);
for (i = ; i < ; i++)
x[tx].max[i].pos = x[tx].max[i].money = ;
}
}
void Search(int k){
int v = findset(k);
if (!x[v].max[].pos)
cout << "NO ONE CAN HELP!\r\n";
else
cout << (x[v].max[].pos == k ? x[v].max[].pos : x[v].max[].pos) << "\r\n";
}
int main(){
while (cin >> n){
for (int i = ; i <= n; i++)
cin >> val[i];
init();
cin >> m;
for (int i = ; i < m; i++){
cin >> a;
switch (a){
case :cin >> b >> c; mergy(b, c); break;
default:cin >> b; Search(b); break;
}
}
}
return ;
}

[Swust OJ 1091]--土豪我们做朋友吧(并查集,最值维护)的更多相关文章

  1. [swustoj 1091] 土豪我们做朋友吧

    土豪我们做朋友吧(1091) 问题描述: 人都有缺钱的时候,缺钱的时候要是有个朋友肯帮助你,那将是一件非常幸福的事情.有N个人(编号为1到N),一开始他们互相都不认识,后来发生了M件事情,事情分为2个 ...

  2. 九度OJ 朋友圈 -- 并查集

    题目地址:http://ac.jobdu.com/problem.php?pid=1526 题目描述: 假如已知有n个人和m对好友关系(存于数字r).如果两个人是直接或间接的好友(好友的好友的好友.. ...

  3. 九度OJ 1156:谁是你的潜在朋友 (并查集)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5802 解决:2593 题目描述: "臭味相投"--这是我们描述朋友时喜欢用的词汇.两个人是朋友通常意味着他们存在着许多 ...

  4. 值得一做》关于并查集的进化题目 BZOJ1015(BZOJ第一页计划)(normal-)

    这道题和以前做过的一道经典的洪水冲桥问题很像,主要做法是逆向思维.(BZOJ第10道非SB题纪念) 先给出题目 Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者 ...

  5. 洛谷OJ P1196 银河英雄传说(带权并查集)

    题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...

  6. 并查集练习(0743) SWUST OJ

    #include<iostream> #include<cstring> using namespace std; ]; int n,m,l,ci,di; int root(i ...

  7. [Swust OJ 772]--Friend(并查集+map的运用)

    题目链接:http://acm.swust.edu.cn/problem/772/ Time limit(ms): 1000 Memory limit(kb): 65535    Descriptio ...

  8. [Swust OJ 404]--最小代价树(动态规划)

    题目链接:http://acm.swust.edu.cn/problem/code/745255/ Time limit(ms): 1000 Memory limit(kb): 65535   Des ...

  9. [Swust OJ 649]--NBA Finals(dp,后台略(hen)坑)

    题目链接:http://acm.swust.edu.cn/problem/649/ Time limit(ms): 1000 Memory limit(kb): 65535 Consider two ...

随机推荐

  1. 5.6.1 Boolean类型

    Boolean类型是与布尔值对应的引用类型.要创建Boolean对象,可以像下面这样调用Boolean构造函数并传入true或false值. var booleanObject=new Boolean ...

  2. 百度下载google 浏览器安装失败

    installer integrity check has failed. Common causes include incomplete download and damaged media co ...

  3. sourceTree安装与使用

    1,下载并安装 sourceTree http://downloads.atlassian.com/software/sourcetree/windows/SourceTreeSetup_1.6.14 ...

  4. [LeetCode]题解(python):072-Edit Distance

    题目来源: https://leetcode.com/problems/edit-distance/ 题意分析: word1最少通过多少步可以变成word2.word1只能进行一下的操作.a)插入一个 ...

  5. ORA-20000: ORU-10027: buffer overflow, limit of 10000 bytes

        要用dbms_output.put_line来输出语句,遇到以下错误: ERROR 位于第 1 行: ORA-20000: ORU-10027: buffer overflow, limit ...

  6. 20 你应该知道的PHP库

    下面是一些非常有用的PHP类库,相信一定可以为你的WEB开发提供更好和更为快速的方法. 图表库 下面的类库可以让你很简的创建复杂的图表和图片.当然,它们需要GD库的支持. pChart – 一个可以创 ...

  7. 【转】 IE6 IE7 IE8 css bug兼容性解决方法总结归纳

    1:li边距“无故”增加 任何事情都是有原因的,li边距也不例外. 先描述一下具体状况:有些时候li边距会突然增 加很多,值也不固定(只在IE6/IE7有这种现象),让人摸不着头脑,仔细“研究”发现是 ...

  8. Qtwebkit配置,设置交叉编译环境 - croop520的专栏 - 博客频道 - CSDN.NET

    Qtwebkit配置,设置交叉编译环境 - croop520的专栏 - 博客频道 - CSDN.NET Qtwebkit配置,设置交叉编译环境 分类: Qt Webkit 2012-04-12 15: ...

  9. nginx自定义模块记录上游服务器特定响应头

    功能,服务器通过扩展自定义命令,记录上游的服务器返回的特定响应头内容,记录到本地文件中 代码如下: /* * Copyright (C) Ciaos */ #include <ngx_confi ...

  10. Dating with girls(1)(二分+map+set)

    Dating with girls(1) Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...