不是VIP会员,不能显示答案

题目解答

题目:
阅读下面一段程序,完成(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) ⑸处应填( )。
考点:
分析:
解答:
评论:
老师: