有N个独立的点,标号为1,2,3,…N。现在要把他们连接起来,每次选取x和y两个点,x是它所处集合的中心,y不一定是它所处集合的中心,然后在xy间连一条长度为|x-y|mod1000的边。然后把这两个集合合并起来,新集合的中心是原y所处的集合的中心。有两种操作,I x y表示选取x和y合并。E x表示查询x到它所处集合中心的距离。O表示结束。

并查集的套路,但是在查询的时候,路径压缩的时候,更新点到集合中心的距离即可。

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <string>
using namespace std;
#define maxn 100005
int set[maxn];
//int size[maxn];//结点数
int dis[maxn];
//int center[maxn];
int N;
void init_set()
{memset(dis, 0, sizeof(int)*maxn);for (int i = 0; i<maxn; ++i){set[i] = i;//size[i] = 1;//center[i] = 1;}
}
int findSet(int x)//路径压缩
{if (x == set[x])return x;else{/*int fx = set[x];dis[x] += dis[fx];set[x] = set[fx];dis[x] += dis[fx];*/int fx = set[x];int rx = findSet(fx);dis[x] += dis[fx];set[x] = rx;return rx;}
}
void unionSet(int x, int y)
{//int fx = findSet(x);int fy = findSet(y);if (fy == x)return;set[x] = fy;dis[x] = dis[x] + abs(x - y) % 1000 + dis[y];
}
int main()
{//freopen("input.txt", "r", stdin);scanf("%d", &N);init_set();char cmd[30];memset(cmd, 0, sizeof(char) * 30);while (gets(cmd)){if (cmd[0] == 'O')break;else if (cmd[0] == 'I'){int x = 0, y = 0;int i;for (i = 1; !(cmd[i] >= '0'&&cmd[i] <= '9'); ++i);for (; cmd[i] >= '0'&&cmd[i] <= '9'; ++i)x = x * 10 + cmd[i] - '0';for (; !(cmd[i] >= '0'&&cmd[i] <= '9'); ++i);for (; cmd[i] >= '0'&&cmd[i] <= '9'; ++i)y = y * 10 + cmd[i] - '0';unionSet(x, y);}else if (cmd[0] == 'E'){int x = 0, i;for (i = 1; !(cmd[i] >= '0'&&cmd[i] <= '9'); ++i);for (; cmd[i] >= '0'&&cmd[i] <= '9'; ++i)x = x * 10 + cmd[i] - '0';findSet(x);printf("%d\n", dis[x]);}memset(cmd, 0, sizeof(char) * 30);}//system("pause");//while (1);return 0;
}

CODJ 1070 秋实大哥打游戏 并查集相关推荐

  1. CDOJ 1070 秋实大哥打游戏 带权并查集

    链接 F - 秋实大哥打游戏 Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu Submit ...

  2. cdoj 1070 秋实大哥打游戏 带权并查集

    题目链接: http://acm.uestc.edu.cn/#/problem/show/1070 题意: 题解: 带权并查集 每次往上更新的时候,顺便把边权更新了就好 记住得路径压缩 代码: 1 # ...

  3. 2015 UESTC 数据结构专题H题 秋实大哥打游戏 带权并查集

    秋实大哥打游戏 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 Descr ...

  4. E - 秋实大哥与战争

    秋实大哥与战争 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit S ...

  5. [UESTC 1061]秋实大哥与战争

    男儿何不带吴钩,收取关山五十州. 征战天下是秋实大哥一生的梦想,所以今天他又在练习一个对战游戏. 秋实大哥命令所有士兵从左到右排成了一行来抵挡敌人的攻击. 敌方每一次会攻击一个士兵,这个士兵就会阵亡, ...

  6. 2015 UESTC 数据结构专题D题 秋实大哥与战争 变化版本的线段树,合并区间,单点查询...

    D - 秋实大哥与战争 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 D ...

  7. cdoj 2015数据结构专题:D - 秋实大哥与战争

    男儿何不带吴钩,收取关山五十州. 征战天下是秋实大哥一生的梦想,所以今天他又在练习一个对战游戏. 秋实大哥命令所有士兵从左到右排成了一行来抵挡敌人的攻击. 敌方每一次会攻击一个士兵,这个士兵就会阵亡, ...

  8. UESTC-1057 秋实大哥与花(线段树+成段加减+区间求和)

    秋实大哥与花 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit St ...

  9. uestc 1073 秋实大哥与线段树 Label:线段树

    秋实大哥与线段树 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) "学 ...

最新文章

  1. IDC与村村乐合作服务中国农村市场
  2. python中的zip()函数和map()函数
  3. matlab中svd函数用法总结
  4. ACM技巧 - O(1)快速乘(玄学) 总结
  5. 关于C#监视剪贴板信息
  6. svn外网虚拟服务器设置,svn虚拟服务器设置路由器设置
  7. 每天生成 45 亿字符的 GPT-3,真能取代人工?
  8. 【java读书笔记】——java开篇宏观把控 + HelloWorld
  9. 有效管理云计算成本的多个措施
  10. 您实际上可以通过这些YouTube视频了解GPT-3
  11. Web项目部署到阿里云
  12. Win10访问不了Samba网络共享的原因以及解决办法
  13. 《佛密诸事》第二章 宇宙诸现象
  14. 英语影视台词---无敌破坏王2大脑互联网(2)(我完全被震惊了)
  15. 十六进制数据的CRC16校验码自写软件
  16. Python中的取模运算方法
  17. varbinary 转换成 varchar
  18. 《游梦人·诗的诞生》
  19. RDKit | 基于RDKit进行构象搜索:构型异构体生成和MMFF聚类
  20. 澳禁止华为参与5G网络建设;锤子将编写自己的OS;国产处理器兆芯可运行Windows,已试制出Intel i5级处理器丨Q新闻...

热门文章

  1. 芯动科技2023校招 FPGA岗位笔试
  2. 树莓派GPIO控制/使用的教程
  3. 我花了3天时间整理出这5款黑科技小程序,值得你们玩上一整天
  4. RN:分包/拆包技术调研
  5. 「分布式专题」分布式事务 就这?太简单了吧
  6. Dex文件格式扫描器:特征API的检测和扫描(小工具一枚)
  7. 鸭梨笔记本上市!!!超越苹果和微软!!
  8. UEFI Specification 第二章 概述
  9. 经典利用永恒之蓝漏洞对Windows操作系统进行攻击
  10. try的动词用法_try的用法都有什么