某点最大覆盖次数
2014-12-08 21:47
225 查看
题目链接 :点击打开链接官方题解:
我们可以将一条线段[xi,yi]分为两个端点xi和(yi)+1,在xi时该点会新加入一条线段,同样的,在(yi)+1时该点会减少一条线段,因此对于2n个端点进行排序,令xi为价值1,yi为价值-1,问题转化成了最大区间和,因为1一定在-1之前,因此问题变成最大前缀和,我们寻找最大值就是答案,另外的,这题可以用离散化后线段树来做。复杂度为排序的复杂度即nlgn,另外如果用第一种做法数组应是2n,而不是n,由于各种非确定性因素我在小数据就已经设了n=10W的点。 用自己的话来说,就是如果要将x,y区间覆盖,那么就在x对应的位置标记1,然后在y+1的对应那个位置标记-1,然后每个点背覆盖的数就是改点之前的(包括该点)对应值之和。 看到题目时,想用数组,但是10的九次方,开不了那么大的数组~~~~结果是用结构体将这些点离散~~;其次在最后求和的时候是求谋无规律的一串数的连续最大的和,应为前面标记y+1对应值是-1,向后面移动的一位,则需要一个for循环来将某点x的所以对应值加起来; 代码: #include <stdio.h> #include <string.h> #include <stdlib.h> using namespace std; struct node { int d, v; }e[200002]; // 存()起点和终点点和对应的值 int cmp(const void *a, const void *b) { return (*(node *)a).d - (*(node *)b).d; } int main (void) { int t, n, i,j, x, y, k,ans, cnt; while(scanf("%d", &t) != EOF) { while(t--) { scanf("%d", &n); j = 0; for(i = 0; i < n; i++) { scanf("%d %d", &x, &y); e[j].d = x; e[j].v = 1; j++; e[j].d = y+1; e[j].v = -1; j++; } qsort(e, j, sizeof(e[0]), cmp); ans = 0; cnt = 0; for(i = 0; i < j; ) { k = i; for( ; k < j && e[k].d == e[i].d; k++) // 用这个for循环来解决y+1的对应值是-1带来的影响 cnt += e[k].v; i = k; if(cnt < 0) cnt = 0; else if(cnt > ans) ans = cnt; } printf("%d\n",ans); } } return 0; } 需要注意的点: 1,用结构体来处理; 2,快排函数要熟练熟练; 3,最后求连续最大子串的和的最大值; (连续公共子串呢)
相关文章推荐
- POJ 2482 扫描线(面积覆盖最大次数)
- zju zoj 3573 查询线段最大覆盖次数
- hdu 3577 线段树,成段更新 好题 查询区间的最大覆盖次数
- HDU 3577 Fast Arrangement ( 线段树 成段更新 区间最值 区间最大覆盖次数 )
- HDU 3577 Fast Arrangement(线段树功能:区间更新,查询区间的最大覆盖次数)
- 关于二分图中对最小顶点覆盖、最小边覆盖、最大独立集的总结
- hdu 1151 Air Raid 最小路径覆盖(最大匹配)
- poj 3041 最小覆盖数等于最大匹配数
- ZOJ 1364 Machine Schedule (POJ 1325) (最小点覆盖数==最大匹配数)
- 关于二分图匹配的基本应用的一些见解(最大独立点集、最小点覆盖、最小路径覆盖)
- POJ 3692 最小点覆盖 最大二分图匹配
- SPOJ - NSUBSTR(长度为1-len的字串出现的最大次数
- 二分图最小覆盖点数(最大匹配):Machine Schedule
- 基于快速排序思想求,数组最大的k个数,数组中出现次数超过一半的数,数组中最大的k个数
- hdu Uncle Tom's Inherited Land*(1*2矩阵覆盖,最大匹配)
- hihoCoder 1127 二分图三·二分图最小点覆盖和最大独立集
- 点覆盖的次数
- 树形DP求树的最小支配集,最小点覆盖,最大独立集
- 最小点权覆盖=最大点权独立集
- [POJ3020]Antenna Placement(二分图最大匹配,最小边覆盖)