题意: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