题干:
第一行给出N和M代表有N个难度1~N的题目,M代表有M个约束。接下来M行,每行两个数代表这一个约束的两个题目。
代表难度的数字越大,题目越难。现在要求你将N个题目分成不重不漏的两组(div1和div2),要求1每组不能为空,要求2 div1的任何题目都要比div2难,要求3 具有约束关系的两个题目必须分到不同组,约束关系不传递。求有多少种分组方法。
解题报告:
找到div2的最大值mx,找到div1的最小值mn,小于mx的肯定要放到div2,大于mn的肯定要放到div1,模拟一下发现,所以中间剩下多少个数,就有多少个方案数。
AC代码:
using namespace std;
typedef pair<int,int> PII;
const int MAX = 2e5 + 5;
int n,k,a,b,c,d;
int main()
{
cin>>n>>k;
cin>>a>>b>>c>>d;
if(k < n+1 || n == 4) {printf("-1\n");return 0;}
printf("%d %d ",a,c);
for(int i = 1; i<=n; i++) {
if(i == a || i == b || i == c || i == d) continue;
printf("%d ",i);
}printf("%d %d\n",d,b);
printf("%d %d ",c,a);
for(int i = 1; i<=n; i++) {
if(i == a || i == b || i == c || i == d) continue;
printf("%d ",i);
}printf("%d %d\n",b,d);
return 0 ;
}