swust oj 1091--土豪我们做朋友吧(并查集,最值维护)

题目链接: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

解题思路:直接的一个并查集能过所有的数据,但是数据量过大,单纯的并查集会直接超时;

     那么在使用并查集将最大与次大元素找出,然后维护就可以了

(之所以找最大和次大,在并查集合并过程中初始化最大元素为自己,恩,你懂得~~)

代码如下:

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<cstring>
 4 using namespace std;
 5 int n, m, a, b, c, f[100001], val[100001];
 6 struct tuhao{
 7     int pos, money;
 8 };
 9 struct node{
10     tuhao max[4];
11 }x[100001];
12 int cmp(const void *x, const void *y){
13     if ((*(tuhao *)x).money == (*(tuhao *)y).money)
14         return (*(tuhao *)x).pos - (*(tuhao *)y).pos;
15     return (*(tuhao *)y).money - (*(tuhao *)x).money;
16 }
17 void init(){
18     memset(x, 0, sizeof(x));
19     for (int i = 1; i <= n; i++){
20         x[i].max[0].money = val[i];
21         x[i].max[0].pos = f[i] = i;
22
23     }
24 }
25 int findset(int k){
26     int i = k, j = k, r;
27     while (i != f[i])
28         i = f[i];
29     while (j != i){
30         r = f[j];
31         f[j] = i;
32         j = r;
33     }
34     return i;
35 }
36 void mergy(int a, int b){
37     int tx = findset(a), ty = findset(b), i;
38     if (tx != ty){
39         f[ty] = tx;
40         for (i = 2; i < 4; i++){
41             x[tx].max[i].pos = x[ty].max[i - 2].pos;
42             x[tx].max[i].money = x[ty].max[i - 2].money;
43         }
44         qsort(x[tx].max, 4, sizeof(x[tx].max[0]), cmp);
45         for (i = 2; i < 4; i++)
46             x[tx].max[i].pos = x[tx].max[i].money = 0;
47     }
48 }
49 void Search(int k){
50     int v = findset(k);
51     if (!x[v].max[1].pos)
52         cout << "NO ONE CAN HELP!\r\n";
53     else
54         cout << (x[v].max[0].pos == k ? x[v].max[1].pos : x[v].max[0].pos) << "\r\n";
55 }
56 int main(){
57     while (cin >> n){
58         for (int i = 1; i <= n; i++)
59             cin >> val[i];
60         init();
61         cin >> m;
62         for (int i = 0; i < m; i++){
63             cin >> a;
64             switch (a){
65             case 1:cin >> b >> c; mergy(b, c); break;
66             default:cin >> b; Search(b); break;
67             }
68         }
69     }
70     return 0;
71 }

时间: 2024-10-29 19:09:38

swust oj 1091--土豪我们做朋友吧(并查集,最值维护)的相关文章

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

题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压 顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨 威利组织麾下三万艘战舰迎敌. 杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气.在 这次决战中,他将巴米利恩星域战场划分成30000列,每列依次编号为1, 2, …, 30000.之后,他把自己的战舰也依次编号

并查集练习(0743) SWUST OJ

#include<iostream> #include<cstring> using namespace std; int a[1000005]; int n,m,l,ci,di; int root(int x) //找到根节点 { int r = x; while(r != a[r]) r = a[r]; int i = x,j; while(i != r) //压缩路径 { j = a[i]; a[i] = r; i = j; } return r; } void mix(in

线段树 [SWUST OJ 764] 校门外的树 Plus Plus

校门外的树 Plus Plus(0764) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 214 Accepted: 15 Description 西南某科技大学的校门外长度为 L 的公路上有一排树,每两棵相邻的树之间的间隔都是 1 米.我们可以把马路看成一个数轴,马路的一端在数轴 1 的位置,另一端在 L 的位置:数轴上的每个整数点,即 1,2,……,L,都种有一棵树. 现在要将这排树的某一段涂成某种颜色,给定 N 组区间[ 

swust oj 1026--Egg pain&#39;s hzf

题目链接:http://acm.swust.edu.cn/problem/1026/ Time limit(ms): 3000 Memory limit(kb): 65535 hzf is crazy about reading math recently,and he is thinking about a boring problem. Now there are n integers Arranged in a line.For each integer,he wants to know

SWUST OJ Euclid&#39;s Game(0099)

Euclid's Game(0099) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 1855 Accepted: 589 Description Starts with two unequal positive numbers (M,N and M>N) on the board. Two players move in turn. On each move, a player has to write on the boar

王小川清华大学毕业典礼演讲:我也有过学渣经历(和时间做朋友,要和华军、天空这些下载站做合作推广)

文讯网据新浪科技讯 7月4日上午消息,搜狗CEO王小川近日应邀在清华大学2016年毕业典礼上发表演讲,他在题为<和时间做朋友>的演讲中,讲诉了从清华毕业加入搜狐,并开始从无到有研发搜狗搜索的过程,希望通过创立搜狗的经历,向其学弟学妹讲诉从毕业到创业最大的感悟. 公开资料显示,王小川是清华大学1996级计算机系学生,并于2008年再度返校取得了清华大学经管学院EMBA学位. 王小川以自己为例作为开通,虽然大家都说他经历上很漂亮.但他说:“我也有不顺的时候,经历过很多的困难和挫折.先来说学渣的经历

从程序员到项目经理(17):不要试图和下属做朋友

在项目团队经常有一些比较能干的员工,为项目经理排忧解难,因此渐渐得到项目经理器重.由于互相依赖,两者很容易发展成为朋友关系,有的项目经理甚至将员工当作“心腹”看待,借此来笼络员工,这其实是一种很不明智的做法. 从广义上来说,同事也是朋友,同事之间也是存在友情的.在正常情况下,项目经理与每个人的距离是相等的,整个团队保持一种平衡.如果项目经理与某位员工建立了过于亲密的朋友关系,这种平衡将会被打破,从而影响整个团队的凝聚力. 1.得不偿失的朋友关系 表 面看上去,工作与朋友并不矛盾.人非草木,孰能无

swust oj 649--NBA Finals(dp,后台略(hen)坑)

题目链接:http://acm.swust.edu.cn/problem/649/ Time limit(ms): 1000 Memory limit(kb): 65535 Consider two teams, Lakers and Celtics, playing a series of NBA Finals until one of the teams wins n games. Assume that the probability of Lakers winning a game is

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

题目链接:http://acm.swust.edu.cn/problem/772/ Time limit(ms): 1000 Memory limit(kb): 65535 Description 每个人都有朋友,朋友也有很多种,比如: 石友--情谊坚贞的朋友. 挚友--志同道合的朋友. 益友--于己有帮助的朋友. 网友--在互联网结识的朋友. 闺友--闺房中无话不谈的朋友. 君子交:指道义之交,即在道义上相互支持的朋友. 竹马之交:少年时骑竹马为戏的朋友,指自幼相交的朋友,等等. 现在dear