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. ThreadLocalRandom类原理分析

    1.Random类及其局限性 public int nextInt(int bound) { if (bound <= 0) throw new IllegalArgumentException ...

  2. FastAPI 学习之路(三十八)Static Files

    如果使用前后台不分离的开发方式,那么模板文件中使用的静态文件,比如css/js等文件的目录需要在后台进行配置,以便模板渲染是能正确读到这些静态文件.那么我们应该如何处理呢. 首先安装依赖 pip in ...

  3. 如果你还不知道Apache Zookeeper?你凭什么拿大厂Offer!!

    很多同学或多或少都用到了Zookeeper,并知道它能实现两个功能 配置中心,实现表分片规则的统一配置管理 注册中心,实现sharding-proxy节点的服务地址注册 那么Zookeeper到底是什 ...

  4. UltraSoft - Alpha - Scrum Meeting 1

    Date: Apr 06th, 2020. 会议内容为讨论功能规格书和技术规格书的撰写. Scrum 情况汇报 进度情况 组员 负责 昨日进度 后两日任务 CookieLau PM.后端 进行Djan ...

  5. 二进制插入 牛客网 程序员面试金典 C++ Python java

    二进制插入 牛客网 程序员面试金典 题目描述 有两个32位整数n和m,请编写算法将m的二进制数位插入到n的二进制的第j到第i位,其中二进制的位数从低位数到高位且以0开始. 给定两个数int n和int ...

  6. hdu 5095 Linearization of the kernel functions in SVM(模拟,分类清楚就行)

    题意: INPUT: The input of the first line is an integer T, which is the number of test data (T<120). ...

  7. 部署自己的gitlab服务器

    一.安装依赖环境,下载gitlab的rpm包,并且安装 yum install curl policycoreutils-python openssh-server postfix wget -ywg ...

  8. ELK集群之kafka(7)

    原理待补充: kafka依赖于zookeeper集群. 都是基于java 由于源码安装jdk 未声明bin下java 在各自server配置文件中声明 JAVA_HOME=/usr/local/jdk ...

  9. 【java+selenium3】自动化处理文件上传 (十三)

    一.文件上传 文件上传是自动化中棘手的部分,目前selenium并没有提供上传的实现api,所以知道借助外力来完成,如AutoIt.sikuli. AutoIt , 这是一个使用类似BASIC脚本语言 ...

  10. JMeter进行压力测试时查看服务器的资源使用

    用户想要使用Jmeter监控所测试的服务器的资源使用情况,需要有Jmeter客户端插件和服务端插件 1.客户端插件 下载地址:https://jmeter-plugins.org/install/In ...