题目链接: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. servlet操作数据库

    工具:myeclipse 数据库工具:mysql java ee操作数据库,首先要导入数据库驱动文件,我用的是mysql 刚开始,很多人代码正确但是就是连接不上,原因就是忘了驱动文件的导入. 我的驱动 ...

  2. C#通过WebBrowser快速扒站思路积累大量着陆页列表

    现在工作方向已经越来越倾向于项目产品运营相关的东西.对线上运营也有了一定程度的了解. 配合一些技术性的操作,能极大的便利工作中的各种高难度任务,快速提升自我,积累丰富的经验和资源. 以近期制作LP为例 ...

  3. React使用笔记2-React Components的生命周期

    Date: 2015-11-27 21:23 Category: Web Tags: JavaScript Author: 刘理想 [toc] 1. React Components的生命周期 Rea ...

  4. (Problem 73)Counting fractions in a range

    Consider the fraction, n/d, where n and d are positive integers. If nd and HCF(n,d)=1, it is called ...

  5. 基于FPGA的信号消抖

    上一篇写了一个按键消抖,按键消抖需要一个计数器.可是有些信号是不需要这么负责的,仅仅是抖动而已.于是我在上一篇博文的基础上做了一点修改,于是有了这个信号消抖的程序 module sig_nojitte ...

  6. HTTP基本协议(查看网页代码)

    此示例已实现查看网页的代码来理解HTTP基本协议: (返回的是百度首页的网页代码) import java.io.BufferedReader; import java.io.IOException; ...

  7. Android JNI入门第二篇——Java参数类型与本地参数类型对照

    前面一篇通过简单的例子介绍了android中JNI的使用.这一篇从基础上了解一些Java参数类型与本地参数类型区别. 1)        java中的返回值void和JNI中的void是完全对应的哦! ...

  8. c#程序添加其他网站的webservice引用。

    前言: 有A网站,B网站两个网站独立运行.某一天,需要两个网站进行合作来完成一件事,比如用A网站接收一些数据进行处理,存入中转数据库,B网站定时去取数据进入自己的系统进行处理. 可能我们会先想到在B网 ...

  9. 控制台console使用MFC库函数,Cout输出CString的方法

    新建工程的时候选择:Win32 Console Application 在向导的地方勾选MFC头文件支持,确认即可 等待初始化文件完成后,VS2010会自动打开 项目名.cpp的文件 其中int _t ...

  10. java代码获取ip地址

    public class IpTool { public static void main(String[] args) { IpTool ipTool=new IpTool(); System.ou ...