ZOJ 3953 Intervals

这题其实就是在算最大不重叠区间数的升级版。

首先讲一下最大不重叠区间数如何求; 将所有区间按y小到大排序。

然后按顺序放区间,线上记录ansr(最右下标值)

在放一个新的区间的时候,判断此区间的x是否大于ansr,如果是就更新ansr,否则不变,

到最后就能算出最大不重叠区间数


但是这次问的是对应的下标位置不能同时有3条边重叠,

所有我们维护2个值,ans1(重叠边为1条最右下标值),ans2(重叠边为2条的最右下标值)

在循环中,如果此区间x大于ans1,就更新ans1,ans2不变

                   否则如果x大于ans2,ans2=ans1,ans1=y;

此题需要离散化。

#include 
#include 
#include 
using namespace std;
int t, n;
struct Seg { int s, e, pos; }seg[50024];
struct P { int v, pos; }p[100024];
int a[100024];
int vis[50024];
bool cmp(Seg a, Seg b) {
	return a.e cnt1) cnt1 = seg[i].e, sum++, vis[seg[i].pos] = 1;
				else if (seg[i].s > cnt2) cnt2 = cnt1,cnt1=seg[i].e, sum++, vis[seg[i].pos] = 1;
			}
			printf("%d\n", n - sum);
			bool first = 1;
			for (int i = 0; i


你可能感兴趣的:(贪心)