这题 花了我好久时间啊 卧槽 ....
但是 也越来越迷茫了 有点觉得 acm带给了你什么?
现在 已经不再向当初在自己OJ那样刷题 来追求ranklist =-=
我们应该是获得思维上的提高 那么 刷题 不是感觉回到了 高三时代吗? 只是换了种形式
所以 我也不知道了
现在 每天 有时间 就尽量能做到1 2个好题
**********************************************碎碎念
这题的数据很大啊 但内存又给了足足有102400 K 太大了 一下子 把题目难度给降低了 这样使得你即使去开10000000的数组都可以
但我们应该是离散化它 去开一个100000的数组来实现
发现 我线段树的时候 也遇到过离散化 但我至今处理不好 W T F
所以 这个离散化 又花了好久 但我觉得相比 线段树的处理 简单多了
一般来说 对于 离散化处理 我们就是将输入的数据X Y存入一个数组 这样即使数据是 1 200000 34 23我们就需要一个长度为4的数组 sort一遍后变成了1 23 34 200000
那么 这时候 200000已经映射成为----->4了 我们把它当作4来处理了 同时 这边你可能会遇到情况是 给你的数据中出现了相同的数字 没关系 我们只要再sort一遍之后 再进行下
unique()函数 就可以 注意 它返回的是指针 所以需要-arr(假设这是数组的名字)那么就可以了
这题 当时 我在想输入X Y的时候 那么是要将X Y关联起来的 那么 一起存入一个结构体中可以了 好像C++中提供一个叫pair的对 也能实现这个功能 但我用不好
然后 当我们unique完成后 此时数组中的元素都是独一无二的了 然后我们将其进行映射 即mapmp mp[1] = 1 mp[23] = 2 mp[34] = 3 mp[200000] =4这样的结果得到
最后 就如同普通并查集一样了for i 0->n do find && union OK
对于 这个find提一句 一般 最好还是都加上路径压缩 这个实在节约了好多时间啊 还有对于 union操作 一般是会多一步rank[x]与rank[y]的判断 你可以把它理解为X 和 Y根结点深度的比较 一般会选择 将深度小的根节点接到大的根节点下面 但似乎 有时候 任意操作 对时间影响并不是很大吧
噢 对了 对于 这题 当N=0的时候 要输出1 因为1对都没有 那就是有单个 那就是1个人 这点题目中 提到了
我想 以后的每篇博客 我都尽量多点废话 =-= 可能也就持续 3分钟的热度 我也不知道。。
1 #include
2 #include
3 #include
View Code
today:
只怕爱情的箴言听太多 用脑筋多余用情
经验是钥匙而不是枷锁
每一次恋爱都好像没受伤过
像孩子一样天真地享受花火 想做什么就做