P1852 [国家集训队]跳跳棋
lca+二分
详细解析见题解
对于每组跳棋,我们可以用一个三元组(x,y,z)表示
我们发现,这个三元组的转移具有唯一性,收束性
也就是说,把每个三元组当成点,以转移关系为边,那么可以得到一棵树
显然最短步数==lca
然后我们就可以愉快地跑lca了
但是还要加优化,就是有可能出现2个靠得近的棋子,但与另一个棋子离得远的情况
这时要跳很多次,但是可以加速,详见代码
最后二分求lca
code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
struct node{
int a[];
bool operator == (const node &tmp) const{return a[]==tmp.a[]&&a[]==tmp.a[]&&a[]==tmp.a[];}
}f,t,p1,p2;
inline int find(node x){
int d1=x.a[]-x.a[],d2=x.a[]-x.a[]; bool c=;
if(d1==d2) {p1=x; return ;}
if(d1<d2) swap(d1,d2),c=;
int cnt=d1/d2,d=d1%d2; //加速跳
if(!d) d+=d2,--cnt;
if(c) cnt+=find((node){x.a[]-d-d2,x.a[]-d,x.a[]});
else cnt+=find((node){x.a[],x.a[]+d,x.a[]+d+d2});
return cnt;
}
inline void change(node x,int step){
int d1=x.a[]-x.a[],d2=x.a[]-x.a[]; bool c=;
if(d1==d2||!step) {p1=x; return ;}
if(d1<d2) swap(d1,d2),c=;
int cnt=d1/d2,d=d1%d2;
if(!d) d+=d2,--cnt;
if(c){
if(step>=cnt) change((node){x.a[]-d-d2,x.a[]-d,x.a[]},step-cnt);
else change((node){x.a[]-d-d2*(cnt-step+),x.a[]-d-d2*(cnt-step),x.a[]},);
}
else{
if(step>=cnt) change((node){x.a[],x.a[]+d,x.a[]+d+d2},step-cnt);
else change((node){x.a[],x.a[]+d+d2*(cnt-step),x.a[]+d+d2*(cnt-step+)},);
}
}
inline bool same(int k){
change(f,k); node r1=p1;
change(t,k); node r2=p1;
return r1==r2;
}
int main(){
scanf("%d%d%d%d%d%d",&f.a[],&f.a[],&f.a[],&t.a[],&t.a[],&t.a[]);
sort(f.a,f.a+); sort(t.a,t.a+);
int sp1=find(f); p2=p1;
int sp2=find(t); //求相对于树根的深度
if(!(p1==p2)) {printf("NO"); return ;} //树根不同
if(sp1<sp2) swap(sp1,sp2),swap(f,t);
int ans=sp1-sp2;
change(f,ans); f=p1; //使两点同一深度
int l=,r=sp2; //二分找lca
while(l<r){
int mid=l+((r-l)>>);
if(same(mid)) r=mid;
else l=mid+;
}printf("YES\n%d",(l<<)+ans);
return ;
}
P1852 [国家集训队]跳跳棋的更多相关文章
- 洛谷 P1852 [国家集训队]跳跳棋 解题报告
P1852 [国家集训队]跳跳棋 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\), ...
- 洛谷 P1852 [国家集训队] 跳跳棋
题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...
- luogu P1852 [国家集训队]跳跳棋
luogu 直接操作是不可能的,考虑发现一些性质.可以发现如果每次跳的棋子都是两边的,那么最多只有一种方案,那么就把这样操作得到的状态记为当前状态的父亲,从一个状态这样做一定会结束.那么如果两个状态只 ...
- 【洛谷】1852:[国家集训队]跳跳棋【LCA】【倍增?】
P1852 [国家集训队]跳跳棋 题目背景 原<奇怪的字符串>请前往 P2543 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个 ...
- [BZOJ2144]国家集训队 跳跳棋
题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...
- Luogu P1852 BZOJ 2144 [国家集训队]跳跳棋
qwq 这题一看就不会,如果不是gg让做我是坚决不会做的 画图模拟,因为一次只能跳过一个棋子,所以对于一种情况只有三种移动方式: 中间向左跳 中间向右跳 左或右(距中间近的那个)向中间跳 发现,除了跳 ...
- bzoj2144 【国家集训队2011】跳跳棋
Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他 ...
- [BZOJ2144][国家集训队2011]跳跳棋
题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上. 每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\),\(c\)这三个位置. 我们要通 ...
- P1852 跳跳棋 [LCA思想+二分答案]
题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有\(3\)颗棋子,分别在\(a,b,c\)这三个位置.我们要通过最少的跳动 ...
随机推荐
- IntelliJ IDEA最新版完美破解激活
IntelliJ IDEA号称是目前最好最强最智能的Java IDE,默认已经集成了几乎所有主流的开发工具和框架.目前最新版为2017.2.5(2017.2.5已经不是最新,但是写教程的时候2017. ...
- ABP之应用服务(1)
在一个理想的层级项目中,展现层是不能直接访问领域对象的,那么展现层如何获取到自己需要的数据呢?也就是今天的主角-Application层,它的职责就是为展现层服务,它通过仓储获取到相应的数据,然后将数 ...
- nowcoder2018年全国多校算法寒假训练营练习比赛(第一场)
[气死我了 写完了博客发布 点看来一看怎么只剩下一半不到的内容了!!!!!!!!!!] [就把卡的那两道放上来好了 其余的不弄了 生气!!!!!] 可以说是很久没有打比赛了 今天这一场主要是 基础算 ...
- 开放思源 专注高效 HPE&msup软件技术开放日回顾
7月22日,HPE和msup联合举办的软件技术开放日在上海浦东新区张江高科技园区召开,主.分会场共邀请HPE 13 名测试.质量.大数据专家分享技术实践与经验,与180多名测试总监一起拆解质量保障及大 ...
- nginx map使用方法
map指令使用ngx_http_map_module模块提供的.默认情况下,nginx有加载这个模块,除非人为的 --without-http_map_module.ngx_http_map_modu ...
- yum provides "*/nmcli" and apt-get
一般来说著名的linux系统基本上分两大类: 1.RedHat系列:Redhat.Centos.Fedora等 2.Debian系列:Debian.Ubuntu等 RedHat 系列 1 常见的安装包 ...
- Map集合遍历
Map<String,String> map = new HashMap<String, String>(); map.put("1","java ...
- windows7系统下让所有文件夹都使用同一种视图的方法
Windows7系统可以对每个文件夹进行个性化视图设置,可以根据自己的个人喜好和实际需要更改文件或文件夹图标的大小,或者让文件或文件夹以列 表.平铺等方式显示.但是,如果你对N个文件夹视图进行了风格各 ...
- 2015 湘潭大学程序设计比赛(Internet)H题-括号匹配
括号匹配 Accepted : 30 Submit : 234 Time Limit : 10000 MS Memory Limit : 65536 KB 题目描述 有一串括号(只包含&quo ...
- Android应用之——百度地图最新SDK3.0应用,实现最经常使用的标注覆盖物以及弹出窗覆盖物
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/yanglfree/article/details/33333413 一.概述 最新版的百度地图SDK ...