【ZOJ4063】Tournament(构造)

题意:n个人要打m轮比赛

每一轮每个人都要有一个对手。而且每个对手只能打一次。假设a与b打了,c与d打了,

那么后面的任意一轮如果a与c打了,那么b就必须和d打

问是否存在方案,输出字典序最小的一组,无解输出Impossible

sigma n,m<=5e3

思路:……这场输的心服口服

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<string>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<algorithm>
 7 #include<map>
 8 #include<set>
 9 #include<queue>
10 #include<vector>
11 using namespace std;
12 typedef long long ll;
13 typedef unsigned int uint;
14 typedef unsigned long long ull;
15 typedef pair<int,int> PII;
16 typedef vector<int> VI;
17 #define fi first
18 #define se second 
19 #define MP make_pair
20 #define N      210000
21 #define M      51
22 #define MOD 1000000007
23 #define eps 1e-8 
24 #define pi     acos(-1)
25 #define oo     1010000000
26 
27 int lowbit(int x)
28 {
29     return x&(-x);
30 }
31 
32 
33 int main()
34 { 
35      int cas;
36      scanf("%d",&cas);
37      for(int v=1;v<=cas;v++) 
38      {
39         int n,m;
40         scanf("%d%d",&n,&m);
41         if(m>=lowbit(n)) printf("Impossible
");
42          else
43          {
44              for(int i=1;i<=m;i++)
45              {
46                  for(int j=0;j<n-1;j++) printf("%d ",(i^j)+1);
47                 printf("%d
",(i^(n-1))+1);
48             }
49          }        
50     }
51     return 0;
52 }
53     
原文地址:https://www.cnblogs.com/myx12345/p/10058289.html