博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hrbust 1041(并查集)
阅读量:5096 次
发布时间:2019-06-13

本文共 1551 字,大约阅读时间需要 5 分钟。

题意:长度为n的Chocolate,为n份1,2,3...n,每操作一次假如是[i,j],则i到j的(包括i, 和j)被买完。

要求输出每次操作能买的Chocolate有多少份。

例如;

6 4

1 2//可以买1,2 两份。

4 4//可以买4一份。

1 3//因为1,2已经买过了,只剩下3了,所以只能买3一份。

1 4//1,2,3,4都买过了。所以输出0。

#include 
#include
const int maxn = 10000001;int find[maxn];//find[i]存储的是前一步指向的。int cal(int i){ return i==find[i] ? i : find[i] = cal(find[i]);//并查集}void nextcal(int i, int j)//小的指向大的{ int x = cal(i); int y = cal(j); if (x != y) { if (x > y) { find[y] = x; } else { find[x] = y; } }}int main(void){ int t, n, m; int a, b, i; int res; scanf("%d", &t); while (t--) { scanf("%d%d", &n, &m); for (i=1; i<=n+1; i++) { find[i] = i; } while (m--) { res = 0; scanf("%d%d", &a, &b); for (i=a; i<=b;) { if ( i== find[i]) { //printf("cal(%d)==%d, find[%d]==%d\n",i, cal(i), i, find[i]); res++; nextcal(i, b+1); //printf("cal(%d)==%d, find[%d]==%d\n",i, cal(i), i, find[i]); i++; } else { //printf("cal(%d)==%d, find[%d]==%d\n",i, cal(i), i, find[i]); i = cal(i);//关键优化,注意不是find[i]; } } printf("%d\n", res); } } return 0;}

 

 

 

转载于:https://www.cnblogs.com/bucuo/archive/2013/03/30/2990170.html

你可能感兴趣的文章
重构代码 —— 函数即变量(Replace temp with Query)
查看>>
Bootstrap栅格学习
查看>>
程序员的数学
查看>>
聚合与组合
查看>>
洛谷 P2089 烤鸡【DFS递归/10重枚举】
查看>>
我眼中的技术地图
查看>>
lc 145. Binary Tree Postorder Traversal
查看>>
在centos上开关tomcat
查看>>
无人值守安装linux系统
查看>>
黑马程序员——2 注释
查看>>
android dialog使用自定义布局 设置窗体大小位置
查看>>
ionic2+ 基础
查看>>
查询消除重复行
查看>>
[leetcode]Minimum Path Sum
查看>>
内存管理 浅析 内存管理/内存优化技巧
查看>>
Json格式的字符串转换为正常显示的日期格式
查看>>
[转]Android xxx is not translated in yyy, zzz 的解决方法
查看>>
Mobiscroll脚本破解,去除Trial和注册时间限制【转】
查看>>
Redis快速入门
查看>>
BootStrap---2.表格和按钮
查看>>