题面:http://acm.zju.edu.cn/contest-materials/qd2018/qd2018_problems.pdf

题意:

n个骑士决斗K轮

要求是每个骑士只能跟另外一个骑士决斗一次

每轮必须有 n/2 场决斗

如果在某轮A和B单挑,C和D单挑

那么在下面的论场中必然有A和C单挑同时B和D单挑

思路:

用一个set存每个骑士还没单挑过的其他骑士编号,一个set存每轮还没有单挑过的骑士

先预处理第一轮的21436587······

第一个骑士每轮单挑必然是单挑的轮数+1(如第一轮单挑的是2即1+1)

这样才能满足字典序最小的要求

然后把第一个骑士单挑的第X个骑士的上一个和第一个的上一个进行单挑

然后找本轮还没单挑的编号最小的骑士去单挑本轮还没单挑的他还没单挑过的最小的(好拗口啊ORZ)

代码上能看的比较清楚,建议直接分析代码

另外如果k>=lowbit(n) 那么绝对不可能安排上

具体可以自己打表看看

代码(注意这不是最终代码):

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <map>
#include <set>
#include <list>
#include <deque>
#include <queue>
#include <stack>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
#define it iterator
#define ll long long
#define eb emplace_back
#define lowbit(x) x & -x
#define all(x) x.begin(),x.end()
#define ZERO(a) memset(a,0,sizeof(a))
#define MINUS(a) memset(a,0xff,sizeof(a))
#define per(x,a,b) for(int x = a; x <= b; x++)
#define rep(x,a,b) for(int x = a; x >= b; x--)
#define IO ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) const int birth = ;
const int mo = ;
const int maxn = 1e4 + ;
const int mod = 1e9 + ;
const int INF = 0x3fffffff;
const double eps = 1e-; int ch[maxn][maxn]; //******************THE PROGRAM BEGINING****************** int main()
{
//cout << (lowbit(12)) << endl;
int t;
cin >> t;
while (t--)
{
int n, k;
set<int> s[maxn];
set<int> e;
cin >> n >> k; if (k >= (lowbit(n)))
{
cout << "Impossible" << endl;
continue;
} if (lowbit(n) == || k == )
{
per(i, , n)
{
if (i & )
cout << i + ;
else
cout << i - ;
if (i != n)
cout << " ";
}
cout << endl;
continue;
}
else
{
per(i, , n)
{
if (i & )
ch[][i] = i + ;
else
{
ch[][i] = i - ;
}
per(j, , n)
{
if (i == j || j == ch[][i])
continue;
s[i].insert(j);
}
}
int x = k - ;
int num = ;
int pos = ;
while (x--)
{
e.clear();
per(i, , n)
e.insert(i);
e.erase(num);
ch[pos][] = num;
ch[pos][num] = ;
s[num].erase();
ch[pos][ch[pos - ][]] = ch[pos - ][num];
e.erase(ch[pos - ][num]);
ch[pos][ch[pos - ][num]] = ch[pos - ][];
e.erase(ch[pos - ][]);
s[ch[pos - ][]].erase(ch[pos - ][num]);
s[ch[pos - ][num]].erase(ch[pos - ][]);
while (!e.empty())
{
int head = *e.begin();
int tail;
e.erase(head);
for (set<int>::iterator it = s[head].begin(); it != s[head].end(); it++)
{
if (e.count(*it))
{
tail = *it;
break;
}
} e.erase(tail);
ch[pos][head] = tail;
ch[pos][tail] = head;
s[head].erase(tail);
s[tail].erase(head);
ch[pos][ch[pos - ][head]] = ch[pos - ][tail];
e.erase(ch[pos - ][head]);
ch[pos][ch[pos - ][tail]] = ch[pos - ][head];
e.erase(ch[pos - ][tail]);
s[ch[pos - ][tail]].erase(ch[pos - ][head]);
s[ch[pos - ][head]].erase(ch[pos - ][tail]);
}
num++;
pos++;
} for (int i = ; i < k; i++)
{
for (int j = ; j <= n; j++)
{
cout << ch[i][j];
if (j != n)
cout << " ";
}
cout << endl;
}
}
} return ;
}

但是呢,这个方法从时间上讲完全是不够用的,然后通过上面的进行打表,发现了一个天大的咪咪

#include <iostream>
#include <cstdio>
#include <algorithm> using namespace std; int ch[][]; //******************THE PROGRAM BEGINING****************** int main()
{
int t;
cin >> t;
while (t--)
{
int n, k;
scanf("%d %d", &n, &k); if (k >= (n & -n))
{
puts("Impossible");
continue;
} if ((n & -n) == || k == )
{
for(int i = ; i <= n; i++)
{
if (i & )
printf("%d", i + );
else
printf("%d", i - );
if (i != n)
printf(" ");
}
printf("\n");
continue;
}
else
{
for (int i = ; i <= n; i++)
{
if (i & )
{
ch[][i] = i;
ch[][i] = i + ;
}
else
{
ch[][i] = i;
ch[][i] = i - ;
}
} int x = ;
while (x <= k)
{
for (int i = x; i <= x * - ; i++)
{
for (int j = ; j <= n; j += * x)
{
for (int k = j; k < j + x; k++)
{
ch[i][k] = ch[i - x][k + x];
}
for (int k = j + x; k < j + * x; k++)
{
ch[i][k] = ch[i - x][k - x];
}
}
}
x *= ;
} for (int i = ; i <= k; i++)
{
for (int j = ; j <= n; j++)
{
printf("%d", ch[i][j]);
if (j != n)
printf(" ");
}
printf("\n");
}
}
} return ;
}

其实就是定长翻倍交换左右块就好了

先打表前两行

第三第四行为2*2的块交换

第五到第八行为4*4的块交换

依次推下去即可

2018 ACM-ICPC 亚洲区域赛青岛现场赛 —— Problem F. Tournament的更多相关文章

  1. 2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)

    队名:Unlimited Code Works(无尽编码)  队员:Wu.Wang.Zhou 先说一下队伍:Wu是大三学长:Wang高中noip省一:我最渣,去年来大学开始学的a+b,参加今年区域赛之 ...

  2. Known Notation括号匹配类问题(2014年ACM/ICPC 亚洲区域赛牡丹江)

    题意: 给你数字或 * 的串,你可以交换一个*和数字.在最前面添1.在一个地方插入*,问你使串满足入栈出栈的(RNP)运算法则. 思路: 引用:https://blog.csdn.net/u01158 ...

  3. Digit sum (第 44 届 ACM/ICPC 亚洲区域赛(上海)网络赛)进制预处理水题

    131072K   A digit sum S_b(n)Sb​(n) is a sum of the base-bb digits of nn. Such as S_{10}(233) = 2 + 3 ...

  4. 2018 ACM 国际大学生程序设计竞赛上海大都会赛

    传送门:2018 ACM 国际大学生程序设计竞赛上海大都会赛 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛2018-08-05 12:00:00 至 2018-08-05 17:00:0 ...

  5. 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it

    链接:https://www.nowcoder.com/acm/contest/163/F 来源:牛客网 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it 时间限制:C ...

  6. 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it (扫描线)

    2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it (扫描线) 链接:https://ac.nowcoder.com/acm/contest/163/F来源:牛客网 时间 ...

  7. 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位DP)

    2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位DP) 链接:https://ac.nowcoder.com/acm/contest/163/ ...

  8. 2014ACM/ICPC亚洲区域赛牡丹江现场赛总结

    不知道怎样说起-- 感觉还没那个比赛的感觉呢?如今就结束了. 9号.10号的时候学校还评比国奖.励志奖啥的,由于要来比赛,所以那些事情队友的国奖不能答辩.自己的励志奖班里乱搞要投票,自己又不在,真是无 ...

  9. 2014ACM/ICPC亚洲区域赛牡丹江站汇总

    球队内线我也总水平,这所学校得到了前所未有的8地方,因为只有两个少年队.因此,我们13并且可以被分配到的地方,因为13和非常大的数目.据领队谁oj在之上a谁去让更多的冠军.我和tyh,sxk,doub ...

随机推荐

  1. quicker+.em SourceInsight 宏加强版制作

    这两天苦于新建的文件每次都要手动添加文件头,新建的函数每次都要手动添加函数说明,连.h也要手动生成.于是乎,上网搜了搜,发现了lushengwen写的一个神器:quicker.em .好家伙,有了这个 ...

  2. consul service

    {      "name": "consul-agent (host:{{ .MONITOR_CONSUL }})",      "command&q ...

  3. 2017面向对象程序设计(Java)第六周学习总结

    转眼间,2017年的法定节日已经休完,我们的java学习也已经进行了六周.下面,我将对上个礼拜的学习情况进行总结. 首先,是学习态度问题.虽然同学们已经从家或者各个旅游景点回来,但是心还是没回来.有同 ...

  4. css中的display(显示)和visibility(可见性)

    display定义和用法 display 属性规定元素应该生成的框的类型. 说明 这个属性用于定义建立布局时元素生成的显示框类型.对于 HTML 等文档类型,如果使用 display 不谨慎会很危险, ...

  5. java开发操作系统内核:由实模式进入保护模式之32位寻址

  6. set 续2

    --------siwuxie095                 用 set 命令进行字符串处理(这个不应只属于 set 的内容,应该归属于格式内容, 在没有 set 的情况下,格式仍旧适用)   ...

  7. Eclipse自动补全修改

    一.前言 之前敲代码用的是文本工具sublime,转到Eclipse之后发现补全功能特别不方便,所以想根据自己的情况进行调整,具体有两点: 输入某些语句的前几个字母就能自动提示相关的完整语句 用tab ...

  8. windows server2012部署apache项目访问后台管理系统时tomcat就停了是怎么回事

    是由于环境变量没有配好的原因,找不到jre目录 tomcat的运行需要JRE,一般启动闪退都是因为找不到JRE,也就是说环境安装JDK时环境变量没有配置好. 我们首先打开”命令提示符“窗口,输入jav ...

  9. Android如何判断当前手机是否正在播放音乐,并获取到正在播放的音乐的信息

    我想实现如下的场景,判断当前Android手机上是否正在播放音乐,如果是,通过某个特定的手势, 或者点击某个按键,将当前我正在听的音乐共享出去. 第一步,就是判断当前是否有音乐正在播放. 最开始我想得 ...

  10. 深海划水队项目--七天冲刺之day7

    站立式会议: 昨天已完成的工作:设置游戏按键,检查重合.检查是否超出边界.检查是否可以下落,方块的硬下落和软下落方法. 今日已完成的工作:添加方法:方块的着陆和消除. 工作中遇到的困难:在消除方块的时 ...