[ABC278G] Generalized Subtraction Game
Problem Statement
This is an interactive task (where your program interacts with the judge's program via Standard Input and Output).
You are given integers $N$, $L$, and $R$.
You play the following game against the judge:
There are $N$ cards numbered $1$ through $N$ on the table.
The players alternately perform the following operation:
- choose an integer pair $(x, y)$ satisfying $1 \leq x \leq N$, $L \leq y \leq R$ such that all of the $y$ cards $x, x+1, \dots, x+y-1$ remain on the table, and remove cards $x, x+1, \dots, x+y-1$ from the table.
The first player to become unable to perform the operation loses, and the other player wins.
Choose whether to go first or second, and play the game against the judge to win.
Constraints
- $1 \leq N \leq 2000$
- $1 \leq L \leq R \leq N$
- $N$, $L$, and $R$ are integers.
Input and Output
This is an interactive task (where your program interacts with the judge's program via Standard Input and Output).
Initially, receive $N$, $L$, and $R$, given from the input in the following format:
$N$ $L$ $R$
First, you choose whether to go first or second. Print First if you choose to go first, and Second if you choose to go second.
Then, the game immediately starts. If you choose to go first, the judge goes second, and vice versa. You are to interact with the judge via input and output until the game ends to win the game.
In your turn, print an integer pair $(x, y)$ that you choose in the operation in the following format. If there is no $(x, y)$ that you can choose, print $(x, y) = (0, 0)$ instead.
$x$ $y$
In the judge's turn, the judge print an integer pair $(a, b)$ in the following format:
$a$ $b$
Here, it is guaranteed that $(a, b)$ is of one of the following three kinds.
- If $(a, b) = (0, 0)$: the judge is unable to perform the operation. In other words, you have won the game.
- If $(a, b) = (-1, -1)$: you have chosen an illegal $(x, y)$ or printed $(0, 0)$. In other words, you have lost the game.
- Otherwise: the judge has performed the operation with $(x,y) = (a,b)$. It is guaranteed that judge chooses valid $(x, y)$.
If the judge returns $(a,b)=(0,0)$ or $(a,b)=(-1,-1)$, the game has already ended. In that case, terminate the program immediately.
Notes
- After each output, add a newline and then flush Standard Output. Otherwise, you may get a TLE verdict.
- If an invalid output is printed during the interaction, or if the program terminates halfway, the verdict will be indeterminate. Especially, note that if a runtime error occurs during the execution of the program, you may get a WA or TLE verdict instead of a RE verdict.
- Terminate the program immediately after the game ends. Otherwise, the verdict will be indeterminate.
Sample Interaction
The following is a sample interaction where $N = 6, L = 1$, and $R = 2$.
| Input | Output | Description |
|---|---|---|
6 1 2 |
Initially, you are given integers $N$, $L$, and $R$. | |
First |
You choose to go first and start the game. | |
2 1 |
$(x, y) = (2, 1)$ is chosen to remove card $2$. | |
3 2 |
$(x, y) = (3, 2)$ is chosen to remove cards $3, 4$. | |
6 1 |
$(x, y) = (6, 1)$ is chosen to remove card $6$. | |
5 1 |
$(x, y) = (5, 1)$ is chosen to remove card $5$. | |
1 1 |
$(x, y) = (1, 1)$ is chosen to remove card $1$. | |
0 0 |
The judge is unable to perform the operation, so you win. |
首先先玩着试一下。假设 \(N=11,L=R=3\) 吧。\(0\) 表示未取,\(1\) 表示已取。
0 0 0 0 0 0 0 0 0 0 0
突然发现,如果我们第一步去了中间的部分,那么情况就会变成
0 0 0 0 1 1 1 0 0 0 0
然后此时左右情况对称,对手怎么取,我在另一个方向同样方式取。这样的话对手怎么做,我都有方法做出反映。此时先手必胜。
但是这种方法不能用在所有情况。比如 \(N=11,L=R=2\) 时就不能构造出两个对称的位置。但是这样可以解决所有 \(L\ne R\) 的情况。
我们现在只用研究 \(L=R\) 的情况了。这个时候可以用 SG 函数解决。
根据 SG 函数的定义,设 \(f_i\) 为有 \(i\) 个数时的 SG 函数,那么 \(f_i=\operatorname{mex}\limits_{j\le i-l}\{f_j\oplus f_{i-l-j}\}\)。如果 \(f_n\) 等于0,后手必胜。否则先手必胜。
若 \(f_n\ne 0\),可以先枚举每种方案,找到一种合法方案使得取完后 SG 函数为 0。而后面对手做出操作时,也一样找到一种方案使得 SG 函数为 \(0\)。这样一直维护,对手怎么操作我都有后续操作。所以肯定必胜。
SG 函数可以每次重算,不用想烦人的维护。反正瓶颈不在这。
#include<bits/stdc++.h>
const int N=2005;
int n,l,r,md,k,x,y,f[N],t[N],s[N],nxt[N],lst[N];
int main()
{
scanf("%d%d%d",&n,&l,&r);
if(l!=r)
{
if(n-l&1)
k=l+1;
else
k=l;
md=n+k>>1;
puts("First");
printf("%d %d\n",md-k+1,k);
fflush(stdout);
while(1)
{
scanf("%d%d",&x,&y);
if(!x)
break;
if(x<md)
printf("%d %d\n",x+md,y);
else
printf("%d %d\n",x-md,y);
fflush(stdout);
}
}
else
{
for(int i=l;i<=n;i++)
{
memset(s,0,sizeof(s));
for(int j=0;j<=i-l;j++)
s[f[j]^f[i-l-j]]=1;
for(int j=0;j>=0;j++)
if(!s[j])
f[i]=j,j=-5;
}
if(f[n])
{
puts("First");
for(int i=0;i<=n;i++)
{
if(!(f[i]^f[n-l-i]))
{
printf("%d %d\n",i+1,l);
for(int j=i+1;j<=i+l;j++)
t[j]=1;
i=n+1;
}
}
}
else
puts("Second");
t[n+1]=t[0]=1;
fflush(stdout);
while(1)
{
scanf("%d%d",&x,&y);
if(!x&&!y)
break;
k=0;
for(int i=x;i<=x+y-1;i++)
t[i]=1;
for(int i=n;i>=0;i--)
{
nxt[i]=nxt[i+1];
if(t[i+1])
nxt[i]=i+1;
if(t[i])
k^=f[nxt[i]-i-1];
}
for(int i=1;i<=n;i++)
{
s[i]=s[i-1]+t[i],lst[i]=lst[i-1];
if(t[i-1])
lst[i]=i-1;
}
for(int i=1;i+l-1<=n;i++)
{
if(s[i-1]==s[i+l-1])
{
if(!(k^f[nxt[i]-lst[i]-1]^f[nxt[i+l-1]-i-l]^f[i-lst[i]-1]))
{
// printf("%d %d\n",k^f[nxt[i]-lst[i]-1],f[nxt[i+l-1]-i-l]^f[i-lst[i]-1]);
printf("%d %d\n",i,l);
for(int j=i;j<i+l;j++)
t[j]=1;
break;
}
}
}
fflush(stdout);
}
}
}
[ABC278G] Generalized Subtraction Game的更多相关文章
- Analysis of Two-Channel Generalized Sidelobe Canceller (GSC) With Post-Filtering
作者:凌逆战 地址:https://www.cnblogs.com/LXP-Never/p/12071748.html 题目:带后置滤波的双通道广义旁瓣相消器(GSC)的分析 作者:Israel Co ...
- [LeetCode] Generalized Abbreviation 通用简写
Write a function to generate the generalized abbreviations of a word. Example: Given word = "wo ...
- 广义线性模型(Generalized Linear Models)
前面的文章已经介绍了一个回归和一个分类的例子.在逻辑回归模型中我们假设: 在分类问题中我们假设: 他们都是广义线性模型中的一个例子,在理解广义线性模型之前需要先理解指数分布族. 指数分布族(The E ...
- LeetCode Generalized Abbreviation
原题链接在这里:https://leetcode.com/problems/generalized-abbreviation/ 题目: Write a function to generate the ...
- PAT 解题报告 1050. String Subtraction (20)
1050. String Subtraction (20) Given two strings S1 and S2, S = S1 - S2 is defined to be the remainin ...
- [Locked] Generalized Abbreviation
Write a function to generate the generalized abbreviations of a word. Example:Given word = "wor ...
- [ACM] ZOJ 3816 Generalized Palindromic Number (DFS,暴力枚举)
Generalized Palindromic Number Time Limit: 2 Seconds Memory Limit: 65536 KB A number that will ...
- Regression:Generalized Linear Models
作者:桂. 时间:2017-05-22 15:28:43 链接:http://www.cnblogs.com/xingshansi/p/6890048.html 前言 本文主要是线性回归模型,包括: ...
- [leetcode-592-Fraction Addition and Subtraction]
Given a string representing an expression of fraction addition and subtraction, you need to return t ...
- [LeetCode] Fraction Addition and Subtraction 分数加减法
Given a string representing an expression of fraction addition and subtraction, you need to return t ...
随机推荐
- 8、Mybatis之自定义映射
8.1.环境搭建 8.1.1.创建新module 创建名为mybatis_resultMap的新module,过程参考5.1节 8.1.2.创建t_emp和t_dept表 CREATE TABLE ` ...
- API接口设计规范
说明:在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃取)?除了https的协议之外,能不能加上通用的一套算法以及规范来保证传输的安全性呢? 下面我们 ...
- C盘无法创建文件处理
icacls c:\ /setintegritylevel M 打开终端执行上方命令,亲测可用
- Microsoft Build 2021大会开始后,Develop Blog一系列更新
.NET BLOG 发布.NET 6预览版4 https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-4/ 发布.NET MAUI ...
- Solution -「CF 392C」Yet Another Number Sequence
Description Link. 求 \(\sum_{i=1}^{n}\text{fibonacci}_{i}\times i^{k}=\sum_{i=1}^{n}(F_{i-1}+\text{fi ...
- 300PLC转以太网作为RTU主站连接智能电表
300PLC转以太网作为RTU主站连接智能电表 现场介绍: 西门子300PLC转以太网通过兴达易控MPI-ETH-XD1.0PLUS PLC转以太网模块把安科瑞的智能电表接入到300PLC里,读取电表 ...
- 基于TOTP算法的Github两步验证2FA(双因子)机制Python3.10实现
从今年(2023)三月份开始,Github开始强制用户开启两步验证2FA(双因子)登录验证,毫无疑问,是出于安全层面的考虑,毕竟Github账号一旦被盗,所有代码仓库都会毁于一旦,关于双因子登录的必要 ...
- c语言代码练习15
//使用togo跳转代码,阻止关机#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> ...
- Ubuntu 14.04解决登录界面无限循环的方法
在Ubuntu下配置Android的环境时,想像在Windows中那样在终端中直接启动adb,以为Linux和Windows一样,将adb的路径添加到环境变量中,于是将adb的路径也export到/e ...
- scnhealthcheck
在CPU补丁中,Oracle提供了一个脚本 scnhealthcheck.sql 用于检查数据库当前SCN的剩余情况.该脚本的算法和以上描述相同,最终将最大合理SCN 减去当前数据库SCN,计算得出一 ...