Codeforces 1375F - Integer Game(交互)
一个奇怪的做法。
首先我们猜测答案总是 First。考虑什么样的情况能够一步把对方一步干掉。方便起见我们假设 \(a<b<c\),那么如果 \(b-a=c-b\),并且上一步后手选择操作 \(c\),那么我们只需令 \(y=b-a\),不论后手再选择了哪一堆,总会出现两个石子数相同的堆,后手也就挂了。我们考虑怎样将所有情况归约到这种情况,经过仔细(反正这一步我是想了 ~1h)的思考,我发现对于 \(a,b,c\) 成等差数列,且上一步选择的是 \(a\) 对应的堆的情况也能把对方干掉,具体构造就是
令 \(d=b-a\),然后
- 第一步,选择 \(y=d\),那么此时后手只能选 \(c\) 对应的堆,此时三堆分别是 \(a,a+d,a+3d\)
- 第二步,选择 \(y=5d\),那么如果后手选择第一堆,那么三堆分别是 \(a+5d,a+d,a+3d\),回到了上面一次操作即可挂掉的情况。如果后手选择第二堆,那么三堆分别是 \(a,a+6d,a+3d\),也回到了上面的情况。
我们考虑如何将一般性的情况归约到上面两种情况。我们假设 \(d_1=b-a,d_2=c-b\),那么我们考虑这样一个做法,令 \(y=d_1-d_2\),那么
- 如果后手选第一堆,就回到了上面等差数列、且一步即可干掉的情况
- 如果后手选第三堆,就回到了上面等差数列、且两步(第一次 \(y=d\),第二次 \(y=5d\))可以干掉的情况
- 如果后手选择第二堆,那么我们再次假设 \(d_1’=b-a,d_2’=c-b\),并且假设 \(b+d_1-d_2<c\) 恒成立,那么我们再令 \(y=d’_1-d’_2\),就回到了上面的情况,又因为此时后手显然不能选第二堆,因此不会出现递归,也就证明了构造的正确性。
但是这个做法要能够行得通需要有一些条件,首先你第一次必须有 \(y>0\),因此需有 \(d_1>d_2\),还有就是第二步中我们有 \(b+d_1-d_2<c\) 的假设,即 \(d_1<2d_2\),因此该做法行得通的条件是 \(d_2\le d_1<2d_2\)(至于为什么左边可以取等,是因为 \(d_1=d_2\) 的情况本身就是等差数列,可以归约到上面的第二种情况)。考虑怎样将其他情况转化为这两种情况,每次只需令 \(y=d_1+d_2\) 直到 \(d_2\le d_1<2d_2\) 成立即可。证明大概就,从第一次操作结束以后开始,我们每次操作的元素肯定会成为三个数的最大值对吧,那么从第一轮以后后手只能操作中间那个元素,因此问题可以转化为这样一个问题,有两个数 \(x,y\),每次操作需执行 \(\text{swap}(x,y)\),并令 \(x\leftarrow x+y\),问什么时候 \(y\le x<2y\) 成立,如果 \(x\ge 2y\),那么进行一次操作以后 \(x\le x+y<2x\) 符合条件;如果 \(x<y\),那么换完以后 \(x\leftarrow x+y,y\leftarrow x\),回到了 \(x\ge 2y\) 的情况,因此我们总可以将问题转化为 \(d_2\le d_1<2d_2\) 的情况。
int _1,_2,_3;
pair<ll,int> a[4];int flg=0;
void getid(){sort(a+1,a+4);_1=a[1].se,_2=a[2].se,_3=a[3].se;}
void prt(){
for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) if(a[j].se==i)
printf("%d%c",a[j].fi," \n"[i==3]);
printf("%d %d %d\n",_1,_2,_3);
}
void oper(ll x){
if(!x) return;
printf("%lld\n",x);fflush(stdout);
int p;scanf("%d",&p);
if(!p) exit(0);
if(p==_1) a[1].fi+=x,flg=1;
if(p==_2) a[2].fi+=x,flg=2;
if(p==_3) a[3].fi+=x,flg=3;
// prt();
getid();
}
void work(int stage){
if(stage==2){
oper(abs(a[3].fi-a[2].fi));
} else {
oper(abs(a[3].fi-a[2].fi));
oper(5*abs(a[2].fi-a[1].fi));
work(2);
}
}
int main(){
scanf("%lld%lld%lld",&a[1].fi,&a[2].fi,&a[3].fi);puts("First");
a[1].se=1;a[2].se=2;a[3].se=3;getid();
if(2ll*a[2].fi==a[1].fi+a[3].fi) work(1);
else{
ll d1=abs(a[2].fi-a[1].fi),d2=abs(a[3].fi-a[2].fi);
while(d2*2<d1||d1<d2){
oper(d1+d2);d1=abs(a[2].fi-a[1].fi);
d2=abs(a[3].fi-a[2].fi);
} //puts("-1");
oper(abs(d1-d2));
if(flg==1) work(1);
else if(flg==2){
d1=abs(a[2].fi-a[1].fi),d2=abs(a[3].fi-a[2].fi);
oper(abs(d1-d2));
if(flg==1) work(1);
else work(2);
} else work(2);
}
return 0;
}
Codeforces 1375F - Integer Game(交互)的更多相关文章
- Codeforces 1137D - Cooperative Game - [交互题+思维题]
题目链接:https://codeforces.com/contest/1137/problem/D 题意: 交互题. 给定如下一个有向图: 现在十个人各有一枚棋子(编号 $0 \sim 9$),在不 ...
- Codeforces.1129E.Legendary Tree(交互 二分)
题目链接 \(Description\) 有一棵\(n\)个点的树.你需要在\(11111\)次询问内确定出这棵树的形态.每次询问你给定两个非空且不相交的点集\(S,T\)和一个点\(u\),交互库会 ...
- Codeforces 1114E(简单交互)
这里有一道老实题,大家快来踩爆它! 交互题:根据你的输出决定下一次的输入. 请听题: 管理员有个乱序数列(举例:{14, 24, 9, 19}),排序以后是个等差数列({9, 14, 19, 24}) ...
- Codeforces 1205C Palindromic Paths (交互题、DP)
题目链接 http://codeforces.com/contest/1205/problem/C 题解 菜鸡永远做着变巨的梦 然而依然连div1BC题都不会做 要是那天去打cf怕是又要1题滚粗了.. ...
- Codeforces.714D.Searching Rectangles(交互 二分)
题目链接 \(Description\) 在一个\(n*n\)的二维平面中有两个不相交的整点矩形,每次可以询问两个矩形有几个完全在你给出的一个矩形中.200次询问内确定两个矩形坐标. \(Soluti ...
- Codeforces Round #371 (Div. 2) D. Searching Rectangles 交互题 二分
D. Searching Rectangles 题目连接: http://codeforces.com/contest/714/problem/D Description Filya just lea ...
- Minimum Integer CodeForces - 1101A (思维+公式)
You are given qq queries in the following form: Given three integers lili, riri and didi, find minim ...
- Codeforces Round #523 (Div. 2) F. Katya and Segments Sets (交互题+思维)
https://codeforces.com/contest/1061/problem/F 题意 假设存在一颗完全k叉树(n<=1e5),允许你进行最多(n*60)次询问,然后输出这棵树的根,每 ...
- Codeforces Round #609 (Div. 2) C. Long Beautiful Integer
链接: https://codeforces.com/contest/1269/problem/C 题意: You are given an integer x of n digits a1,a2,- ...
随机推荐
- ES2020新特性记录
1.可选链操作符 // oldlet ret = obj && obj.first && obj.first.second// newlet ret = obj?.fi ...
- DM8数据库单机安装
一.系统概要 表1 部署情况一览表 操作系统 Windows10 数据库版本 DM8(开发版) 数据库类型 单机 磁盘挂载 无 Key信息 无 二.操作系统信息检查 2.1 操作系统版本 [root@ ...
- elasticsearch的索引重建
我们知道es在字段的mapping建立后就不可再次修改mapping的值.在我们实际的情况下有些时候就是需要修改mapping的值,解决方案就是重新构建索引数据. 方式一 : 使用索引别名,创建另外一 ...
- PWM通过RC低通滤波器模拟DAC
当我们电路需要DAC而单片机并没有DAC外设时,则可采用PWM通过RC低通滤波器来模拟实现DAC功能. RC低通滤波器 当采用低通滤波器模拟DAC时,PWM频率应远大于RC低通滤波电路的截止频率fc= ...
- Django(72)Django认证系统库--djoser
djoser是什么? 作用:Django认证系统的REST实现.djoser库提供了一组Django Rest Framework视图,用于处理注册.登录.注销.密码重置和帐户激活等基本操作.它适 ...
- 奇偶位交换 牛客网 程序员面试金典 C++ Python
奇偶位交换 牛客网 程序员面试金典 C++ Python 题目描述 请编写程序交换一个数的二进制的奇数位和偶数位.(使用越少的指令越好) 给定一个int x,请返回交换后的数int. 测试样例: 10 ...
- 【Docker】Maven打包SpringBoot项目成Docker镜像并上传到Harbor仓库(Eclipse、STS、IDEA、Maven通用)
写在前面 最近,在研究如何使用Maven将SpringBoot项目打包成Docker镜像并发布到Harbor仓库,网上翻阅了很多博客和资料,发现大部分都是在复制粘贴别人的东西,没有经过实践的检验,根本 ...
- codeql初探
CodeQL初探 环境搭建 基于Windows 基于Mac 下载codeql https://github.com/github/codeql-cli-binaries/releases/latest ...
- flask 中的endpoint有什么用?
url到view function之间的一个中间概念,默认是view function的名字,相比于直接使用view function, 使用end point 提供了一个命名空间,可以让不同蓝图的v ...
- django test, app aren't loaded yet
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet. 解决方法: 用django的TestCase from djan ...