Notice: Undefined index: name in /usr/www/lib/views/home/viewtitle.html on line 188
-完善程序 第 20 题
阅读下面一段程序,完成(1)-(5)五道小题。 给定n个区间[l1,r1],[l2,r2],...,[ln,rn]。你需要求出有多少种不同的方案,给每个区间涂上黑白两种颜色之一,使得任意同色区间两两交集为空集。 答案可能很大,因此要对998,244,353取模。 输入格式: 输入的第一行包含一个整数n。接下来n行,每行两个整数1, r。 输出格式:输出一行一个整数,表示答案。 数据范围:1<=n<= 10^6, 1<=l<=r<= 10^9。
#include<bits/stdc++.h>

const int N=5e6+50;
const int mod = 998244353;

int n, top, head[N], nxt[N],ver[N], col[N],cnt;
std::pair<int, int>stack[N];

struct seg
{
	int l,r;
} p[N];

inline void add(int u,int v)
{
	nxt[++cnt]=head[u], ver[cnt]=v, head[u]=cnt;
	nxt[++cnt]=head[v], ver[cnt]=u, head[v]=cnt;
}

//从x出发dfs,检测当前图是否为二分图
bool dfs(int x,int c)
{
	if (__(3)__) return co1[x]==c;
	col[x]=c;
	for (int i=head[x]; i; i=nxt[i])
		if (dfs (ver[1],c^1) - false)
			return false;
	return true;
}

int main()
{
	scanf ("%d", &n);
	for (int i=1; i<=n; ++i) scanf ("%d%d" ,&p[i].l,&p[i].r);
	std::sort(p+1,p+n+1,[] (seg u,seg v)
	{
		return __(1)__;
	});//将所有区间按照右端点从小到大排序
	for (int i=1; i<=n; ++i)
	{
		while (top>0 && __(2)__) //若区间有交,则进行建边
			add (stack[top--].second,i);
		stack[++top]=std::make_pair(p[i].r,i);
	}
	memset(col,-1,sizeof col);
	int ans=1;
	for (int i=1; i<=n; ++i)
		if (co1[1]==-1)
		{
			if (dfs(i,0)==false) return print("0"),0;//	若区间圈不是二分围,则无解
			ans=(__(4)__) %mod;
		}
	int mx[2];mx[0]=mx[1]=0;
	for (int i=1; i<=n; ++i)
	{
		if (__(5)__) return printf("0"),0;
		mx[col[i]]=p[i].r;
	}
	printf ("%d",ans);
	return 0;
}
● 单选题
第 1 题 ⑴处应填( )。
第 2 题 ⑵处应填( )。
第 3 题 ⑶处应填( )。
第 4 题 ⑷处应填( )。
第 5 题 ⑸处应填( )。

解答部分以后会开放。