观察皮亚诺曲线,我们可以得到一下结论。
将整个图形分成九个区域,编号如下:

我们规定一号区域的方向为标准方向,则所有区域的方向为
1:x不翻转,y不翻转
2:x翻转,y不翻转
3:x不翻转,y不翻转
4:x不翻转,y翻转
5:x翻转,y翻转
6:x不翻转,y翻转
7:x不翻转,y不翻转
8:x翻转,y不翻转
9:x不翻转,y不翻转
知道了这些性质如何求出答案呢?
我们可以先求出x,y所在区域,则答案就是该区域之前的所有点数加上x,y到该子区域起点的距离。递归求解即可,递归时利用上面的性质,在传参数时对x,y进行翻转。
如何求x,y所在区间:
如果k的范围比较小,我们可以用len=3^(k-1),cnt=len*len分别表示一个子区域的边长和点数。
则x/len,y/len就是所在子区域的列数(0/1/2)和行数(0/1/2)。以此就可求出子区域编号。
但是,本题的k的范围是100。3^100很明显会爆long long。所有上述方法不可行。又观察到x,y的范围小于等于1e18。则我们可以暴力或者二分分别找到最小的使3^k1大于等于x、使3^k2大于等于y的k1和k2。这样就不存在爆longlong的问题。接着利用k1和k2求得所在区域编号,具体看代码。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll mi[39];
void init(){mi[0]=1;for(int i=1;i<39;i++)mi[i]=mi[i-1]*3;
}
ll get_(ll x){int l=0,r=38;while(l<r){int mid=l+r>>1;if(mi[mid]>x)r=mid;else l=mid+1;}return l;
}
ll f(ll n,ll x,ll y){if(n==0)return 0;ll k1=get_(x),k2=get_(y);if(k1<n){//子区域在左侧//子区域在下侧if(k2<n)return f(n-1,x,y);//子区域在中间if(mi[k2-1]*2>y)return mi[n-1]*mi[n-1]+f(n-1,mi[n-1]-x-1,y-mi[n-1]);//子区域在上侧return mi[n-1]*mi[n-1]*2+f(n-1,x,y-2*mi[n-1]);}else if(mi[k1-1]*2>x){//子区域在中间x-=mi[n-1];//子区域在下侧if(k2<n)return mi[n-1]*mi[n-1]*5+f(n-1,x,mi[n-1]-y-1);//子区域在中间if(mi[k2-1]*2>y)return mi[n-1]*mi[n-1]*4+f(n-1,mi[n-1]-x-1,mi[n-1]-(y-mi[n-1])-1);//子区域在上侧return mi[n-1]*mi[n-1]*3+f(n-1,x,mi[n-1]-(y-2*mi[n-1])-1);}else{//子区域在右侧x-=2*mi[n-1];//子区域在下侧if(k2<n)return mi[n-1]*mi[n-1]*6+f(n-1,x,y);//子区域在中间if(mi[k2-1]*2>y)return mi[n-1]*mi[n-1]*7+f(n-1,mi[n-1]-x-1,y-mi[n-1]);//子区域在上侧return mi[n-1]*mi[n-1]*8+f(n-1,x,y-mi[n-1]*2);}
}
int main(){init();ll n,x1,y1,x2,y2;cin>>n>>x1>>y1>>x2>>y2;cout<<abs(f(n,x1,y1)-f(n,x2,y2));return 0;
}

蓝桥杯-皮亚诺曲线距离相关推荐

  1. 蓝桥杯第十一届决赛真题之皮亚诺曲线距离

    蓝桥杯第十一届决赛真题之皮亚诺曲线距离python 借鉴了https://www.cnblogs.com/EchoZQN/p/14829144.html的做法 然而同样的想法,python代码提交之后 ...

  2. 2020年第十一届蓝桥杯决赛JAVA B G题“皮亚诺曲线距离“

    2020年第十一届蓝桥杯决赛JAVA B G题"皮亚诺曲线距离" 2020国赛 JAVA B组 个人题解目录 [问题描述] 皮亚诺曲线是一条平面内的曲线. 下图给出了皮亚诺曲线的 ...

  3. 蓝桥杯【第十一届】【决赛】F皮亚诺曲线距离 + G出租车

    题目地址 官网地址 F皮亚诺曲线距离 找规律的题目,应该有各种各样的方法来做 (代码写完才发现我的x,y和题目是反过来的qwq, 不过都一样) (顺带吐槽一下,为啥不用写高精度就能过,题目里只是要求答 ...

  4. 2020第十一届蓝桥杯国赛(决赛)C/C++ B组F题皮亚诺曲线距离题解

    F: 皮亚诺曲线距离 [问题描述] 皮亚诺曲线是一条平面内的曲线. 下图给出了皮亚诺曲线的 1 阶情形,它是从左下角出发,经过一个 3 × 3 的方格中的每一个格子,最终到达右上角的一条曲线. 下图给 ...

  5. 蓝桥-皮亚诺曲线距离

    求解皮亚诺曲线距离 [问题描述]  皮亚诺曲线是一条平面内的曲线.  下图给出了皮亚诺曲线的 1 阶情形,它是从左下角出发,经过一个 3 × 3 的方格中的每一个格子,最终到达右上角的一条曲线.  下 ...

  6. 试题 历届真题 皮亚诺曲线距离【第十一届】【决赛】【C组】

    试题 历届真题 皮亚诺曲线距离[第十一届][决赛][C组] 提交此题   评测记录 资源限制 内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Pytho ...

  7. 第十一届蓝桥杯国赛 C++ B组 试题 F: 皮亚诺曲线距离 (C++代码)

    时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分 [问题描述] 皮亚诺曲线是一条平面内的曲线. 下图给出了皮亚诺曲线的 1 阶情形,它是从左下角出发,经过一个 3×3 的方格中的每 ...

  8. 2020年第十一届蓝桥杯国赛—c++B组—试题F:皮亚诺曲线距离

    这道题我写了一个多小时,还是自己太菜了,两个样例都过了,三阶皮亚诺随便取了两个点,距离也是正确的,如果有大佬找到了我的问题,欢迎指正 以下是我的思路 思路 总体就是求出两个点到原点的距离,然后相减即可 ...

  9. 蓝桥杯国赛 皮亚诺曲线距离

    参考博客 题意: 题解: 这个很恶魔 本质好说就是找规律,但是贼难写.. 找了篇题解,做法就是大化小,将大阶化为成小阶,计算出离远点的距离...我感觉我是写不出来.. 挺秒的,要推公式估计要一阵子 代 ...

最新文章

  1. 在Win10下如何实现VS下工程代码的开机自启功能
  2. 【Qt】QCloseEvent的使用小结
  3. ORACLE之SPFILE与PFILE
  4. matlab mlpkginstall,Matlab选择mingw编译器
  5. ExtJs xtype一览
  6. Spring Boot的学习之路(03):基础环境搭建,做好学习前的准备工作
  7. 反思技术面试题目准备汇总链接汇总
  8. 【免费报名】与阿里云一同探索视频云的新技术与新场景
  9. Android逆向笔记-通过字符串定位跳转点
  10. C语言入门水题总结2
  11. Vue+ElementUI项目使用webpack输出MPA
  12. linux安装之后缺少命令,Centos 7 最小安装后关键命令找不到 ifconfig等
  13. SpringCloud 实战:禁止直接访问后端服务
  14. 计算机组装与维护重点难点,计算机组装与维修复习重难点.doc
  15. npoi xlsx转换html,NPOI导Excel样式设置(转)
  16. 中国式家长计算机怎么学,中国式家长开局学习技巧详解 大神教你如何完美开局...
  17. c/c++实现简单的贪吃蛇可视化游戏
  18. 记一次奇怪的网络问题
  19. Navicat Premium 15 for Mac(数据库管理)
  20. 企微有客户流失提醒功能吗?如何设置?

热门文章

  1. X窗口系统的协议和架构
  2. 时间协议ntp服务器,NTP网络时间协议(HP_UX)
  3. 【学习记录】计算机网络原理
  4. linux while文件,linux while 循环
  5. 炎炎夏日!东南亚LazadaShopee泳衣品类热销榜单来袭
  6. 最新LAMMPS和ReaxFF学习大纲--提升建模技巧和实践能力
  7. Petalinux2020.01 内核DMA驱动调试
  8. android代码计算器三角函数公式大全,三角函数换算(新版中文三角函数计算器)
  9. sql monitor 实践
  10. 【转】VRML97 域说明