阅读下面一段程序,完成(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) ⑸处应填( )。