每周编程题 (3/5 - 9/5)
时间:2014-05-23
来源:互联网
本周推介:
http://www.spoj.com/problems/NBIN/
另外,以下两题只能 TLE,请指教:
A. http://www.spoj.com/problems/IITWPC4D/
B. http://www.spoj.com/problems/BGRAVITY/
遇到困难,请试试睇 TopCoder 教学网页,亦欢迎发问。
常用 SPOJ 题术语解释:
AC - 代表 Accepted,表示答案符合要求,已被接受。WA - 代表 Wrong Answer,表示答案出错。TLE - 代表 Time Limited Exceeded,表示超出时间限制。RTE - 代表 Run Time Error,表示执行时出现错误。
http://www.spoj.com/problems/NBIN/
另外,以下两题只能 TLE,请指教:
A. http://www.spoj.com/problems/IITWPC4D/
B. http://www.spoj.com/problems/BGRAVITY/
遇到困难,请试试睇 TopCoder 教学网页,亦欢迎发问。
常用 SPOJ 题术语解释:
AC - 代表 Accepted,表示答案符合要求,已被接受。WA - 代表 Wrong Answer,表示答案出错。TLE - 代表 Time Limited Exceeded,表示超出时间限制。RTE - 代表 Run Time Error,表示执行时出现错误。
作者: fitcat07 发布时间: 2014-05-23
只睇得明第三题

作者: Susan﹏汪汪 发布时间: 2014-05-23
全部明白了
[ 本帖最后由 Susan﹏汪汪 於 2014-5-3 10:44 PM 编辑 ]
[ 本帖最后由 Susan﹏汪汪 於 2014-5-3 10:44 PM 编辑 ]
作者: Susan﹏汪汪 发布时间: 2014-05-23
解决咗 A 题:IITWPC4D。
先讲测试方法。好简单,只要所有 i, A[ i ] <= i 都成立,就代表有唯一排列方法。
最直观方法:
假设阵列 A 能解。
1. 在阵列 A 中,搵最小值者,如相同,则选最大素引者,假设素引值为 i;
2. 设 H[ i ] = n,n = n - 1;
3. 将阵列 A 内素引大过 i 嘅所有元素减去一;
4. 重复 1,直至 n = 0。
但问题系,以上算法复杂度系 O(n^2)。因 n 最大系 100,000,O(n^2) = O(10^10),只能 TLE。
好明显,要及时完成,必须搵到一个 O(n log n) 或更好嘅算法。
先讲测试方法。好简单,只要所有 i, A[ i ] <= i 都成立,就代表有唯一排列方法。
最直观方法:
假设阵列 A 能解。
1. 在阵列 A 中,搵最小值者,如相同,则选最大素引者,假设素引值为 i;
2. 设 H[ i ] = n,n = n - 1;
3. 将阵列 A 内素引大过 i 嘅所有元素减去一;
4. 重复 1,直至 n = 0。
但问题系,以上算法复杂度系 O(n^2)。因 n 最大系 100,000,O(n^2) = O(10^10),只能 TLE。
好明显,要及时完成,必须搵到一个 O(n log n) 或更好嘅算法。
作者: fitcat07 发布时间: 2014-05-23
我利用线段树(segment tree),使到直观方法中步骤一及三,复杂度由 O(n) 变成 O(log n)。
实作步骤一并不困难,只要每个树节点内 (val, idx),记载住子树嘅最小值(val),相同取最大素引者(idx)。
树根内嘅 idx,就系之前方法所讲嘅 i。
实作步骤三就须要在节点中,加入一个栏 acc,用作表示此节点及两棵子树,都须要将值减去它 (val - acc),来计算真正嘅值。
受影响嘅节点,将 acc 加一。利用线段树特性,此动作只须更新 O(log n) 节点。
然后,将㨂选嘅 idx 相关节点(叶),改值为无限大,并由此向上更新整棵树。
我嘅完成时间并不理想,只系 1.25s,21 个人中排 18。
我谂系因为比我快嘅人,能将步骤一及三合拼,又或使用更高效率嘅数据结构。
至於点样做到,留番畀呢度嘅高人指点。
实作步骤一并不困难,只要每个树节点内 (val, idx),记载住子树嘅最小值(val),相同取最大素引者(idx)。
树根内嘅 idx,就系之前方法所讲嘅 i。
实作步骤三就须要在节点中,加入一个栏 acc,用作表示此节点及两棵子树,都须要将值减去它 (val - acc),来计算真正嘅值。
受影响嘅节点,将 acc 加一。利用线段树特性,此动作只须更新 O(log n) 节点。
然后,将㨂选嘅 idx 相关节点(叶),改值为无限大,并由此向上更新整棵树。
我嘅完成时间并不理想,只系 1.25s,21 个人中排 18。

我谂系因为比我快嘅人,能将步骤一及三合拼,又或使用更高效率嘅数据结构。
至於点样做到,留番畀呢度嘅高人指点。

作者: fitcat07 发布时间: 2014-05-23
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28