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. 浏览器有别_HTTP报文的回车换行

    本来以为浏览器HTTP报文的生成应该是完全一致的.但最近在做一个项目的时候,发现Safari和Chrome提交同一份表单,后端的处理结果不一致.看提交结果呢,是因为Safari多了个回车.由于原项目的 ...

  2. pycharm运行测试程序提示no tests were found

    转载: https://blog.csdn.net/qq_33834328/article/details/75095078

  3. UltraSoft - Beta - 测试报告

    UltraSoft - Beta - 测试报告 在测试过程中发现了多少Bug?有哪些是Beta阶段的新Bug?有哪些是Alpha阶段没有发现的Bug? 很多Bug在开发阶段就已经经过测试了,我们在Be ...

  4. OO_JAVA_JML系列第三次作业__架构之谈

    OO_JAVA_JML系列第三次作业 ## ----架构之谈 目录 OO_JAVA_JML系列第三次作业 出发点 操作的可分离性 操作本身的多样性 实现手段:表驱动编程 储存 注册 出发点 操作的可分 ...

  5. Machine learning(1-Introduction)

    1.What is machine learning Field of study that gives computers the ability to learn without being ex ...

  6. 洛谷 P2221 [HAOI2012]高速公路

    链接: P2221 题意: 有 \(n(1\leq n\leq 10^5)\) 个点,从第 \(i(1\leq i< n)\) 个点向第 \(i+1\) 个点连有边.最初所有边长 \(v_i\) ...

  7. 对SQLServer错误使用聚集索引的优化案例(千万级数据量)

    前言: 半个月前发了文章 SQLServer聚集索引导致的插入性能低 终于等到生产环境休整半天,这篇文章是对前文的实际操作. 以下正文开始: 异常:近期发现偶尔有新数据插入超时. 分析:插入条码有多种 ...

  8. hdu 5102 The K-th Distance (队列+生成法,,)

    题意: N个点的一棵树.定义点u和点v的距离等于它们之间的路径(唯一的)的长度.这样我们可以得到n*(n-1)/2个距离. 将它们从小到大排序,问前K个数的和是多少. 思路: 将边长为1的树枝都入队列 ...

  9. 20191310Lee_yellow缓冲区溢出实验

    缓冲区溢出实验 1.什么是缓冲区溢出 ​ 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据 ...

  10. 【Azure 存储服务】如何把开启NFS 3.0协议的Azure Blob挂载在Linux VM中呢?(NFS: Network File System 网络文件系统)

    问题描述 如何把开启NFS协议的Azure Blob挂载到Linux虚拟机中呢? [答案]:可以使用 NFS 3.0 协议从基于 Linux 的 Azure 虚拟机 (VM) 或在本地运行的 Linu ...