P1852 跳跳棋(建模LCA)
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)相关推荐
- P1497[洛谷]P1852跳跳棋
P1497[洛谷]P1852跳跳棋 标签(空格分隔): 信息 图论 二分 洛谷 考题,看到就觉得是不可能写出来的那种,于是打了个bfs直接走人. 考完之后听吕大佬讲过之后觉得此题可谓绝妙啊%%% 屁颠 ...
- BZOJ 2144 跳跳棋(LCA+欧几里德+二分答案)
跳跳棋 问题描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位 ...
- 跳跳棋【LCA】【二分】
>Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少 ...
- bzoj2144 [2011集训队出题] 跳跳棋 倍增 lca
Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把 ...
- 洛谷P1852:跳跳棋(LCA,树形结构)
解析 考虑一个三元组(x,y,z)(x,y,z)(x,y,z),看它能如何跳 要么是yyy往左右跳,左右边界会变大 要么是两边往中间跳,由于最多跨过一个棋子,所以左右边界会变小 当三点等距时,无法往中 ...
- [luogu]P1852跳跳棋
题目重点是每次不能跳过两个棋子 即对于每一个棋子的状态(a,b,c) (a<b<c) 最多有两种移动的方式 1.中间往两边跳 (a,b,c)-->(2b-a,a,c)或(a,c,2b ...
- BZOJ 2144 跳跳棋(神仙建模题,倍增 LCA,二分)【BZOJ修复工程】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2144 是 hydro 的 BZOJ ...
- 跳跳棋(国家集训队,LCA,洛谷P1852,BZOJ[2144])
文章目录 题目 思路 代码 题目 题目链接 描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有333颗棋子,分别在a,b,ca,b ...
- 洛谷 P1852 [国家集训队] 跳跳棋
题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...
最新文章
- STL算法algorithm,
- Day1-dns Extension
- mycat 资料汇总
- memcpy(cv::Mat.data,unsigned char *,320x240),保存数据失真问题解决方法
- oracle虚拟用户是什么意思,lr脚本中oracle 2tier虚拟用户相关内容
- 这么香的技术还不快点学起来,含BATJM大厂
- http dns django
- [设计模式-行为型]解释器模式(Interpreter)
- Rplidar学习(三)—— ROS下进行rplidar调试
- C#:$符号和@符号的用法介绍
- 暑假学习打卡【2】——北理工乐学第一周第二周作业
- 小米商场html幻灯片代码,小米商城商品详情页布局(HTML代码太长贴不上去,只能贴jQuery代码)...
- 学刘红杰老师博客营销,知如何提高博客访问流量
- 科学计算机的用途,科学计算器应用介绍及主要用途
- css translate 坐标,translate()
- CSS 斜条纹进度条动画
- 常用的人脸检测识别等数据集百度云下载
- html自动刷新 idea,idea新建css idea怎么刷新导入的css
- Lombok 注解说明
- 什么是Precision和Recall和FPR和TPR?