博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj2144: 跳跳棋
阅读量:5270 次
发布时间:2019-06-14

本文共 1441 字,大约阅读时间需要 4 分钟。

昨天考试的神仙题

对于一个状态(x,y,z),有三种转移方案,往外跳两种,往里跳只有1种(考试的时候没有意识到)

那么可以看作一棵树,往外跳是子节点,往里跳是父亲

问题转换成树上两个点求最短路,这样就只用往里面跳了

考虑往里面跳是相当于一个辗转相除的,复杂度是logK,根据求LCA倍增的思想,不停往上跳就好。

#include
#include
#include
#include
#include
#include
using namespace std;bool check(int ax,int ay,int az,int bx,int by,int bz){ int t1,t2,w; t1=ay-ax,t2=az-ay,w=0; if(t1>t2){swap(t1,t2);w^=1;} while((t2-1)/t1>0) { int c=(t2-1)/t1; if(w==0){ax+=c*t1;ay+=c*t1;} else {ay-=c*t1,az-=c*t1;} t2=t2-t1*c; swap(t1,t2);w^=1; } t1=by-bx,t2=bz-by,w=0; if(t1>t2){swap(t1,t2);w^=1;} while((t2-1)/t1>0) { int c=(t2-1)/t1; if(w==0){bx+=c*t1;by+=c*t1;} else {by-=c*t1;bz-=c*t1;} t2=t2-t1*c; swap(t1,t2);w^=1; } return ax==bx&&ay==by&&az==bz;}int getdep(int x,int y,int z){ int t1=y-x,t2=z-y,ret=0; if(t1>t2)swap(t1,t2); while((t2-1)/t1>0) { int c=(t2-1)/t1; ret+=c; t2=t2-t1*c; swap(t1,t2); } return ret;}void jumpK(int &x,int &y,int &z,int d){ int t1=y-x,t2=z-y,w=0; if(t1>t2){swap(t1,t2);w^=1;} while(d>0) { int c=min(d,(t2-1)/t1); d-=c; if(w==0){x+=c*t1;y+=c*t1;} else {y-=c*t1,z-=c*t1;} t2=t2-t1*c; swap(t1,t2);w^=1; }}int main(){ freopen("2.in","r",stdin); freopen("2.out","w",stdout); int ax,ay,az,bx,by,bz; scanf("%d%d%d%d%d%d",&ax,&ay,&az,&bx,&by,&bz); if(ax>ay)swap(ax,ay); if(bx>by)swap(bx,by); if(ax
=0;i--) if(db>(1<

 

转载于:https://www.cnblogs.com/AKCqhzdy/p/9578087.html

你可能感兴趣的文章
PHP的配置
查看>>
Struts框架----进度1
查看>>
Round B APAC Test 2017
查看>>
MySQL 字符编码问题详细解释
查看>>
Ubuntu下面安装eclipse for c++
查看>>
Windows 2003全面优化
查看>>
electron入门心得
查看>>
格而知之2:UIView的autoresizingMask属性探究
查看>>
我的Hook学习笔记
查看>>
js中的try/catch
查看>>
寄Android开发Gradle你需要知道的知识
查看>>
整理推荐的CSS属性书写顺序
查看>>
ServerSocket和Socket通信
查看>>
css & input type & search icon
查看>>
源代码的下载和编译读后感
查看>>
Kafka学习笔记
查看>>
Octotree Chrome安装与使用方法
查看>>
Windows 环境下基于 Redis 的 Celery 任务调度模块的实现
查看>>
趣谈Java变量的可见性问题
查看>>
C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
查看>>