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. UnboundLocalError: local variable 'range' referenced before assignment

    1. 报错信息 UnboundLocalError: local variable 'range' referenced before assignment 2. 代码 class Car(): &q ...

  2. 4.19——数组双指针——26. 删除有序数组中的重复项 & 27. 删除有序数组中的重复项II & 80. 删除有序数组中的重复项 II

    第一次做到数组双指针的题目是80: 因为python的List是可以用以下代码来删除元素的: del List[index] 所以当时的我直接用了暴力删除第三个重复元素的做法,大概代码如下: n = ...

  3. TX-LCN分布式事务之LCN模式

    什么是LCN模式 LCN模式是TX-LCN分布式事务模式的一种,L-lock-锁定事务单元.C-confirm-确认事务模块状态. notify-通知事务单元 原理 LCN模式是通过Spring AO ...

  4. mongodb的简单查询

    此篇文章简单的记录一下mongodb 的简单查询操作. 一.数据准备: db.persons.insertMany([ {'userId':1,name:'张三','age':20,'scores': ...

  5. Noip模拟10 2021.6.27

    T1 入阵曲 好了,又一个考试败笔题. 也就是在那个时候,小 F 学会了矩阵乘法.让两个矩阵乘几次就能算出斐波那契数, 真是奇妙无比呢. 不过, 小 F 现在可不想手算矩阵乘法--他觉得好麻烦.取而代 ...

  6. WiFi模块选型参考

    经常会碰到一些关于wifi模块的咨询,很多刚接触wifi模块的设计人员或者用户,只知道提wifi模块,很难提具体的模块要求!希望通过文章的介绍,会做到有的放矢!咨询时一定要搞清楚自己希望使用什么主芯片 ...

  7. STM32 学习笔记之中断应用概览--以f103为例

    异常类型 F103 在内核水平上搭载了一个异常响应系统, 支持为数众多的系统异常和外部中断.其中系统异常有8 个(如果把Reset 和HardFault 也算上的话就是10 个),外部中断有60个.除 ...

  8. DH密钥交换

    DH密钥交换 密模运算 所谓幂模,就是先做一次幂运算,再做一次模运算. 模运算有以下性质: 也就是说,先模再乘和先乘再模,只要最后都模了同一个模数,结果都是一样. 有了这个性质,我们首先得到幂模运算的 ...

  9. pl/sql 远程连接oracle数据库问题(TNS:丢失连接)

    前几天还可以连接的,突然就连接失效,别的电脑也连接不上 1.ping 远程数据库的IP,可以ping通. 2.检查服务端的tnsnames.ora文件和本机客户端比较,没问题. 3.查看监听是否启动  ...

  10. 关于docker中容器可以Ping通外网,真机无法Ping通容器的问题

    首先我们要知道整体的框架结构,docker是我们安装在centos7上的,而centos7是安装在vmware上.其中docker中还有若干容器运行. 整体框架图如下: 我们将它分为两部分,一部分是d ...