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\)这三个位置.我们要通过最少的跳动 ...
随机推荐
- c++从文件中读取一行数据并保存在数组中
从txt文本中读取数据存入数组中 #include <iostream> #include <fstream> #include <string> #include ...
- 【转】C#线程篇
C# 温故而知新: 线程篇(一) C# 温故而知新: 线程篇(二) C# 温故而知新:线程篇(三) C# 温故而知新: 线程篇(四)
- codeforces 592B/C
题目链接:http://codeforces.com/contest/592/problem/B B. The Monster and the Squirrel time limit per test ...
- python面向对象高级:@property
@property 把方法『变成』了属性,广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性. 最大的作用就是既能检查参数,又可以用类 ...
- npm run dev error
Please try: rm -rf node_modules rm package-lock.json npm cache clear --force npm install windows和lin ...
- ArcGIS Server 服务器日志(待修改)
有时遇到服务相关错误,需要查看日志来排查,这里简单写下日志相关操作. 服务器日志:http://resources.arcgis.com/zh-cn/help/main/10.2/index.html ...
- 虚拟机中安装Ubuntu 16.04
1.安装vmware软件(虚拟机管理软件) https://blog.csdn.net/salmon_zhang/article/details/79468918 2.安装Ubuntu https:/ ...
- HTML5-Canvas 初认识
1. 理解canvas canvas其实是HTML5中一个新增加的标签,对于canvas标签本身并没有什么非常强大的属性(width.height.id.class.style),仅仅作为一个画布存在 ...
- Andrew Ng-ML-第八章-正则化
1.过度拟合overfitting 过度拟合,因为有太多的特征+过少的训练数据,学习到的假设可能很适应训练集,但是不能泛化到新的样例.即泛化generalize能力差. 解决办法: 1.手动/使用选择 ...
- [LeetCode] 694. Number of Distinct Islands
Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...