区间模糊排序,给出对应点集,并统计对应点所落在的区间的次数
来源:互联网 发布:新会人民法院 淘宝拍卖 编辑:程序博客网 时间:2024/06/05 02:38
过程是
先对区间和点进行混合排序例如[a1,b1][a2,b2],[a3,b3],[a4,b4],[a5,b5]和点集[c1,c2,c3]
结果为[a1,a2,c1,a3,c2,b1,a4,b2,b3,c3,a5,b4,b5]
在排序的时候同时创建一个用于标记起始点结束点和点的列表
对结果中的每个c进行次数统计
程序中排序使用快速排序
import sysimport randomdef less_than_or_equal(num1, num2, let1, let2): return less_than(num1, num2, let1, let2) or \ equal(num1, num2, let1, let2)def less_than(num1, num2, let1, let2): return num1 < num2 or \ (num1 == num2 and let1 < let2)def equal(num1, num2, let1, let2): return num1 == num2 and let1 == let2def fast_count_segments(starts, ends, points): cnt = [0] * len(points) LEFT = 1#起始点为1,终止点为3,点为2,符合上面用于比较的函数:当起点终点和点相等是能达到排序为如下的效果[起点,点,终点] POINT = 2 RIGHT = 3 starts_l = [LEFT] * len(starts) ends_r = [RIGHT] * len(ends) points_p = [POINT] * len(points) pairs_number = starts + ends + points#排序列表 pairs_letter = starts_l + ends_r + points_p#标记列表 randomized_quick_sort(pairs_number, pairs_letter, 0, len(pairs_number) - 1) count_left = 0 point_counts = {} for p in points: point_counts[p] = 0 for i in range(len(pairs_number)):#当指针指向一次起点,+1,指向一次终点,-1,指向一次点,记录此时的count_left到dict中 if pairs_letter[i] == LEFT: count_left += 1 elif pairs_letter[i] == RIGHT: count_left -= 1 elif pairs_letter[i] == POINT: if point_counts[pairs_number[i]] == 0: point_counts[pairs_number[i]] += count_left for i in range(len(points)): cnt[i] = point_counts[points[i]] return cntdef partition3(a, b, l, r): x = a[l] letx = b[l] begin = l+1 end = l for i in range(l + 1, r + 1): if less_than_or_equal(a[i], x, b[i], letx): end += 1 a[i], a[end] = a[end], a[i] b[i], b[end] = b[end], b[i] if less_than(a[end], x, b[end], letx): a[begin], a[end] = a[end], a[begin] b[begin], b[end] = b[end], b[begin] begin += 1 a[l], a[begin-1] = a[begin-1], a[l] b[l], b[begin-1] = b[begin-1], b[l] return [begin, end]def randomized_quick_sort(a, b, l, r): if l >= r: return k = random.randint(l, r) a[l], a[k] = a[k], a[l] b[l], b[k] = b[k], b[l] #use partition3 [m1, m2] = partition3(a, b, l, r) randomized_quick_sort(a, b, l, m1 - 1); randomized_quick_sort(a, b, m2 + 1, r);if __name__ == '__main__': input = sys.stdin.read() data = list(map(int, input.split())) n = data[0] m = data[1] starts = data[2:2 * n + 2:2] ends = data[3:2 * n + 2:2] points = data[2 * n + 2:] #use fast_count_segments cnt = fast_count_segments(starts, ends, points) for x in cnt: print(x, end=' ')
0 0
- 区间模糊排序,给出对应点集,并统计对应点所落在的区间的次数
- Java中文所对应的编码区间
- 对区间的模糊排序
- 对区间的模糊排序
- 锚点 对应的位置
- 快速排序.对区间的模糊排序
- 构造函数使得任意小的区间所对应的值域都是整个实数域
- 从点对中构建二叉树,并查找两个节点所对应的最小公共祖先
- poj 3321 线段树(将点转换为对应区间)
- 对应Retina的一些注意点
- 取连续数据的最值,以及对应的区间。
- 找到被区间覆盖最多的点
- 求区间没被覆盖的点
- nyoj891找点(区间上的贪心)
- jsp乱码如何解决,给出三种以上的对应解决方案,并给出对应的程序案例;
- 1036: [ZJOI2008]树的统计Count 【树链剖分】【点权:单点更新区间求值】
- QAQ的区间统计
- QAQ的区间统计
- 倒序遍历链表
- SQL语句中null的应用。
- 笨小熊[字符数组字符个数统计]
- Linux操作系统位数查看
- 第七周作业2(LeetCode5)
- 区间模糊排序,给出对应点集,并统计对应点所落在的区间的次数
- 性能黄金法则
- java学习笔记4.10
- linux设置代理到局域网中的主机
- 正常盒模型和怪异盒模型
- 多表查询
- 运维小白的python之路(四)
- cvSetMouseCallback使用
- Hibernate中的SessionFactoty 、Session、Configuration