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. C语言知识_1

    +,-,*,/是C语言中表示四则运算的符号.:用来分割不同的语句{}用来对语句进行分组 函数代表了一组数据处理过程,由一对大括号所包含的多条语句来表示这个处理过程.每个函数有唯一的名字,main函数是 ...

  2. Pycharm无法打开,双击没反应

    以下方案皆为引用,仅供参考. 方案一: 1.先声明一下,这种解决方法适用于任何版本的永久破解启动不了的情况(包括:2019版本的)2.下面直接切入正题之所以我们破解之后,不能正常启动的原因有两种:① ...

  3. 让全链路压测变得更简单!Takin2.0重磅来袭!

    自Takin社区版1.0发布两个多月以来,有很多测试同学陆续在各自的工作中运用了起来,其中包括金融.电商.物流.出行服务等行业.这个过程中我们收到了很多同学的反馈建议,同时也了解到很多同学在落地全链路 ...

  4. cadence 技巧

    pcb中如何选中完整的一条网络? 1 edit  properties  右边 find nets 2 cadence 选中不同的网络高亮 display--->assign color在opt ...

  5. FreeRTOS学习笔记——FreeRTOS 任务基础知识

    RTOS 系统的核心就是任务管理,FreeRTOS 也不例外,而且大多数学习RTOS 系统的工程师或者学生主要就是为了使用RTOS 的多任务处理功能,初步上手RTOS 系统首先必须掌握的也是任务的创建 ...

  6. Spring Security:Authorization 授权(二)

    Authorization 授权 在更简单的应用程序中,身份验证可能就足够了:用户进行身份验证后,便可以访问应用程序的每个部分. 但是大多数应用程序都有权限(或角色)的概念.想象一下:有权访问你的面向 ...

  7. 最近公共祖先 牛客网 程序员面试金典 C++ Python

    最近公共祖先 牛客网 程序员面试金典 C++ Python 题目描述 有一棵无穷大的满二叉树,其结点按根结点一层一层地从左往右依次编号,根结点编号为1.现在有两个结点a,b.请设计一个算法,求出a和b ...

  8. Git 极速上手(超简单)

    前言:本文主要介绍了一种快速入门使用Git的方法,通过四步完成本地仓库构建和推送到远程仓库(Github.Gitee码云),简单说明最常用的命令,不需要明白Git的原理即可使用,本文不介绍具体原理. ...

  9. dart系列之:dart语言中的变量

    目录 简介 dart中的变量 定义变量 变量的默认值 Late变量 常量 总结 简介 flutter是google在2015年dart开发者峰会上推出的一种开源的移动UI构建框架,使用flutter可 ...

  10. DockerFile-构建容器的基石

    DockerFile 非常的关键,它不同于 docker commit 的手动命令方式来进行镜像的构建和修改,类似 docker commit 的交互被称为命令式交互.命令式交互是运维一直绕不开的一种 ...