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. POJ 2914 - Minimum Cut - [stoer-wagner算法讲解/模板]

    首先是当年stoer和wagner两位大佬发表的关于这个算法的论文:A Simple Min-Cut Algorithm 直接上算法部分: 分割线 begin 在这整篇论文中,我们假设一个普通无向图G ...

  2. YARN架构设计详解

    一.YARN基本服务组件 YARN是Hadoop 2.0中的资源管理系统,它的基本设计思想是将MRv1中的JobTracker拆分成了两个独立的服务:一个全局的资源管理器ResourceManager ...

  3. LINUX系统中安装ORACLE11g的安装文档,含部分问题解答

    1.无法使用命令 /usr/bin/xdpyinfo 自动检查显示器颜色 在linux as5下安装oracle11g,环境都配置好了!等运行./runInstaller的时候无法弹出安装的图形界面我 ...

  4. MySQL命令:创建数据库、插入数据

    简介: 学习mysql环境为ubantu,下面记录一些基本的创建数据库和插入数据的口令 打开MySQL 服务并使用 root 登录: --打开 MySQL 服务 sudo service mysql ...

  5. linux UVC and hardware viewer

    至于从哪个版本开始内核支持UVC,官方的话是“Linux 2.6.26 and newer includes the Linux UVC driver natively.” 1.查看摄像头ID: [r ...

  6. dp——01背包

    今天学习了01背包不算是复习吧,发现完全不会状态之间的转移如此让我捉摸不透尽管很简单但本人觉得还是很难,奇怪地拐点也很难被发现.知道01背包二维的话是很慢的,然后就是非得先打二维毕竟一维是根据二维的想 ...

  7. 洛谷P3166 数三角形 [CQOI2014] 数论

    正解:数论 解题报告: 传送门! 很久以前做的题了呢,,,回想方法还想了半天QAQ 然后写这题题解主要是因为看到了好像有很新颖的法子,就想着,学习一下趴,那学都学了不写博客多可惜 首先港下最常规的方法 ...

  8. Ajax返回乱码

    1.关于JSP页面中的pageEncoding和contentType两种属性的区别: pageEncoding是jsp文件本身的编码,contentType的charset是指服务器发送给客户端时的 ...

  9. 01_Python 基础课程安排

    Python 基础课程安排 目标 明确基础班课程内容 课程清单 序号 内容 目标 01 Linux 基础 让大家对 Ubuntu 的使用从很 陌生 达到 灵活操作 02 Python 基础 涵盖 Py ...

  10. 常用python包(依赖)Ubuntu下

    amqp==1.4.9anyjson==0.3.3apturl==0.5.2beautifulsoup4==4.4.1billiard==3.3.0.23blinker==1.3Brlapi==0.6 ...