P1852 跳跳棋(建模&LCA)

往外跳有个两个状态,往里跳只能有一个唯一父亲状态。

所以是一个二叉树。

将给定的起始和目标状态 向上找到根,判断是否相等。不相等无解。

否则类似求LCA的思想二分步数即可。

// Problem: P1852 跳跳棋
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1852
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Date: 2021-07-30 09:43:38
// --------by Herio--------#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define IOS ios::sync_with_stdio(false),cin.tie(0)
void Print(int *a,int n){for(int i=1;i<n;i++)printf("%d ",a[i]);printf("%d\n",a[n]);
}
struct node{int a[3];bool operator != (node  b)const{for(int i=0;i<3;i++) if(a[i]!=b.a[i]) return true;return false;}
}A,B;
int tmp;
node fun(node A,int k){int d1=A.a[1]-A.a[0],d2=A.a[2]-A.a[1];if(d1==d2) return A;else if(d1<d2){int t=min(k,(d2-1)/d1);k-=t;tmp+=t;A.a[0]+=t*d1,A.a[1]+=t*d1;}else {int t=min(k,(d1-1)/d2);k-=t;tmp+=t;A.a[1]-=t*d2,A.a[2]-=t*d2;      }if(k) return fun(A,k);else return A;
}
int main(){for(int i=0;i<3;i++) scanf("%d",&A.a[i]);for(int i=0;i<3;i++) scanf("%d",&B.a[i]);sort(A.a,A.a+3);sort(B.a,B.a+3);int dep1=0,dep2=0;node na=fun(A,inf);dep1=tmp,tmp=0;node nb=fun(B,inf);dep2=tmp,tmp=0;if(na!=nb) return puts("NO"),0;if(dep1>dep2){swap(dep1,dep2);swap(A,B);}int ans=dep2-dep1;B=fun(B,ans);int l=0,r=dep1;while(l<r){int m=l+r>>1;if(fun(A,m)!=fun(B,m)) l=m+1;else r=m;}ans+=(l<<1);puts("YES");printf("%d\n",ans);return 0;
}

P1852 跳跳棋(建模LCA)相关推荐

  1. P1497[洛谷]P1852跳跳棋

    P1497[洛谷]P1852跳跳棋 标签(空格分隔): 信息 图论 二分 洛谷 考题,看到就觉得是不可能写出来的那种,于是打了个bfs直接走人. 考完之后听吕大佬讲过之后觉得此题可谓绝妙啊%%% 屁颠 ...

  2. BZOJ 2144 跳跳棋(LCA+欧几里德+二分答案)

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

  3. 跳跳棋【LCA】【二分】

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

  4. bzoj2144 [2011集训队出题] 跳跳棋 倍增 lca

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

  5. 洛谷P1852:跳跳棋(LCA,树形结构)

    解析 考虑一个三元组(x,y,z)(x,y,z)(x,y,z),看它能如何跳 要么是yyy往左右跳,左右边界会变大 要么是两边往中间跳,由于最多跨过一个棋子,所以左右边界会变小 当三点等距时,无法往中 ...

  6. [luogu]P1852跳跳棋

    题目重点是每次不能跳过两个棋子 即对于每一个棋子的状态(a,b,c) (a<b<c) 最多有两种移动的方式 1.中间往两边跳 (a,b,c)-->(2b-a,a,c)或(a,c,2b ...

  7. BZOJ 2144 跳跳棋(神仙建模题,倍增 LCA,二分)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2144 是 hydro 的 BZOJ ...

  8. 跳跳棋(国家集训队,LCA,洛谷P1852,BZOJ[2144])

    文章目录 题目 思路 代码 题目 题目链接 描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有333颗棋子,分别在a,b,ca,b ...

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

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

最新文章

  1. STL算法algorithm,
  2. Day1-dns Extension
  3. mycat 资料汇总
  4. memcpy(cv::Mat.data,unsigned char *,320x240),保存数据失真问题解决方法
  5. oracle虚拟用户是什么意思,lr脚本中oracle 2tier虚拟用户相关内容
  6. 这么香的技术还不快点学起来,含BATJM大厂
  7. http dns django
  8. [设计模式-行为型]解释器模式(Interpreter)
  9. Rplidar学习(三)—— ROS下进行rplidar调试
  10. C#:$符号和@符号的用法介绍
  11. 暑假学习打卡【2】——北理工乐学第一周第二周作业
  12. 小米商场html幻灯片代码,小米商城商品详情页布局(HTML代码太长贴不上去,只能贴jQuery代码)...
  13. 学刘红杰老师博客营销,知如何提高博客访问流量
  14. 科学计算机的用途,科学计算器应用介绍及主要用途
  15. css translate 坐标,translate()
  16. CSS 斜条纹进度条动画
  17. 常用的人脸检测识别等数据集百度云下载
  18. html自动刷新 idea,idea新建css idea怎么刷新导入的css
  19. Lombok 注解说明
  20. 什么是Precision和Recall和FPR和TPR?

热门文章

  1. linux服务器22端口不通,怎么解决linux的端口不通问题
  2. 服务器项目命名规则,云服务器命名规范
  3. 计算机病毒狭义和广义的区别,狭义相对论和广义相对论的区别是什么?
  4. cadence软件初识
  5. Elasticsearch: 运用 Pinned query 来提高文档的排名 (7.5发行版新功能)
  6. 算法设计与分析——排序算法:比较排序算法的下界
  7. 计算机视觉与人的视觉
  8. 低盈利、高现金流:紫光财报背后的半导体另类求生之路
  9. 你真的了解composer吗
  10. 一个测试工程师走进一家酒吧……