Luogu P1852 BZOJ 2144 [国家集训队]跳跳棋
这题一看就不会,如果不是gg让做我是坚决不会做的
画图模拟,因为一次只能跳过一个棋子,所以对于一种情况只有三种移动方式:
- 中间向左跳
- 中间向右跳
- 左或右(距中间近的那个)向中间跳
发现,除了跳到边界,当左右到中间的距离相等的时候就不能再向中间跳了,
而任意一种情况只要一直重复方式3就能达到这样的平衡状态,也就是说这个状态可以通过方式1、2的组合达到这种情况所有的其他状态。
把这样的平衡状态当作这种情况的父亲(根节点)。
那么,首先判断两种情况的根节点是否相同,
如果相同,说明两种情况在向根节点转移的过程中可能会出现相等的情况。
最坏的情况,就是一种情况先转移到根节点,再转移到另一种情况。
如果把转移的过程看做一个树形结构,从某个点向左、右跳是左、右儿子,向中间跳(只有一种可能)是父亲,
那么从两种情况同时向上找,就类似于一个求lca的过程!
不过这棵树的左右儿子都是无限的,没法求出所有情况,所以不需要真的求出一棵树。
只要模拟在树上求LCA的过程即可。
记录左右两点到中间的距离x,y,若x<y,则左边向中间跳,即左坐标+2x,等同于左、中两点的坐标都+x,
反之则右、中两点的坐标都-y。
转移的过程中记录转移的步数可以得到深度。
首先在找根结点的时候可以得到两种情况到根结点的深度dA,dB,
然后仿照LCA的过程,把较深的一个向上走|dA-dB|步。
这时问题来了,既然没有完整的树,也就没法通过倍增的方法向上跳。
那么就只能一步一步的试了,如果向上一步后两种情况的坐标不同就两步.....
二分答案枚举步数可以优化这个过程,如果跳mid步后相同,就r=mid,否则l=mid+1。可以看出这个过程和倍增求LCA也是很相似的。
最后答案即为两个同步跳的+深的节点自己跳的=ans*2+|dA-dB|。
但是考虑这样一种情况:左、中两点非常近,但右点非常远。这时候左中两点来回相互跳要重复很多次,
这个y-x-x-x-…一直减到x≥y为止的过程,可以化简为y-kx。
k=(y-1)/x。为什么呢?当y=x的时候,其实是不能跳的。
随便带几个数试试:
坐标为1,3,9,x=2,y=6,跳(6-1)/2=2次,坐标则为5,7,9;
坐标为1,3,10,x=2,y=7,跳(7-1)/2=3次,坐标则为7,9,10,然后再跳右边的...
不过这时要注意,如果kx>规定要跳的次数res,那么跳的次数就应该是res而不是kx。
代码如下
#include<cstdio>
#include<iostream>
#include<algorithm>
#define MogeKo qwq
using namespace std;
const int INF = 2e9+;
int dA,dB,dd,ans; struct node {
int a,b,c;
bool operator == (const node &N) const {
return a==N.a && b==N.b && c==N.c;
}
void input() {
int p[];
for(int i = ; i <= ; i++)
scanf("%d",&p[i]);
sort(p+,p+);
a = p[],b = p[],c = p[];
}
} A,B; node getfa(node t,int res,int &dpth) {
int cnt;
dpth = ;
while(res) {
int x = t.b-t.a;
int y = t.c-t.b;
if(x == y) return t;
if(x < y) {
cnt = min((y-)/x,res);
t.a += cnt*x;
t.b += cnt*x;
} else {
cnt = min((x-)/y,res);
t.b -= cnt*y;
t.c -= cnt*y;
}
res -= cnt;
dpth += cnt;
}
return t;
} int main() {
A.input(),B.input();
if(getfa(A,INF,dA) == getfa(B,INF,dB))
printf("YES\n");
else {
printf("NO\n");
return ;
}
if(dA < dB) {
swap(A,B);
swap(dA,dB);
}
A = getfa(A,dA-dB,dd);
int l = ,r = INF;
while(l < r) {
int mid = (l+r)>>;
if(getfa(A,mid,dd)==getfa(B,mid,dd)) {
ans = mid;
r = mid;
} else l = mid+; }
printf("%d",ans*+dA-dB);
return ;
}
Luogu P1852 BZOJ 2144 [国家集训队]跳跳棋的更多相关文章
- 洛谷 P1852 [国家集训队]跳跳棋 解题报告
P1852 [国家集训队]跳跳棋 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\), ...
- P1852 [国家集训队]跳跳棋
P1852 [国家集训队]跳跳棋 lca+二分 详细解析见题解 对于每组跳棋,我们可以用一个三元组(x,y,z)表示 我们发现,这个三元组的转移具有唯一性,收束性 也就是说,把每个三元组当成点,以转移 ...
- 【洛谷】1852:[国家集训队]跳跳棋【LCA】【倍增?】
P1852 [国家集训队]跳跳棋 题目背景 原<奇怪的字符串>请前往 P2543 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个 ...
- 洛谷 P1852 [国家集训队] 跳跳棋
题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...
- [BZOJ2144]国家集训队 跳跳棋
题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...
- luogu P1852 [国家集训队]跳跳棋
luogu 直接操作是不可能的,考虑发现一些性质.可以发现如果每次跳的棋子都是两边的,那么最多只有一种方案,那么就把这样操作得到的状态记为当前状态的父亲,从一个状态这样做一定会结束.那么如果两个状态只 ...
- BZOJ.2653.[国家集训队]middle(可持久化线段树 二分)
BZOJ 洛谷 求中位数除了\(sort\)还有什么方法?二分一个数\(x\),把\(<x\)的数全设成\(-1\),\(\geq x\)的数设成\(1\),判断序列和是否非负. 对于询问\(( ...
- BZOJ.2565.[国家集训队]最长双回文串(Manacher/回文树)
BZOJ 洛谷 求给定串的最长双回文串. \(n\leq10^5\). Manacher: 记\(R_i\)表示以\(i\)位置为结尾的最长回文串长度,\(L_i\)表示以\(i\)开头的最长回文串长 ...
- BZOJ 2631 [国家集训队]Tree II (LCT)
题目大意:给你一棵树,让你维护一个数据结构,支持 边的断,连 树链上所有点点权加上某个值 树链上所有点点权乘上某个值 求树链所有点点权和 (辣鸡bzoj又是土豪题,洛谷P1501传送门) LCT裸题, ...
随机推荐
- Tapestry3.0开发概论
一.TAPESTRY技术的综述. tapestry是平行于struts/Spring MVC/webwork /jsf等开发工具的语言.tapestry是基于组件的开发工具.它具有组件的可重用性.因为 ...
- 根据数值获得概率密度pdf和累积密度分布cdf(MATLAB语言)
y=randn(1,3000); % 生成1-by-3000的标准正态分布随机数 ymin=min(y); ymax=max(y); x=linspace(ymin,ymax,20); %将最大最小区 ...
- Springboot 系列(三)Spring Boot 自动配置原理
注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别. 前言 关于配置文件可以配置的内容,在 Spring ...
- 第37章 资源所有者密码验证(Resource Owner Password Validation) - Identity Server 4 中文文档(v1.0.0)
如果要使用OAuth 2.0资源所有者密码凭据授权(aka password),则需要实现并注册IResourceOwnerPasswordValidator接口: public interface ...
- 过滤器(Filter)和拦截器(Interceptor)
过滤器(Filter) Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序.它依赖于servlet容器,在实现上,基于函数回调,它可以对几乎所有请求 ...
- 前端入门19-JavaScript进阶之闭包
声明 本系列文章内容全部梳理自以下几个来源: <JavaScript权威指南> MDN web docs Github:smyhvae/web Github:goddyZhao/Trans ...
- Html和Css学习笔记-css进阶-盒模型
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 此篇博客是我的复习笔记,html和css学的时间太久了,忘得差不多了,最近要使用一下,所以重新打开html的书略读,后记录了标签 ...
- vue实现表计监测界面
已经好几个月没有更新博客了,因为最近太忙,忙得连写博客的时间都没有.上班赶项目开启996模式,下班要去练车考驾照,一边还在赶书稿,一边还接了私活.不由得感叹:年纪大了,再也经不起那么折腾..... 每 ...
- 通过Excel文件快速创建页面和数据表
在设计一个软件系统,构建过程:需求->数据表->系统开发.实际情况是需求(数据)很多来源于已经存在的文件中,客户会要求把这些数据“电子化”,这就给需求分析产生了很大的工作量: 分析这些原始 ...
- (转)hibernateTools工具安装及使用总结(eclipse 3.6)
最近项目采用flex+spring+hibernate的框架开发,之前虽说有多年的Java开发经验了,但是一直使用的JDBC或者 ibatis,hibernate的使用还是大姑娘上轿头一回,网上都介绍 ...