P1852 [国家集训队]跳跳棋

lca+二分

详细解析见题解

对于每组跳棋,我们可以用一个三元组(x,y,z)表示

我们发现,这个三元组的转移具有唯一性,收束性

也就是说,把每个三元组当成点,以转移关系为边,那么可以得到一棵树

显然最短步数==lca

然后我们就可以愉快地跑lca了

但是还要加优化,就是有可能出现2个靠得近的棋子,但与另一个棋子离得远的情况

这时要跳很多次,但是可以加速,详见代码

最后二分求lca

code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
struct node{
int a[];
bool operator == (const node &tmp) const{return a[]==tmp.a[]&&a[]==tmp.a[]&&a[]==tmp.a[];}
}f,t,p1,p2;
inline int find(node x){
int d1=x.a[]-x.a[],d2=x.a[]-x.a[]; bool c=;
if(d1==d2) {p1=x; return ;}
if(d1<d2) swap(d1,d2),c=;
int cnt=d1/d2,d=d1%d2; //加速跳
if(!d) d+=d2,--cnt;
if(c) cnt+=find((node){x.a[]-d-d2,x.a[]-d,x.a[]});
else cnt+=find((node){x.a[],x.a[]+d,x.a[]+d+d2});
return cnt;
}
inline void change(node x,int step){
int d1=x.a[]-x.a[],d2=x.a[]-x.a[]; bool c=;
if(d1==d2||!step) {p1=x; return ;}
if(d1<d2) swap(d1,d2),c=;
int cnt=d1/d2,d=d1%d2;
if(!d) d+=d2,--cnt;
if(c){
if(step>=cnt) change((node){x.a[]-d-d2,x.a[]-d,x.a[]},step-cnt);
else change((node){x.a[]-d-d2*(cnt-step+),x.a[]-d-d2*(cnt-step),x.a[]},);
}
else{
if(step>=cnt) change((node){x.a[],x.a[]+d,x.a[]+d+d2},step-cnt);
else change((node){x.a[],x.a[]+d+d2*(cnt-step),x.a[]+d+d2*(cnt-step+)},);
}
}
inline bool same(int k){
change(f,k); node r1=p1;
change(t,k); node r2=p1;
return r1==r2;
}
int main(){
scanf("%d%d%d%d%d%d",&f.a[],&f.a[],&f.a[],&t.a[],&t.a[],&t.a[]);
sort(f.a,f.a+); sort(t.a,t.a+);
int sp1=find(f); p2=p1;
int sp2=find(t); //求相对于树根的深度
if(!(p1==p2)) {printf("NO"); return ;} //树根不同
if(sp1<sp2) swap(sp1,sp2),swap(f,t);
int ans=sp1-sp2;
change(f,ans); f=p1; //使两点同一深度
int l=,r=sp2; //二分找lca
while(l<r){
int mid=l+((r-l)>>);
if(same(mid)) r=mid;
else l=mid+;
}printf("YES\n%d",(l<<)+ans);
return ;
}

P1852 [国家集训队]跳跳棋的更多相关文章

  1. 洛谷 P1852 [国家集训队]跳跳棋 解题报告

    P1852 [国家集训队]跳跳棋 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\), ...

  2. 洛谷 P1852 [国家集训队] 跳跳棋

    题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...

  3. luogu P1852 [国家集训队]跳跳棋

    luogu 直接操作是不可能的,考虑发现一些性质.可以发现如果每次跳的棋子都是两边的,那么最多只有一种方案,那么就把这样操作得到的状态记为当前状态的父亲,从一个状态这样做一定会结束.那么如果两个状态只 ...

  4. 【洛谷】1852:[国家集训队]跳跳棋【LCA】【倍增?】

    P1852 [国家集训队]跳跳棋 题目背景 原<奇怪的字符串>请前往 P2543 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个 ...

  5. [BZOJ2144]国家集训队 跳跳棋

    题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...

  6. Luogu P1852 BZOJ 2144 [国家集训队]跳跳棋

    qwq 这题一看就不会,如果不是gg让做我是坚决不会做的 画图模拟,因为一次只能跳过一个棋子,所以对于一种情况只有三种移动方式: 中间向左跳 中间向右跳 左或右(距中间近的那个)向中间跳 发现,除了跳 ...

  7. bzoj2144 【国家集训队2011】跳跳棋

    Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他 ...

  8. [BZOJ2144][国家集训队2011]跳跳棋

    题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上. 每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\),\(c\)这三个位置. 我们要通 ...

  9. P1852 跳跳棋 [LCA思想+二分答案]

    题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有\(3\)颗棋子,分别在\(a,b,c\)这三个位置.我们要通过最少的跳动 ...

随机推荐

  1. Java--static、final、static final的区别

    一.final final修饰类:表示该类不能被继承:final类中的方法默认是final的: final修饰方法:表示该方法无法被重写: final修饰方法参数:表示在变量的生存期中它的值不能被改变 ...

  2. 牛客网多校赛第九场A-circulant matrix【数论】

    链接:https://www.nowcoder.com/acm/contest/147/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  3. 解决VMware安装ubuntu16.04后无法全屏的问题

    参考教程:http://www.jb51.net/os/Ubuntu/356462.html 双系统经常崩,故在windows10下装了个ubuntu的虚拟机,安装完成后无法全屏,进入系统设置调试显示 ...

  4. LCA——最近公共祖先

    今天终于把倍增的LCA搞懂了!尽管周测都没写,尽管lca其实很简单,但这也是进度君的往前一点点的快乐.学渣的呻吟. 倍增的lca其实关键就在于二进制的二进制的拆分(显然是两次的拆分,很奇妙,懂二进制的 ...

  5. flask中的url_for

    转自:https://blog.csdn.net/dengfan666/article/details/78320188 1.URL反转:根据视图函数名称得到当前所指向的url 2.url_for() ...

  6. 常用社交网络(微博等)动态新闻(feed、新鲜事)系统浅析(转)

    add by zhj:同时也看看国外牛逼公司是怎么做的吧 Stream-Framework    Python实现的feed Twitter 2013 Redis based, database fa ...

  7. Animator Override Controller学习及性能测试

    本文由博主(YinaPan)原创,转载请注明出处: http://www.cnblogs.com/xsln/p/Animator_Override_Controller.html 一.Animator ...

  8. HPC高性能计算知识: 异构并行计算

    版权声明:很多其它内容,请关注[架构师技术联盟]公众号 https://blog.csdn.net/BtB5e6Nsu1g511Eg5XEg/article/details/80059122 当摩尔定 ...

  9. vertx连接mysql数据库

    1:创建一个verticle组件 package jdbcConnection; import io.vertx.core.AbstractVerticle; import io.vertx.core ...

  10. R之ddlpy函数学习[转载]

    转自:https://www.cnblogs.com/aloiswei/p/6032513.html 1.函数 ddply(.data, .variables, .fun = NULL, ..., . ...