Codeforces 1404D - Game of Pairs(构造)
首先注意到 \(\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(构造)的更多相关文章
- 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 ...
- Codeforces 707C Pythagorean Triples(构造三条边都为整数的直角三角形)
题目链接:http://codeforces.com/contest/707/problem/C 题目大意:给你一条边,问你能否构造一个包含这条边的直角三角形且该直角三角形三条边都为整数,能则输出另外 ...
- Codeforces 1246D/1225F Tree Factory (构造)
题目链接 https://codeforces.com/contest/1246/problem/D 题解 首先考虑答案的下界是\(n-1-dep\) (\(dep\)为树的深度,即任何点到根的最大边 ...
- Codeforces - 1202D - Print a 1337-string... - 构造
https://codeforces.com/contest/1202/problem/D 当时想的构造是中间两个3,然后前后的1和7组合出n,问题就是n假如是有一个比较大的质数因子或者它本身就是质数 ...
- Codeforces 743C - Vladik and fractions (构造)
Codeforces Round #384 (Div. 2) 题目链接:Vladik and fractions Vladik and Chloe decided to determine who o ...
- Codeforces 1368E - Ski Accidents(构造+思维)
Codeforces 题面传送门 & 洛谷题面传送门 神仙构造题(不过可能我构造太烂了?) 首先考虑这个奇奇怪怪的 \(\dfrac{4}{7}\),以及这个每个点出度最多为 \(2\) 的条 ...
- Codeforces 1270E - Divide Points(构造+奇偶性)
Codeforces 题目传送门 & 洛谷题目传送门 显然,直接暴力枚举是不可能的. 考虑将点按横纵坐标奇偶性分组,记 \(S_{i,j}=\{t|x_t\equiv i\pmod{2},y_ ...
- codeforces 622C. Optimal Number Permutation 构造
题目链接 假设始终可以找到一种状态使得值为0, 那么两个1之间需要隔n-2个数, 两个2之间需要隔n-3个数, 两个3之间隔n-4个数. 我们发现两个三可以放到两个1之间, 同理两个5放到两个3之间. ...
- Codeforces 1019C Sergey's problem 构造
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1019C.html 题目传送门 - CF1019C 题意 给定一个有 $n$ 个节点 . $m$ 条边的有向 ...
随机推荐
- 使用固件库点亮led灯
1. 项目 使用STM32F103VE的固件库实现流水灯设计. 2. 代码 由于这是基于野火的视频进行学习的,项目代码在上节基础上进行编写的. 点亮绿灯: main.c #include " ...
- 4.7 80--删除排序数组中的重复项 II
因为python的list可以直接del List[index],因此直接使用了暴力方法,判断是否重复了两次,是的话直接使用del. 在转向使用Java时,因为暴力方法的局限,一直在找怎样对Java的 ...
- noj -> 跳马
00 题目 描述: 在国际象棋中,马的走法与中车象棋类似,即俗话说的"马走日",下图所示即国际象棋中马(K)在一步能到达的格子(其中黑色的格子是能到达的位置). 现有一200*20 ...
- 【c++ Prime 学习笔记】第16章 模板与泛型编程
面向对象编程(OOP)和泛型编程(GP)都能处理在编写程序时类型未知的情况 OOP能处理运行时获取类型的情况 GP能处理编译期可获取类型的情况 标准库的容器.迭代器.算法都是泛型编程 编写泛型程序时独 ...
- Git: 搭建一个本地私人仓库
Git: 搭建一个本地私人仓库 寝室放个电脑.实验室也有个电脑 为进行数据同步,充分利用实验室的服务器搭建了个本地私人仓库 1. 安装流程 当然首先保证服务器上与PC机上都已经安装了可用的Git 在P ...
- 2021.10.12考试总结[NOIP模拟75]
T1 如何优雅的送分 考虑式子的实际意义.\(2^{f_n}\)实际上就是枚举\(n\)质因子的子集.令\(k\)为这个子集中数的乘积,就可以将式子转化为枚举\(k\),计算\(k\)的贡献. 不难得 ...
- 计算机网络之流量控制(停止-等待协议、滑动窗口、后退N帧协议GBN、选择重传协议SR)、滑动窗口、可靠传输机制
文章转自:https://blog.csdn.net/weixin_43914604/article/details/104908762 学习课程:<2019王道考研计算机网络> 学习目的 ...
- 转:Linux常用命令总结
学习linux也有一阵子了,现总结一些常用的linux操作命令,方便大家查找1. cd命令这个命令是最基本的也是最常用的.它用于切换当前目录,可以是绝对路径,也可以是相对路径.例:cd /root/h ...
- hdu 4788 Hard Disk Drive (水题)
题意: Input The first line contains an integer T, which indicates the number of test cases. For each t ...
- 【java设计模式】(10)---模版方法模式(案例解析)
一.概念 1.概念 模板方法模式是一种基于继承的代码复用技术,它是一种类行为型模式. 它定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的 ...