luogu

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

步数的话,如果把这个看成一棵树,那么就是一个树上距离问题,就要求出这两个状态在树上的深度以及他们lca的深度.这个操作直接模拟是不行的,不过如果把中间的棋子坐标和左边坐标差记为\(a\),右边的和中间的差记为\(b\)(这里假设\(a>b\),反之类似),那么每次操作后会得到\((a-b,b)\),操作若干次后得到\((a\mod b,b)\)(如果\(b|a\)就是\((b,b)\)),然后会进行反向操作直到\(a=b\),所以每次只要从\((a,b)\)走到\((a\mod b,b)\)就好了,最多只会走\(log n\)次,然后到达根的距离也可以顺带算出来.lca的话就把两个状态的父亲按顺序记到栈里,每次弹栈顶弹到最后一个相同元素,不过注意可能真正的lca可能并不是\((a\mod b,b)\),所以还要稍微讨论一下

#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define db double using namespace std;
const int inf=1<<30;
int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
struct node
{
int x,y,z;
node(){}
node(int nx,int ny,int nz)
{
x=nx,y=ny,z=nz;
if(x>y) swap(x,y);
if(y>z) swap(y,z);
if(x>y) swap(x,y);
}
bool operator == (const node &bb) const {return x==bb.x&&y==bb.y&&z==bb.z;}
}s1[50],s2[20];
int d1[50],d2[50],t1,t2,ans;
node getfa(node aa)
{
int l1=aa.y-aa.x,l2=aa.z-aa.y;
if(l1==l2) return node(-inf,-inf,-inf);
if(l1<l2)
{
bool o=l2%l1==0;
int dt=o?l1:0;
ans+=l2/l1-o;
return node(aa.z-dt-l2%l1-l1,aa.z-dt-l2%l1,aa.z);
}
else
{
bool o=l1%l2==0;
int dt=o?l2:0;
ans+=l1/l2-o;
return node(aa.x,aa.x+dt+l1%l2,aa.x+dt+l1%l2+l2);
}
} int main()
{
s1[0].x=-inf,s2[0].x=-inf-1;
s1[++t1]=node(rd(),rd(),rd());
s2[++t2]=node(rd(),rd(),rd());
while(s1[t1].x>-inf) ++t1,s1[t1]=getfa(s1[t1-1]);
--t1;
while(s2[t2].x>-inf) ++t2,s2[t2]=getfa(s2[t2-1]);
--t2;
if(!(s1[t1]==s2[t2])) {puts("NO");return 0;}
puts("YES");
while(s1[t1-1]==s2[t2-1])
{
--t1,--t2;
int l1=s1[t1].y-s1[t1].x,l2=s1[t1].z-s1[t1].y;
if(l1<l2) ans-=2*(l2/l1-(l2%l1==0));
else ans-=2*(l1/l2-(l1%l2==0));
}
--t1,--t2;
if(t1&&t2)
{
if(s1[t1].x==s2[t2].x)
{
int b=s1[t1].z-s1[t1].y,a=min(s1[t1].y-s1[t1].x,s2[t2].y-s2[t2].x)-(s1[t1+1].y-s1[t1+1].x);
ans-=2*(a/b);
}
else if(s1[t1].z==s2[t2].z)
{
int b=s1[t1].y-s1[t1].x,a=min(s1[t1].z-s1[t1].y,s2[t2].z-s2[t2].y)-(s1[t1+1].z-s1[t1+1].y);
ans-=2*(a/b);
}
}
printf("%d\n",ans);
return 0;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

  7. luogu P2757 [国家集训队]等差子序列

    题目链接 luogu P2757 [国家集训队]等差子序列 题解 线段树好题 我选择暴力 代码 // luogu-judger-enable-o2 #include<cstdio> inl ...

  8. luogu P2619 [国家集训队2]Tree I

    题目链接 luogu P2619 [国家集训队2]Tree I 题解 普通思路就不说了二分增量,生成树check 说一下坑点 二分时,若黑白边权有相同,因为权值相同优先选白边,若在最有增量时出现黑白等 ...

  9. [Luogu P1829] [国家集训队]Crash的数字表格 / JZPTAB (莫比乌斯反演)

    题面 传送门:洛咕 Solution 调到自闭,我好菜啊 为了方便讨论,以下式子\(m>=n\) 为了方便书写,以下式子中的除号均为向下取整 我们来颓柿子吧qwq 显然,题目让我们求: \(\l ...

随机推荐

  1. Unity3D_(插件)使用Camera渲染制作Minimap小地图

    制作小地图:使用Camera渲染出来Render Texture 原理:使用摄像机从上到下获得场景游戏物体,摄像机Culling Mask渲染层级可设置是否需要在小地图上展示游戏物体,将摄像机获得的场 ...

  2. Linux如何永久打开端口

    由于防火墙导致同局域网无法通过IP访问,Linux有多种防火墙,需要查看当前使用的防火墙(开机自启),再进行配置  以下是 iptables 和 firewall 防火墙的相关配置,切忌将自己配置的防 ...

  3. LinkedList类源码浅析(二)

    1.上一节介绍了LinkedList的几个基本的方法,其他方法类似,就不一一介绍: 现在再来看一个删除的方法:remove(Object o) remove方法接受一个Object参数,这里需要对参数 ...

  4. 前端面试题总结——HTML(持续更新中)

    前端面试题总结--HTML(持续更新中) 1.什么是HTML? HTML:HyperText Markup Language超文本标记语言 2.XHTML和HTML有什么区别 HTML是一种基本的WE ...

  5. GC类型以及不同类型GC的搭配 1

    jvm内存分配,以及gc算法在上两篇博客中已经有所介绍.接下来我们重点分析不同gc器的特点和他们的搭配使用(并非任何一种新生代GC策略都可以和另一种年老代GC策略进行配合工作)

  6. servlet3.0无web.xml

    大家应该都已经知道spring 3.1对无web.xml式基于代码配置的servlet3.0应用.通过spring的api或是网络上高手们的博文,也一定很快就学会并且加到自己的应用中去了.PS:如果还 ...

  7. vue实现百度下拉框

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  8. apache域名跳转

    状态码:*301: 永久重定向,域名跳转一定要用301,对搜索引擎友好的. 302:临时重定向在虚拟主机配置文件/usr/local/apache2/conf/extra/httpd-vhosts & ...

  9. 阶段3 1.Mybatis_12.Mybatis注解开发_8 mybatis注解开发使用二级缓存

    执行两次都查询userId为57的数据.测试一级缓存 返回true 新建测试类 ,测试二级缓存 二级缓存的配置 首先是全局配置,不配置其实也是可以的.默认就是开启的.这里为了演示配置上 dao类里面进 ...

  10. spring/boot 打包,资源/配置/业务文件分离

    spring/boot打包,将业务jar包和资源配置文件进行分离打包,打包后的资源在target/release文件夹下面 注意:添加以下配置后,注意修改自己的入口类 <!--相关编译打包依赖- ...