Codeforces 题面传送门 & 洛谷题面传送门

首先注意到 \(\sum\limits_{i=1}^{2n}i=\dfrac{2n(2n+1)}{2}=n(2n+1)\equiv n\pmod{2n}\),也就是说,如果我们能够在每个 pair 找到一个数,使取出的 \(n\) 个数加起来是 \(n\)​ 的倍数,那么后手就有必胜策略,因为如果取出的数之和 \(\bmod 2n=0\) 那么显然符合要求,否则我们这 \(n\) 个数之和 \(\bmod 2n\) 必然等于 \(n\),因此我们可以考虑取个补集,剩余数之和 \(\bmod 2n\) 显然就等于所有数之和减去取出的数之和,也就是 \(2n\) 的倍数了。

因此考虑分情况讨论:如果 \(n\) 是偶数那比较好办,我们考虑当先手,对于所有 \(i\in[1,n]\),将 \(i\) 与 \(i+n\) 分在一组,那么不论后手怎么取,他取出的 \(n\)​ 个数之和 \(\equiv\sum\limits_{i=1}^ni\pmod{n}\),而显然 \(\sum\limits_{i=1}^ni=\dfrac{n(n+1)}{2}=n·\dfrac{n+1}{2}\),后者不是整数,因此左式也不是 \(n\) 的倍数,因此后手无法取出 \(n\) 个数使它们的和为 \(2n\) 的倍数。

接下来考虑 \(n\) 是奇数的情况,显然根据此题的设计,\(n\) 为偶数的情况我们要选择当先手,那 \(n\) 为奇数的情况题目肯定要让我们当后手了,也就是说,我们要对于所有可能的分组情况,从每个 pair 中找出一个数,使它们的和是 \(n\) 的倍数。注意到对于奇数而言,就有 \(\sum\limits_{i=1}^ni\) 为 \(n\) 的倍数了,因此考虑 \(\equiv 1,2,3,\cdots,n\) 的数各取一个,怎么取呢?我们考虑对于所有 \(i\in[1,n]\),连一条 \(i\) 所在的 pair 到 \(i+n\) 所在的 pair 的有向边,权值为 \(0\),编号为 \(i\),同理连一条 \(i+n\) 所在的 pair 到 \(i\) 所在的 pair 的有向边,权值为 \(1\),编号为 \(i\),这样每个点恰好连出两条边,也就是说我们会形成若干个环,我们考虑以任意顺序(顺时针、逆时针皆可),那么在遍历的过程中,如果我们经过编号为 \(i\) 的边时经过的那条边权值为 \(0\),那么我们就选择 \(i\),否则如果经过编号为 \(i\) 的边时,经过的那条边权值为 \(1\),我们就选择 \(i+n\),不难发现这样每组恰好选择一个,而每个编号的边恰好遍历了一次,因此 \(\equiv 1,2,3,\cdots,n\) 的数也都各取一个,因此和肯定是 \(n\) 的倍数。注意,如果最后选出来的数之和 \(\bmod 2n=n\) 那么还需取个补集。

坑点:注意 fflush(stdout)

const int MAXN=5e5;
int n,p[MAXN*2+5],hd[MAXN*2+5],to[MAXN*2+5],nxt[MAXN*2+5],id[MAXN*2+5],ec=1;
void adde(int u,int v,int x){to[++ec]=v;nxt[ec]=hd[u];hd[u]=ec;id[ec]=x;}
bool vis[MAXN*2+5],book[MAXN*2+5];int ans[MAXN+5];
void dfs(int x,int pre,int st){
// printf("%d %d\n",x,pre);
vis[x]=1;
for(int e=hd[x];e;e=nxt[e]){
int y=to[e],z=id[e];if((e>>1)==(pre>>1)) continue;
book[z*n+(e>>1)]=1;if(y^st) dfs(y,e,st);return;
}
}
int main(){
scanf("%d",&n);
if(~n&1){
puts("First");
for(int i=1;i<=n<<1;i++) printf("%d%c",i%n+1," \n"[i==n<<1]);
fflush(stdout);
} else {
puts("Second");fflush(stdout);ll sum=0;
for(int i=1;i<=n<<1;i++) scanf("%d",&p[i]);
for(int i=1;i<=n;i++) adde(p[i],p[i+n],0),adde(p[i+n],p[i],1);
for(int i=1;i<=n;i++) if(!vis[i]) dfs(i,0,i);
for(int i=1;i<=n<<1;i++) sum+=book[i]*i;
if(sum%(n<<1)){
for(int i=1;i<=n<<1;i++) book[i]^=1;
} for(int i=1;i<=n<<1;i++) if(book[i]) ans[p[i]]=i;
for(int i=1;i<=n;i++) printf("%d%c",ans[i]," \n"[i==n]);
fflush(stdout);
}
return 0;
}

Codeforces 1404D - Game of Pairs(构造)的更多相关文章

  1. Educational Codeforces Round 10 B. z-sort 构造

    B. z-sort 题目连接: http://www.codeforces.com/contest/652/problem/B Description A student of z-school fo ...

  2. Codeforces 707C Pythagorean Triples(构造三条边都为整数的直角三角形)

    题目链接:http://codeforces.com/contest/707/problem/C 题目大意:给你一条边,问你能否构造一个包含这条边的直角三角形且该直角三角形三条边都为整数,能则输出另外 ...

  3. Codeforces 1246D/1225F Tree Factory (构造)

    题目链接 https://codeforces.com/contest/1246/problem/D 题解 首先考虑答案的下界是\(n-1-dep\) (\(dep\)为树的深度,即任何点到根的最大边 ...

  4. Codeforces - 1202D - Print a 1337-string... - 构造

    https://codeforces.com/contest/1202/problem/D 当时想的构造是中间两个3,然后前后的1和7组合出n,问题就是n假如是有一个比较大的质数因子或者它本身就是质数 ...

  5. Codeforces 743C - Vladik and fractions (构造)

    Codeforces Round #384 (Div. 2) 题目链接:Vladik and fractions Vladik and Chloe decided to determine who o ...

  6. Codeforces 1368E - Ski Accidents(构造+思维)

    Codeforces 题面传送门 & 洛谷题面传送门 神仙构造题(不过可能我构造太烂了?) 首先考虑这个奇奇怪怪的 \(\dfrac{4}{7}\),以及这个每个点出度最多为 \(2\) 的条 ...

  7. Codeforces 1270E - Divide Points(构造+奇偶性)

    Codeforces 题目传送门 & 洛谷题目传送门 显然,直接暴力枚举是不可能的. 考虑将点按横纵坐标奇偶性分组,记 \(S_{i,j}=\{t|x_t\equiv i\pmod{2},y_ ...

  8. codeforces 622C. Optimal Number Permutation 构造

    题目链接 假设始终可以找到一种状态使得值为0, 那么两个1之间需要隔n-2个数, 两个2之间需要隔n-3个数, 两个3之间隔n-4个数. 我们发现两个三可以放到两个1之间, 同理两个5放到两个3之间. ...

  9. Codeforces 1019C Sergey's problem 构造

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF1019C.html 题目传送门 - CF1019C 题意 给定一个有 $n$ 个节点 . $m$ 条边的有向 ...

随机推荐

  1. 4.14——208. 实现 Trie (前缀树)

    前缀树(字典树)是经典的数据结构,以下图所示: 本来处理每个节点的子节点集合需要用到set,但是因为输入规定了只有26个小写字母,可以直接用一个[26]的数组来存储. 关于ASCII代码: Java ...

  2. 【数据结构与算法Python版学习笔记】图——基本概念及相关术语

    概念 图Graph是比树更为一般的结构, 也是由节点和边构成 实际上树是一种具有特殊性质的图 图可以用来表示现实世界中很多有意思的事物,包括道路系统.城市之间的航班.互联网的连接,甚至是计算机专业的一 ...

  3. MySQL:基础语法-1

    MySQL:基础语法-1 记录一下 MySQL 基础的一些语法,便于查询,该部分内容主要是参考:bilibili 上 黑马程序员 的课程而做的笔记,由于时间有点久了,课程地址忘记了 关于数据库的安装操 ...

  4. [对对子队]会议记录4.10(Scrum Meeting 1)

    本次每日例会的开会时间是4月10日晚上20:00,使用腾讯会议作为开会工具. 今天已完成的工作 何瑞 ​ 工作内容:制作UI界面的指令编辑系统,已大致实现指令的衔接 ​ 相关issue:实现用户指令编 ...

  5. 8.18考试总结[NOIP模拟43]

    又挂了$80$ 好气哦,但要保持优雅.(草 T1 地衣体 小小的贪心:每次肯定从深度较小的点向深度较大的点转移更优. 模拟一下,把边按链接点的子树最大深度排序,发现实际上只有上一个遍历到的点是对当前考 ...

  6. python doc os 参考

    os --- 操作系统接口模块 源代码: Lib/os.py 该模块提供了一些方便使用操作系统相关功能的函数. 如果你是想读写一个文件,请参阅 open(),如果你想操作路径,请参阅 os.path  ...

  7. Codeforces Round #741 (Div. 2)部分题题解

    我果然还是太菜了,就写了两道题....真是水死了.... A The Miracle and the Sleeper 简化题意:给定\(l,r\),求\(a\)%\(b\)的最大值,其中\(r> ...

  8. Docker 18.03 Centos7.6 安装 内网

    首先访问https://download.docker.com/linux/centos/7/x86_64/stable/Packages/获取对应版本的rpm包docker包docker-ce-18 ...

  9. 浅谈对typora的使用

    内容概要 - 什么是typora - typora的具体使用 目录 内容概要 - 什么是typora - typora的具体使用 1. 什么是typora 2.typora的具体使用 1.标题级别 2 ...

  10. WPF进阶技巧和实战03-控件(4-基于范围的控件及日期控件)

    系列文章链接 WPF进阶技巧和实战01-小技巧 WPF进阶技巧和实战02-布局 WPF进阶技巧和实战03-控件(1-控件及内容控件) WPF进阶技巧和实战03-控件(2-特殊容器) WPF进阶技巧和实 ...