Codeforces 题面传送门 & 洛谷题面传送门

一个奇怪的做法。

首先我们猜测答案总是 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(交互)的更多相关文章

  1. Codeforces 1137D - Cooperative Game - [交互题+思维题]

    题目链接:https://codeforces.com/contest/1137/problem/D 题意: 交互题. 给定如下一个有向图: 现在十个人各有一枚棋子(编号 $0 \sim 9$),在不 ...

  2. Codeforces.1129E.Legendary Tree(交互 二分)

    题目链接 \(Description\) 有一棵\(n\)个点的树.你需要在\(11111\)次询问内确定出这棵树的形态.每次询问你给定两个非空且不相交的点集\(S,T\)和一个点\(u\),交互库会 ...

  3. Codeforces 1114E(简单交互)

    这里有一道老实题,大家快来踩爆它! 交互题:根据你的输出决定下一次的输入. 请听题: 管理员有个乱序数列(举例:{14, 24, 9, 19}),排序以后是个等差数列({9, 14, 19, 24}) ...

  4. Codeforces 1205C Palindromic Paths (交互题、DP)

    题目链接 http://codeforces.com/contest/1205/problem/C 题解 菜鸡永远做着变巨的梦 然而依然连div1BC题都不会做 要是那天去打cf怕是又要1题滚粗了.. ...

  5. Codeforces.714D.Searching Rectangles(交互 二分)

    题目链接 \(Description\) 在一个\(n*n\)的二维平面中有两个不相交的整点矩形,每次可以询问两个矩形有几个完全在你给出的一个矩形中.200次询问内确定两个矩形坐标. \(Soluti ...

  6. Codeforces Round #371 (Div. 2) D. Searching Rectangles 交互题 二分

    D. Searching Rectangles 题目连接: http://codeforces.com/contest/714/problem/D Description Filya just lea ...

  7. Minimum Integer CodeForces - 1101A (思维+公式)

    You are given qq queries in the following form: Given three integers lili, riri and didi, find minim ...

  8. Codeforces Round #523 (Div. 2) F. Katya and Segments Sets (交互题+思维)

    https://codeforces.com/contest/1061/problem/F 题意 假设存在一颗完全k叉树(n<=1e5),允许你进行最多(n*60)次询问,然后输出这棵树的根,每 ...

  9. 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,- ...

随机推荐

  1. Redis分布式锁的正确实现方式[转载]

    前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...

  2. .jar文件没有Java(TM) Platform SE binary打开方式解决办法

    下面是我个人在打开.jar文件时候的一些小问题: 明明已经配置好了环境变量.jar文件却没有 Java(TM) Platform SE binary 的打开方式, 网上查了资料点明是环境变量的问题,后 ...

  3. 工厂模式--摆脱你日复一日new对象却依旧单身的苦恼!

    前言 每每谈及到Java,就不免会想到一个悲伤的事实:你是否每天都在new对象,却依然坚守在单身岗上屹立不倒.(所谓面向对象编程hhh),这篇来学一下工厂模式,摆脱new对象的苦恼! 知识点 传统工厂 ...

  4. Java:异常小记

    Java:异常小记 对 Java 中的 异常 ,做一个微不足道的小小小小记 Error 和 Exception 相同点: Exception 和Error 都是继承了 Throwable 类,在 Ja ...

  5. BUAA2020软工作业(四)——结对项目

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目作业 我在这个课程的目标是 进一步提高自己的编码能力,工程能力,团队协作能力 这个作业在哪 ...

  6. SpringCloud微服务实战——搭建企业级开发框架(八):使用注解校验微服务消息参数

      平时开发过程中,经常要用到参数校验,如果直接在代码逻辑里面写参数校验,代码有点冗余且用起来不是非常方便,显得代码逻辑复杂且重复代码太多,这里我们使用注解的方式进行参数校验,SpringBoot中常 ...

  7. C/C++中浮点数输出精度的问题

    本文使用C++语言书写,对于C的小伙伴们,如果编译不通过的话--就说明C里面没有这个内容,可以跳过 通常来说,我们书写程序主要只用整形变量 (signed/unsigned) (long/long l ...

  8. createContext 你用对了吗?

    目录 前言 性能问题的根源 问题1(整体重复渲染):Provider组件包裹的子组件全部渲染 问题2(局部重复渲染):使用useContext导致组件渲染 解决方案 解决问题1 解决问题2 参考 前言 ...

  9. Python super(Todo,self).__init__() TypeError: super() argument 1 must be type, not classobj

    示例如下 class A(): def __init__(self):pass class B(A): def __init__(self): super(A, self).__init__() 当调 ...

  10. palindrome-partitioning-ii leetcode C++

    Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...