POJ3889Fractal Streets
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 445 | Accepted: 162 |
Description
More work is not something Chris needs right now, since like any
good bureaucrat, he is extremely lazy. Given that this is a character
trait he has in common with most computer scientists it should come as
no surprise that one of his closest friends, Paul, is in fact a computer
scientist. And it was Paul who suggested the brilliant idea that has
made Chris a hero among his peers: Fractal Streets! By using a Hilbert
curve, he can easily fill in rectangular plots of arbitrary size with
very little work.
A Hilbert curve of order 1 consists of one "cup". In a Hilbert curve
of order 2 that cup is replaced by four smaller but identical cups and
three connecting roads. In a Hilbert curve of order 3 those four cups
are in turn replaced by four identical but still smaller cups and three
connecting roads, etc. At each corner of a cup a driveway (with mailbox)
is placed for a house, with a simple successive numbering. The house in
the top left corner has number 1, and the distance between two adjacent
houses is 10m.
The situation is shown graphically in figure 2. As you can see the
Fractal Streets concept successfully eliminates the need for boring
street grids, while still requiring very little effort from our
bureaucrats.
As a token of their gratitude, several mayors have offered Chris a
house in one of the many new neighborhoods built with his own new
scheme. Chris would now like to know which of these offerings will get
him a house closest to the local city planning office (of course each of
these new neighborhoods has one). Luckily he will not have to actually
drive along the street, because his new company "car" is one of those
new flying cars. This high-tech vehicle allows him to travel in a
straight line from his driveway to the driveway of his new office. Can
you write a program to determine the distance he will have to fly for
each offier (excluding the vertical distance at takeoff and landing)?
Input
A line containing a three positive integers, n < 16 and h, o < 231, specifying the order of the Hilbert curve, and the house numbers of the offered house and the local city planning office.
Output
One line containing the distance Chris will have to fly to his work in meters, rounded to the nearest integer.
Sample Input
3
1 1 2
2 16 1
3 4 33
Sample Output
10
30
50
Source
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath> inline void read(long long &x)
{
x = ;char ch = getchar(),c = ch;
while(ch < '' || ch > '')c = ch, ch = getchar();
while(ch <= '' && ch >= '')x = x * + ch - '', ch = getchar();
if(c == '-')x = -x;
} const long long INF = 0x3f3f3f3f; long long t, N, S, D, pow4[], pow2[]; struct Node
{
long long x, y;
Node(long long _x, long long _y){x = _x,y = _y;}
Node(){}
}; //求解编号为m的房子,在逆时针旋转p度后的n级城市中的坐标
//p只能取值0,90,270
//90,270编号反转,0不变 Node cal(long long n, long long p, long long m)
{
if(n == )
{
if(p == )
{
if(m == )return Node(,);
else if(m == ) return Node(,);
else if(m == ) return Node(,);
else return Node(,);
}
else if(p == )
{
if(m == )return Node(,);
else if(m == ) return Node(,);
else if(m == ) return Node(,);
else return Node(,);
}
else if(p == )
{
if(m == )return Node(,);
else if(m == ) return Node(,);
else if(m == ) return Node(,);
else return Node(,);
}
else if(p == )
{
if(m == )return Node(,);
else if(m == ) return Node(,);
else if(m == ) return Node(,);
else return Node(,);
}
}
Node tmp;
long long a = pow4[n - ];
long long r = (m - ) / a + ;
if(p == )
{
if(r == ) tmp = cal(n - , , m);
else if(r == ) tmp = cal(n - , , m - a), tmp.y += pow2[n - ];
else if(r == ) tmp = cal(n - , , m - * a), tmp.x += pow2[n - ], tmp.y += pow2[n - ];
else tmp = cal(n - , , m - a * ), tmp.x += pow2[n - ];
}
else if(p == )
{
if(r == ) tmp = cal(n - , , m), tmp.x += pow2[n - ], tmp.y += pow2[n - ];
else if(r == ) tmp = cal(n - , , m - a), tmp.y += pow2[n - ];
else if(r == ) tmp = cal(n - , , m - a * );
else tmp = cal(n - , , m - a * ), tmp.x += pow2[n - ];
}
else if(p == )
{
if(r == ) tmp = cal(n - , , m);
else if(r == ) tmp = cal(n - , , m - a), tmp.x += pow2[n - ];
else if(r == ) tmp = cal(n - , , m - * a), tmp.x += pow2[n - ], tmp.y += pow2[n - ];
else tmp = cal(n - , , m - * a), tmp.y += pow2[n - ];
}
else if(p == )
{
if(r == ) tmp = cal(n - , , m), tmp.x += pow2[n - ], tmp.y += pow2[n - ];
else if(r == ) tmp = cal(n - , , m - a), tmp.x += pow2[n - ];
else if(r == ) tmp = cal(n - , , m - a * );
else tmp = cal(n - , , m - a * ), tmp.y += pow2[n - ];
}
return tmp;
} int main()
{
//freopen("data.txt", "r" ,stdin);
read(t);
pow4[] = , pow2[] = ;
for(register int i = ;i <= ;++ i) pow4[i] = (pow4[i - ] << ), pow2[i] = (pow2[i - ] << );
Node tmp1, tmp2;
for(;t;-- t)
{
read(N),read(S),read(D);
tmp1 = cal(N, , S);
tmp2 = cal(N, , D);
double len = sqrt((long long)abs(tmp1.x - tmp2.x) * abs(tmp1.x - tmp2.x) + (long long)abs(tmp1.y - tmp2.y) * abs(tmp1.y - tmp2.y)) * ;
printf("%lld\n", (long long)(len + 0.5));
}
return ;
}
POJ3889
POJ3889Fractal Streets的更多相关文章
- POJ 3889 Fractal Streets(逼近模拟)
$ POJ~3889~Fractal~Streets $(模拟) $ solution: $ 这是一道淳朴的模拟题,最近发现这种题目总是可以用逼近法,就再来练练手吧. 首先对于每个编号我们可以用逼近法 ...
- Codeforces 1070J Streets and Avenues in Berhattan dp
Streets and Avenues in Berhattan 我们首先能发现在最优情况下最多只有一种颜色会分别在行和列, 因为你把式子写出来是个二次函数, 在两端取极值. 然后我们就枚举哪个颜色会 ...
- One-Way Streets (oneway)
One-Way Streets (oneway) 题目描述 Once upon a time there was a country with nn cities and mm bidirection ...
- poj3889 fractal streets
分形街道 我干,这个毒瘤. 想起来就头痛. 首先看题就是一大难题...... 说一下题目大意吧. 每当n+1时,把n阶图复制为4份.2*2排好. 右边两个不动.左上顺时针旋转90°,左下逆时针旋转90 ...
- Luogu4652 CEOI2017 One-Way Streets 树上差分
传送门 题意:给出$N$个点.$M$条无向边的图,现在你需要给它定向,并满足$Q$个条件:每个条件形如$(x_i,y_i)$,表示定向之后需要存在路径从$x_i$走向$y_i$.问每条边是否都有唯一定 ...
- CF 1070J Streets and Avenues in Berhattan
DP的数组f其实开得不够大,应该开200000,但是它在cf上就是过了... 题意是把一堆字母分别分配到行和列. 分析一下,答案实际上只和n行中和m列中每种字母分配的个数有关.而且答案只和" ...
- bzoj2263: Pku3889 Fractal Streets
给出两点编号,求如图所示的图中两点间欧氏距离*10取整 递归处理由编号求出坐标 #include<cstdio> #include<cmath> int T,n,s,t; vo ...
- 【刷题】LOJ 2480 「CEOI2017」One-Way Streets
题目描述 给定一张 \(n\) 个点 \(m\) 条边的无向图,现在想要把这张图定向. 有 \(p\) 个限制条件,每个条件形如 \((xi,yi)\) ,表示在新的有向图当中,\(x_i\) 要能够 ...
- CodeForces 1070J Streets and Avenues in Berhattan 性质+动态规划
题目大意: 你有$k$个数,分为$26$种 对于每个数,你可以选择选进$A$集合或者$B$集合或者不选 要求$A$集合中必须有$n$个数,$B$集合中必须有$m$个数 记第$i$种数在$A$集合中的个 ...
随机推荐
- 2019-9-2-C#判断文件属于文本或二进制
title author date CreateTime categories C#判断文件属于文本或二进制 lindexi 2019-09-02 12:57:37 +0800 2018-2-13 1 ...
- 11.Hibernate一对多关系
创建JavaBean 一方: Customer private long cust_id; private String cust_name; private long cust_user_id; p ...
- 编译安装Python3.6.1
系统:CentOS 7 Python: 3.6.1 去官方网站下载Python的源码包 然后准备开发环境和服务器平台开发 注意:python编译还依赖一个zlib-devel(本人第一次编译就因为不知 ...
- css-文本两行或多行文本溢出显示省略号(转)
转自:http://www.daqianduan.com/6179.html 感谢作者 1.单行文本的溢出显示省略号 overflow: hidden; text-overflow:ellipsis ...
- pyinstaller 打包python3.6文件成exe 运行
1.安装pyinstaller 切换到安装目录下script 运行 如我的目录:F:\Program Files\Python36\Scripts pip install pyinstaller ...
- LUOGU P3157 [CQOI2011]动态逆序对(CDQ 分治)
传送门 解题思路 cdq分治,将位置看做一维,修改时间看做一维,权值看做一维,然后就转化成了三维偏序,用排序+cdq+树状数组.注意算删除贡献时要做两次cdq,分别算对前面和后面的贡献. #inclu ...
- 洛谷p1605--迷宫 经典dfs
https://www.luogu.org/problemnew/show/P1605 用这种题来复习一下dfs 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和终点坐标,问 ...
- Git同平台下多个账号配置
在公司要使用公司和自己的两个账号都往GitHub上面提交,所以整理成笔记 具体配置项 StrictHostKeyChecking no UserKnownHostsFile /dev/null # 为 ...
- jmeter参数化之配置元件CSV控件
1. 用badboby进行录制,录制完成后保存,用JMeter格式进行保存,如:登陆.jmx 2. 在jmeter中打开保存的文件登陆.jmx. 3. 对登陆账号和密码进行参数 ...
- Tarjan求LCA(离线)
基本思想 把要求的点对保存下来,在dfs时顺带求出来. 方法 将每个已经遍历的点指向它回溯的最高节点(遍历它的子树时指向自己),每遍历到一个点就处理它存在的询问如果另一个点已经遍历,则lca就是另一个 ...