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. 【c++ Prime 学习笔记】第8章 IO库

    C++语言不直接处理输入输出,而是通过标准库中的一组类来处理IO 1.2节介绍的IO库: istream(输入流)类型,提供输入 ostream(输出流)类型,提供输出 cin,是istream对象, ...

  2. The WebSocket session [0] has been closed and no method (apart from close()) may be called on a closed session-ConcurrentHashMap使用在webSocket中采的坑

    一.问题由来 现在开发的一个项目中使用webSocket这个技术和Unity客户端程序进行联动操作,因为socket连接相对来说比http请求连接更加的快速,而且是 一个长链接,方便于这个项目进行其他 ...

  3. 冲刺noip2021模拟16

    T1 树上的数 考场上比较脑瘫没有想到直接dfs就行了这样是O(n+m)的,傻不拉几地多添了个log, 不过因为accoder的评测机太弱了,绝大多数人的正解都是60分,所以没有什么差别: 直接dfs ...

  4. 2021.10.7考试总结[NOIP模拟71]

    信心赛,但炸了.T3SB错直接炸飞,T4可以硬算的组合数非要分段打表求阶乘..T2也因为一个细节浪费了大量时间.. 会做难题很好,但首先还是要先把能拿的分都拿到. T1 签到题 结论:总可以做到对每个 ...

  5. RF射频传输,原理介绍,三分钟看懂!发射功率、接收灵敏度详解!

    射频是什么? 官方说法:RF,Radio Frequency. (不懂的人,看了还是不懂,不过对于物联网行业的开发工程师.产品经理和项目经理,还是有需要对射频有个基础了解的.) 燚智能解读: 两个人, ...

  6. 助你上手Vue3全家桶之VueX4教程

    目录 1,前言 2,State 2.1,直接使用 2.2,结合computed 3,Getter 3.1,直接使用 3.2,结合computed 4,Mutation 4.1,直接使用 4.2,结合c ...

  7. AGC036 A-Triangle | 构造

    题目链接 题意: 给出一个数$S(1\leqslant S \leqslant 10^{18})$. 要求在平面直角坐标系中找到三个点$(X_1,Y_1),(X_2,Y_2),(X_3,Y_3)$,满 ...

  8. 第06课 OpenGL 纹理映射

    纹理映射: 在这一课里,我将教会你如何把纹理映射到立方体的六个面. 学习 texture map 纹理映射(贴图)有很多好处.比方说您想让一颗导弹飞过屏幕.根据前几课的知识,我们最可行的办法可能是很多 ...

  9. 面试题系列:工作5年,第一次这么清醒的理解final关键字?

    面试题:用过final关键字吗?它有什么作用 面试考察点 考察目的: 了解面试者对Java基础知识的理解 考察人群: 工作1-5年,工作年限越高,对于基础知识理解的深度就越高. 背景知识 final关 ...

  10. linux环境下redis安装(redis伪集群搭建)

    redis在linux环境下搭建 1.创建目录 [root@192 local]# mkdir /usr/local/redis 2.下载redis,并解压 [root@192 local]# wge ...