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\)这三个位置.我们要通过最少的跳动 ...
随机推荐
- MongoDB 学习笔记2----条件操作符
条件操作符:用于两个比较两个表达式并从mongdb中获取文档 mongodb常见的操作符及解析说明 $lt:小于 example:ago<20 $lte:小于等于 example:<=20 ...
- ELK之写入MySQL数据库
安装MySQL5.6 创建数据库并且授权 create database elk character set utf8 collate utf8_bin; grant all on elk.* to ...
- POJ-2029 Get Many Persimmon Trees(动态规划)
Get Many Persimmon Trees Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3987 Accepted: 2 ...
- oracle 日期格式化和数据去重
1.获取系统日期: select sysdate as date1 from dual: 当前时间减去7分钟的时间 select sysdate,sysdate - interval '7' MINU ...
- 2018-2019-2 20165330《网络对抗技术》Exp4 恶意代码分析
目录 基础问题 相关知识 实验目的 实验内容 实验步骤 实验过程中遇到的问题 实验总结与体会 实验目的 监控你自己系统的运行状态,看有没有可疑的程序在运行 分析一个恶意软件,就分析Exp2或Exp3中 ...
- CCCC 排座位 图着色问题
1排座位:https://www.patest.cn/contests/gplt/L2-010 2图着色问题 https://www.patest.cn/contests/gplt/L2-023 建图 ...
- MySQL 重做日志文件
一.innodb log的基础知识 · innodb log顾名思义:即innodb存储引擎产生的日志,也可以称为重做日志文件,默认在innodb_data_home_dir下面有两个文件ib_log ...
- Python实现简单HTTP服务器(一)
一.返回固定内容 # coding:utf-8 import socket from multiprocessing import Process def handle_client(client_s ...
- nginx处理问题笔记
1. 处理所有请求到单一入口 ( rewrite all requests to index.php with nginx ) 目前我们做开发一般都是单入口的,所以都会使用web服务器做重定向到入口 ...
- util date 转 sql date
JAVA 处理时间 - java.sql.Date.java.util.Date与数据库中的Date字段的转换方法,以及util包下的Date类与字符串的相互转换在java环境中使用的Date时间类通 ...