qwq

这题一看就不会,如果不是gg让做我是坚决不会做的

画图模拟,因为一次只能跳过一个棋子,所以对于一种情况只有三种移动方式:

  1. 中间向左跳
  2. 中间向右跳
  3. 左或右(距中间近的那个)向中间跳

发现,除了跳到边界,当左右到中间的距离相等的时候就不能再向中间跳了,

而任意一种情况只要一直重复方式3就能达到这样的平衡状态,也就是说这个状态可以通过方式1、2的组合达到这种情况所有的其他状态。

把这样的平衡状态当作这种情况的父亲(根节点)。

那么,首先判断两种情况的根节点是否相同,

如果相同,说明两种情况在向根节点转移的过程中可能会出现相等的情况。

最坏的情况,就是一种情况先转移到根节点,再转移到另一种情况。

如果把转移的过程看做一个树形结构,从某个点向左、右跳是左、右儿子,向中间跳(只有一种可能)是父亲,

那么从两种情况同时向上找,就类似于一个求lca的过程!

不过这棵树的左右儿子都是无限的,没法求出所有情况,所以不需要真的求出一棵树。

只要模拟在树上求LCA的过程即可。

记录左右两点到中间的距离x,y,若x<y,则左边向中间跳,即左坐标+2x,等同于左、中两点的坐标都+x,

反之则右、中两点的坐标都-y。

转移的过程中记录转移的步数可以得到深度。

首先在找根结点的时候可以得到两种情况到根结点的深度dA,dB,

然后仿照LCA的过程,把较深的一个向上走|dA-dB|步。

这时问题来了,既然没有完整的树,也就没法通过倍增的方法向上跳。

那么就只能一步一步的试了,如果向上一步后两种情况的坐标不同就两步.....

二分答案枚举步数可以优化这个过程,如果跳mid步后相同,就r=mid,否则l=mid+1。可以看出这个过程和倍增求LCA也是很相似的。

最后答案即为两个同步跳的+深的节点自己跳的=ans*2+|dA-dB|。

但是考虑这样一种情况:左、中两点非常近,但右点非常远。这时候左中两点来回相互跳要重复很多次,

这个y-x-x-x-…一直减到x≥y为止的过程,可以化简为y-kx。

k=(y-1)/x。为什么呢?当y=x的时候,其实是不能跳的。

随便带几个数试试:

坐标为1,3,9,x=2,y=6,跳(6-1)/2=2次,坐标则为5,7,9;

坐标为1,3,10,x=2,y=7,跳(7-1)/2=3次,坐标则为7,9,10,然后再跳右边的...

不过这时要注意,如果kx>规定要跳的次数res,那么跳的次数就应该是res而不是kx。

代码如下

#include<cstdio>
#include<iostream>
#include<algorithm>
#define MogeKo qwq
using namespace std;
const int INF = 2e9+;
int dA,dB,dd,ans; struct node {
int a,b,c;
bool operator == (const node &N) const {
return a==N.a && b==N.b && c==N.c;
}
void input() {
int p[];
for(int i = ; i <= ; i++)
scanf("%d",&p[i]);
sort(p+,p+);
a = p[],b = p[],c = p[];
}
} A,B; node getfa(node t,int res,int &dpth) {
int cnt;
dpth = ;
while(res) {
int x = t.b-t.a;
int y = t.c-t.b;
if(x == y) return t;
if(x < y) {
cnt = min((y-)/x,res);
t.a += cnt*x;
t.b += cnt*x;
} else {
cnt = min((x-)/y,res);
t.b -= cnt*y;
t.c -= cnt*y;
}
res -= cnt;
dpth += cnt;
}
return t;
} int main() {
A.input(),B.input();
if(getfa(A,INF,dA) == getfa(B,INF,dB))
printf("YES\n");
else {
printf("NO\n");
return ;
}
if(dA < dB) {
swap(A,B);
swap(dA,dB);
}
A = getfa(A,dA-dB,dd);
int l = ,r = INF;
while(l < r) {
int mid = (l+r)>>;
if(getfa(A,mid,dd)==getfa(B,mid,dd)) {
ans = mid;
r = mid;
} else l = mid+; }
printf("%d",ans*+dA-dB);
return ;
}

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

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

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

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

    P1852 [国家集训队]跳跳棋 lca+二分 详细解析见题解 对于每组跳棋,我们可以用一个三元组(x,y,z)表示 我们发现,这个三元组的转移具有唯一性,收束性 也就是说,把每个三元组当成点,以转移 ...

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

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

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

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

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

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

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

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

  7. BZOJ.2653.[国家集训队]middle(可持久化线段树 二分)

    BZOJ 洛谷 求中位数除了\(sort\)还有什么方法?二分一个数\(x\),把\(<x\)的数全设成\(-1\),\(\geq x\)的数设成\(1\),判断序列和是否非负. 对于询问\(( ...

  8. BZOJ.2565.[国家集训队]最长双回文串(Manacher/回文树)

    BZOJ 洛谷 求给定串的最长双回文串. \(n\leq10^5\). Manacher: 记\(R_i\)表示以\(i\)位置为结尾的最长回文串长度,\(L_i\)表示以\(i\)开头的最长回文串长 ...

  9. BZOJ 2631 [国家集训队]Tree II (LCT)

    题目大意:给你一棵树,让你维护一个数据结构,支持 边的断,连 树链上所有点点权加上某个值 树链上所有点点权乘上某个值 求树链所有点点权和 (辣鸡bzoj又是土豪题,洛谷P1501传送门) LCT裸题, ...

随机推荐

  1. 【c#】RabbitMQ学习文档(五)Topic(主题。通配符模式)

    (本实例都是使用的Net的客户端,使用C#编写),说明,中文方括号[]表示名词. 在上一个教程中,我们改进了我们的日志记录系统. 没有使用只能够进行虚拟广播的[Fanout]交换机,而是使用了[Dir ...

  2. Linux 终端下解压文件失败问题

    Linux 终端下解压文件失败: # tar -zxvf *****.tar.bz2 tar 命令出错gzip: stdin: not in gzip format tar: Child return ...

  3. 浅析java程序的执行过程

    在研究任何一门语言时,无论是面向过程的c,c++(面向过程和面向对象),还是面向对象的.net,java等,弄清语言执行过程至关重要.  何为语言执行过程? 所谓语言执行过程,指对于任何一门语言,如j ...

  4. Centos7-yum部署配置LNMP+php-fgm,一台机器上部署

    一.简介 1.了解nginx特性 请参考,https://www.cnblogs.com/zhangxingeng/p/10150955.html 2.LNMP:linux+nginx+mysql+p ...

  5. C# List 集合 交集、并集、差集、去重, 对象集合、 对象、引用类型、交并差补、List<T>

    关键词:C#  List 集合 交集.并集.差集.去重, 对象集合. 对象.引用类型.交并差.List<T> 有时候看官网文档是最高效的学习方式! 一.简单集合 Intersect 交集, ...

  6. 【微服务No.2】polly微服务故障处理库

    熔断.降级: 熔断:熔断就是我们常说的“保险丝”,意为当服务出现某些状况时,切断服务,从而防止应用程序不断地常识执行可能会失败的操作造成系统的“雪崩”,或者大量的超时等待导致系统卡死等情况,很多地方也 ...

  7. [Go] golang缓冲通道实现资源池

    go的pool资源池:1.当有多个并发请求的时候,比如需要查询数据库2.先创建一个2个容量的数据库连接资源池3.当一个请求过来的时候,去资源池里请求连接资源,肯定是空的就创建一个连接,执行查询,结束后 ...

  8. 如何用java控制你的电脑?

    用java控制你的电脑 java,是一门强大的语言,强大的地方在于有很多类,我们可以直接的使用.而java.awt.Robot就很有意思了,顾名思义robot机器人,怎样一个机器法,如:控制鼠标方法: ...

  9. 面试题之(js实现当年剩余时间倒计时程序)

    js实现当年剩余时间倒计时程序,请看代码: <script> function counter() { var date = new Date(); var year = date.get ...

  10. 20190328-CSS样式一:字体样式font-、文本样式text-、背景图样式background-

    目录 CSS参考手册:http://css.doyoe.com/ 1.字体简写:font:font-style || font-variant || font-weight || font-size ...