bzoj2144 【国家集训队2011】跳跳棋
Description
跳跳棋是在一条数轴上进行的。棋子只能摆在整点上。每个点不能摆超过一个棋子。我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置。我们要通过最少的跳动把他们的位置移动成x,y,z。(棋子是没有区别的)跳动的规则很简单,任意选一颗棋子,对一颗中轴棋子跳动。跳动后两颗棋子距离不变。一次只允许跳过1颗棋子。 写一个程序,首先判断是否可以完成任务。如果可以,输出最少需要的跳动次数。
Input
第一行包含三个整数,表示当前棋子的位置a b c。(互不相同)第二行包含三个整数,表示目标位置x y z。(互不相同)
Output
如果无解,输出一行NO。如果可以到达,第一行输出YES,第二行输出最少步数。
Sample Input
0 3 5
Sample Output
YES
2
【范围】
100% 绝对值不超过10^9
正解:倍增lca
为了方便研究跳法,我们把棋子按坐标大小排序。我们发现,当中间那粒棋子与左边的距离和与右边的距离不相等时,有3种跳法,而两者距离相等时,只有两种跳法。所以,对于往中间跳的跳法,我们可以把它理解成在树上跳父亲,而对于往旁边跳,我们可以理解成在树上跳儿子。所以我们就可以把题意转化一下,即第一问为两种状态是否有lca,而第二种则是问两种状态在树上的距离。我们可以采用类似倍增的方法跳lca,来求出答案。
//It is made by wfj_2048~
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define inf 1<<30
#define il inline
#define RG register
#define ll long longusing namespace std;struct data{int a,b,c;bool operator != (const data &x) const{return a!=x.a || b!=x.b || c!=x.c;}
};int a[2][5],depa,depb;il int gi(){RG int x=0,q=0; RG char ch=getchar();while ((ch<'0' || ch>'9') && ch!='-') ch=getchar(); if (ch=='-') q=1,ch=getchar();while (ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q ? -x : x;
}il data find(RG data u,RG int k,RG int &dep){RG int dis1=u.b-u.a,dis2=u.c-u.b,t; if (dis1==dis2) return u;if (dis1<dis2) t=min(k,(dis2-1)/dis1),k-=t,dep+=t,u.a+=t*dis1,u.b+=t*dis1;else t=min(k,(dis1-1)/dis2),k-=t,dep+=t,u.b-=t*dis2,u.c-=t*dis2;if (k) return find(u,k,dep); else return u;
}il void work(){for (RG int i=1;i<=3;++i) a[0][i]=gi();sort(a[0]+1,a[0]+4); for (RG int i=1;i<=3;++i) a[1][i]=gi();sort(a[1]+1,a[1]+4);data x=(data){a[0][1],a[0][2],a[0][3]},y=(data){a[1][1],a[1][2],a[1][3]},u=find(x,inf,depa),v=find(y,inf,depb);if (u!=v){ puts("NO"); return; } puts("YES"); if (depa<depb) swap(x,y),swap(depa,depb);RG int l=0,r=depb,mid,cnt,ans,Ans=depa-depb; x=find(x,Ans,cnt);while (l<=r){mid=(l+r)>>1;RG data x1=find(x,mid,cnt),y1=find(y,mid,cnt);if (x1!=y1) l=mid+1; else ans=mid,r=mid-1;}printf("%d\n",Ans+2*ans); return;
}int main(){work();return 0;
}
bzoj2144 【国家集训队2011】跳跳棋相关推荐
- [国家集训队2011]跳跳棋
P1852 [国家集训队]跳跳棋https://www.luogu.org/problemnew/show/P1852 Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不 ...
- [BZOJ2144]国家集训队 跳跳棋
题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...
- bzoj2144 [2011集训队出题] 跳跳棋 倍增 lca
Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把 ...
- happiness[国家集训队2011(吴确)]
[试题来源] 2011中国国家集训队命题答辩 [问题描述] 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科 ...
- 国家集训队2011 happiness
[试题来源] 2011中国国家集训队命题答辩 [问题描述] 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科 ...
- 题解 【国家集训队2011】数颜色
题面 解析 这题也就是一个带修改的莫队啊啊!! 所以,我们只需要在普通莫队上加上一维时间即可. 怎么加呢? 只需要记录下每次修改和查询的时间, 在左右端点跳跃的同时,也将时间跳到询问的时间就行了. 具 ...
- 【COGS 1873】 [国家集训队2011]happiness(吴确) 最小割
这是一种最小割模型,就是对称三角,中间双向边,我们必须满足其最小割就是满足题目条件的互斥关系的最小舍弃,在这道题里面我们S表示文T表示理,中间一排点是每个人,每个人向两边连其选文或者选理的价值,中间每 ...
- 【国家集训队2011】【BZOJ2141】排队
Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的 ...
- [国家集训队2011]稳定婚姻(无向图定向)
题目描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的姗姗和男友谈恋爱半年就结婚,结婚不到 ...
最新文章
- Leetcode 764. Largest Plus Sign
- asp.net模糊查询存储过程
- 算法设计与分析(第三周)递归实现全排列问题
- jQuery 图片轮流展示效果
- linux 下自动重启tomcat的脚本(支持shell杀进程)
- 数据结构实践项目——图的基本运算及遍历操作
- ElementUI:nav收起后点击后出现黑色边框
- oracle 没有rlwap,[20140723]安装使用anysql.txt
- 增加特征对预测准确率的影响
- 2021-05-11
- 英特尔®以太网700系列的动态设备个性化
- pyqt+pyqtgraph+lka(界面制作)--优化版
- 50V升压恒流LED驱动芯片
- 小失误点,不积跬步无以至千里
- 当封号成为一种常态,网络营销人该何去何从?
- python贺卡编程_一种卡片编程机及其编程方法与流程
- 苹果电脑/macbookpro 拔出电源充电器但还是显示充电的解决办法
- 重要接口关键词搜索——item_search-按关键字搜索淘宝商品
- day25/RegexDemo1.java
- 基于微信小程序云开(统计学生信息并导出excel)