98. 分形之城
 
城市的规划在城市建设中是个大问题。

不幸的是,很多城市在开始建设的时候并没有很好的规划,城市规模扩大之后规划不合理的问题就开始显现。

而这座名为 Fractal 的城市设想了这样的一个规划方案,如下图所示:

当城区规模扩大之后,Fractal 的解决方案是把和原来城区结构一样的区域按照图中的方式建设在城市周围,提升城市的等级。

对于任意等级的城市,我们把正方形街区从左上角开始按照道路标号。

虽然这个方案很烂,Fractal 规划部门的人员还是想知道,如果城市发展到了等级 N,编号为 A 和 B 的两个街区的直线距离是多少。

街区的距离指的是街区的中心点之间的距离,每个街区都是边长为 10 米的正方形。

输入格式

第一行输入正整数nn,表示测试数据的数目。

以下nn行,输入n组测试数据,每组一行。

每组数据包括三个整数 N,A,BN,A,B, 表示城市等级以及两个街区的编号,整数之间用空格隔开。

输出格式

一共输出n行数据,每行对应一组测试数据的输出结果,结果四舍五入到整数。


这是著名的无线包含自身分形的“分形”图......(请看《算法进阶》)
其实就是按照算法进阶上说的那样, 先求出子城市的位置,通过一定的翻转和平移得到该城市的位置, 只是考虑如何变换比较麻烦;
与《算法进阶》不同的是: 以每个图中的中心为坐标原点, 每两个相邻城市之间的距离为2, 比如一等级中(1,1)和(1,-1)的距离为2,这时len就是1/2( n - 1)级城市的边长, 即1/4n级城市的边长; 

在打这道题时还学到一个小小的干货:
我把代码写成这样输出的总是负数  ll len = 1 << (n - 1), size2 = 1 << (2 * n - 2); 
后来看题解写成这样就过去了    ll len = 1LL << (n - 1), size2 = 1LL << (2 * n - 2);
LL其实代表long long1LL是为了在计算时,把int类型的变量转化为long long,然后再赋值给long long类型的变量。
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MAXN = 5e5 + ;
const int MAXM = 3e3 + ; template < typename T > inline void read(T &x) {
x = ; T ff = , ch = getchar();
while(!isdigit(ch)) {
if(ch == '-') ff = -;
ch = getchar();
}
while(isdigit(ch)) {
x = (x << ) + (x << ) + (ch ^ );
ch = getchar();
}
x *= ff;
} template < typename T > inline void write(T x) {
if(x < ) putchar('-'), x = -x;
if(x > ) write(x / );
putchar(x % + '');
} ll T, n, a, b; pair < ll, ll > calc(ll n, ll m) {
if(n == ) return make_pair(, );
ll len = 1LL << (n - ), size2 = 1LL << ( * n - ); // n - 1级城市中的边长的1/2和房屋数
pair < ll, ll > id = calc(n - , m % size2);
ll x = id.first, y = id.second;
int u = m / size2; // 判断第几区域
if(u == ) return make_pair(- y - len, - x + len);
if(u == ) return make_pair(x + len, y + len);
if(u == ) return make_pair(x + len, y - len);
if(u == ) return make_pair(y - len, x - len);
} int main() {
read(T);
while(T--) {
read(n); read(a); read(b);
pair < ll, ll > aa = calc(n, a - );
pair < ll, ll > bb = calc(n, b - );
double dx = aa.first - bb.first, dy = aa.second - bb.second;
double ans = sqrt(dx * dx + dy * dy) * ;
printf("%0.lf\n", ans);
}
return ;
}


Acwing 98-分形之城的更多相关文章

  1. 【ACwing 98】分形之城——分形

    (题面来自ACwing) 城市的规划在城市建设中是个大问题. 不幸的是,很多城市在开始建设的时候并没有很好的规划,城市规模扩大之后规划不合理的问题就开始显现. 而这座名为 Fractal 的城市设想了 ...

  2. 2019.7.12 sdfzoier做题统计

    lixf_lixf :9 P1981 表达式求值 P1076 寻宝 P1199 三国游戏 P1308 统计单词数 P1190 接水问题 P1158 导弹拦截 P1070 道路游戏 P1069 细胞分裂 ...

  3. Power Map

    推荐64位版本Office,但会遇到以下问题 建议大多数用户使用 32 位 Office 我们建议使用 32 版本的 Office,因为它与大多数其他应用程序更加兼容,尤其是第三方加载项.这也是默认安 ...

  4. 攻城狮送女友的CSS3生日蛋糕

    在线预览:http://keleyi.com/keleyi/phtml/html5/29.htm 代码如下: <!DOCTYPE html> <html> <head&g ...

  5. 剪辑的楼天城的ACM之路

    楼天城楼教主的acm心路历程(剪辑) 利用假期空闲之时,将这几年GCJ,ACM,TopCoder 参加的一些重要比赛作个回顾.昨天是GCJ2006 的回忆,今天时间上更早一些吧,我现在还清晰记得3 年 ...

  6. SurfaceView 绘制分形图

    之前一直做的是应用类,这次抽时间,参考网上资料实践了下SurfaceView.目标是在页面上画一个科赫曲线的分形图. 代码如下: package com.example.fredric.demo02; ...

  7. 分形之概率学下的green tree

         今天做的是分形之随机概率,可以和以前做的那个抛色子的做法非常相似,抛色子是用随机点数控制图形,今天做的树叶图形只是用概率的做法去控制图形而已,做法是如出一辙的: //图形界面 package ...

  8. 修改nignx报错Nginx [emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use)

    Nginx [emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use) 这个错误是修改了nginx的配置时出现,表名80端口被程 ...

  9. nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) 错误解决

    今天在做LNMP的时候,启动nginx服务,无法开启,导致网页打不开.把服务从起一下发现提示错误如下: Starting nginx: nginx: [emerg] bind() to 0.0.0.0 ...

随机推荐

  1. ZOJ - 1504 Slots of Fun 【数学】

    题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1504 题意 给出一串字符串 里面的每个字符的位置 都按照题目的意 ...

  2. NodeJs如何全局统一处理异常,实现RestFull风格

    当在controller中处理客户端发来的数据时,我们会去校验数据,当数据错误时,我们会给客户端返回一个信息,如: export function add (req, res, next) { con ...

  3. 服务器中判断客户端socket断开连接的方法【转】

    本文转载自:http://www.cnblogs.com/jacklikedogs/p/3976208.html 1, 如果服务端的Socket比客户端的Socket先关闭,会导致客户端出现TIME_ ...

  4. hdu 2015校赛1002 Dual horsetail (思维题 )

    Dual horsetail Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  5. Contiki 源码风格

    /** * \defgroup coding-style Coding style * * This is how a Doxygen module is documented - start wit ...

  6. Centos7 安装lnmp

    Centos7 安装lnmp 1.下载 wget http://soft.vpser.net/lnmp/lnmp1.5-full.tar.gz 2.解压 tar -zvxf lnmp1.5-full. ...

  7. JAVA-关键字&标识符

    关键字: 关键字就是在java程序中具备特殊含义的标识符.关键字一般用于描述一个程序的结构或者表示数据类型.他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名.方法名.类名.包名. ...

  8. 浅析android中的依赖注入

    这几年针对Android推出了不少View注入框架,例如ButterKnife.我们首先来了解一下使用这些框架有什么好处,其实好处很明显:它可以减少大量的findViewById以及setOnClic ...

  9. 手机移动端网站开发流程HTML5

    手机移动端网站开发流程HTML5 最近一直在研究移动手机网站的开发,发现做手机网站没有想象中的那么难.为什么会这么说呢?我们试想下:我们连传统的PC网站都会做,难道连一个小小的手机网站难道都搞不定吗? ...

  10. 分布式锁的实现方式——ACID数据库、缓存或者是zk

    针对分布式锁的实现,目前比较常用的有以下几种方案: 基于数据库实现分布式锁 基于缓存(redis,memcached,tair)实现分布式锁 基于Zookeeper实现分布式锁 在分析这几种实现方案之 ...