2144: 跳跳棋

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 248  Solved: 121
[Submit][Status][Discuss]

Description

跳跳棋是在一条数轴上进行的。棋子只能摆在整点上。每个点不能摆超过一个棋子。我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置。我们要通过最少的跳动把他们的位置移动成x,y,z。(棋子是没有区别的)跳动的规则很简单,任意选一颗棋子,对一颗中轴棋子跳动。跳动后两颗棋子距离不变。一次只允许跳过1颗棋子。  写一个程序,首先判断是否可以完成任务。如果可以,输出最少需要的跳动次数。

Input

第一行包含三个整数,表示当前棋子的位置a b c。(互不相同)第二行包含三个整数,表示目标位置x y z。(互不相同)

Output

如果无解,输出一行NO。如果可以到达,第一行输出YES,第二行输出最少步数。

Sample Input

1 2 3
0 3 5

Sample Output

YES
2

【范围】
100% 绝对值不超过10^9


  暴力广搜有20分。。
  我们转化一下问题。。
  一次操作分为两种情况: 1)中间的棋子跳 2)两边的棋子中的一个跳(一次只允许跳过1颗棋子)。
  我们可以进一步转化模型
  样例中的图就是两边的棋子跳。
  我们发现这样相当于是中间的跳出来。。
  所以我们设中间跳两边为该状态节点的两个儿子。
  而两边跳中间是该节点的父亲节点。
  然后树上暴力有40.
  100: 先找两种状态的最终祖先(两边到中间距离相等(没有父节点))。
  然后如果最终祖先不等则NO
  相等那么把深度大的先提到同一深度
  然后LCA
  

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<algorithm>
  5.  
  6. using namespace std;
  7.  
  8. inline int in()
  9. {
  10. int x=,f=;char ch=getchar();
  11. while((ch<''||ch>'')&&ch!='-')ch=getchar();
  12. if(ch=='-')f=-,ch=getchar();
  13. while(ch<=''&&ch>='')x=x*+ch-'',ch=getchar();
  14. return x*f;
  15. }
  16.  
  17. struct data{
  18. int a[];
  19. };
  20.  
  21. int a[],b[],tem=;
  22.  
  23. data up(int c[],int k)
  24. {
  25. data t;
  26. int t1=c[]-c[],t2=c[]-c[];
  27. for(int i=;i<=;i++)t.a[i]=c[i];
  28. if(t1==t2)return t;
  29. else if(t1<t2)
  30. {
  31. int ans=min(k,(t2-)/t1);
  32. tem+=ans;k-=ans;
  33. t.a[]+=ans*t1,t.a[]+=ans*t1;
  34. }
  35. else
  36. {
  37. int ans=min(k,(t1-)/t2);
  38. tem+=ans,k-=ans;
  39. t.a[]-=ans*t2,t.a[]-=ans*t2;
  40. }
  41. if(k)return up(t.a,k);
  42. else return t;
  43. }
  44.  
  45. bool operator!=(data a,data b)
  46. {
  47. for(int i=;i<=;i++)if(a.a[i]!=b.a[i])return ;
  48. return ;
  49. }
  50.  
  51. int main()
  52. {
  53. for(int i=;i<=;i++)a[i]=in();
  54. for(int j=;j<=;j++)b[j]=in();
  55. sort(+a,+a+);
  56. sort(+b,+b+);
  57. data t1=up(a,1e9);int d1=tem;tem=;
  58. data t2=up(b,1e9);int d2=tem;tem=;
  59. if(t1!=t2){
  60. printf("NO");
  61. return ;
  62. }
  63. if(d1>d2)
  64. {
  65. swap(d1,d2);
  66. for(int i=;i<=;i++)swap(a[i],b[i]);
  67. }
  68. int ans=d2-d1;
  69. t1=up(b,ans);
  70. for(int i=;i<=;i++)b[i]=t1.a[i];
  71. int l=,r=d1,res;
  72. while(l<=r)
  73. {
  74. int mid=(l+r)>>;
  75. if(up(a,mid)!=up(b,mid))l=mid+;
  76. else r=mid-,res=mid;
  77. }
  78. printf("YES\n");
  79. printf("%d",ans+*res);
  80. return ;
  81. }
  

【LCA】bzoj 2144:跳跳棋的更多相关文章

  1. [BZOJ 2144]跳跳棋

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

  2. bzoj 2144: 跳跳棋——倍增/二分

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

  3. 【BZOJ 2144】 2144: 跳跳棋 (倍增LCA)

    2144: 跳跳棋 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 642  Solved: 307 Description 跳跳棋是在一条数轴上进行的 ...

  4. 【bzoj2144】跳跳棋

    2144: 跳跳棋 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 492  Solved: 244[Submit][Status][Discuss] ...

  5. BZOJ2144跳跳棋——LCA+二分

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

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

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

  7. 跳跳棋——二分+建模LCA

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

  8. 不一样的LCA——luoguP1852跳跳棋

    洛谷端题目链接 loj端题目链接 题目大意: 在一条数轴上进行跳跳棋游戏.棋子只能摆在整点上.每个点不能摆超过一个棋子.用跳跳棋完成:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动 ...

  9. P1852 跳跳棋 [LCA思想+二分答案]

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

随机推荐

  1. Java Concurrency - 浅析 CountDownLatch 的用法

    The Java concurrency API provides a class that allows one or more threads to wait until a set of ope ...

  2. Commons CLI - Option Properties

    Option Properties The following are the properties that each Option has. All of these can be set usi ...

  3. Jersey(1.19.1) - Client API, Testing services

    The Jersey client API was originally developed to aid the testing of the Jersey server-side, primari ...

  4. HttpClient(4.3.5) - HTTP Entity

    HTTP entity HTTP messages can carry a content entity associated with the request or response. Entiti ...

  5. Linux 命令 - uniq: 通知或忽略重复行

    给定一个已排好序的文件,uniq 会删除重复行并将结果输出到标准输出中.uniq 通常与 sort 结合使用以删除 sort 输出内容中的重复行. 命令格式 uniq [OPTION]... [INP ...

  6. 获得随机的n条结果行

    * FROM [Menu] order by NEWID() * FROM [Menu]

  7. C# 网页信息采集(数据访问)

    windows nt/xp/2003 or above .net Framework 1.1 SqlServer 2000 开发环境 VS 2003 目的 学习了网络编程,总要做点什么东西才好. 于是 ...

  8. PullToRefreshListView手动刷新问题

    1.第一次进入界面刷新无效,需要延时刷新 new Handler().postDelayed(new Runnable() { @Override public void run() { // TOD ...

  9. css3学习笔记之渐变

    CSS3 线性渐变 语法 background: linear-gradient(direction, color-stop1, color-stop2, ...); 1 2 3 4 5 6 7 8 ...

  10. XML格式以及相关libxml库学习

    本文参考 XML文件格式语法以及DTD,摘除其中自己认为必要的知识点,在此记录如下. 先给出一个xml的实例文件, <?xml version="1.0" encoding= ...