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$集合中的个 ...
随机推荐
- C开发系列-continue与break
break break使用场景 switch语句:退出整个switch语句 循环结构:退出整个循环语句 while循环 do while循环 for 循环 continue continue使用场景 ...
- Odoo Documentation : Fields
Fields Basic fields class openerp.fields.Field(string=None, **kwargs) The field descriptor contains ...
- parameter– tRPRE and tRPST
DDR读数据有效之前,有一段时间DQS(DQS#)需为低(高),此段时间即为read preamble,tRPRE. 同理,读数据结束之前,某段时间为read postamble,tRPST.
- 洛谷P3749 [六省联考2017]寿司餐厅
传送门 题解 这几道都是上周llj讲的题,题解也写得十分好了,所以直接贴了几个链接和代码. //Achen #include<algorithm> #include<iostream ...
- centos 安装系列
装coreseek https://www.jb51.net/os/RedHat/462185.html 卸载mysql https://www.cnblogs.com/cyl048/p/687908 ...
- mysql把表的指定字段值赋给本表另一个字段
原本是主键一对一关联的,后来发现这样操作很不方便,改成主外键一对一 所以添加一个外键字段bodyId(文章正文单独存一个表) UPDATE t_article SET bodyId=id; 但是等了半 ...
- java 在线拆分 word文档采用什么技术比较好?
在Java项目开发中,偶尔会遇到通过程序动态拆分word文档的需求,由于Java本身不能操作Word文档,在网上也都是讨论如何动态合并word,所以这个需求实现起来相当困难,下面就将近期对于Word文 ...
- compareTo)--list 根据某字段排序
Collections.sort(actList, new Comparator<Act>() { @Override public int compare(Act o1, Act o2) ...
- 使用MySQL会话变量实现窗口函数
一.MySQL窗口函数 (1) 序号函数 row_number()在相等的两条记录上随机排序,但序号按照1.2递增,然后后面的序号继续递增为3,中间不会产生序号间隙: rank()/dense_ran ...
- 装饰者模式(Decorator、Compoment)(早餐销售装饰,动态添加职责)
适用于以下情况: (1)需要扩展一个类的功能,或给一个类添加附加职责. (2)需要动态的给·一个对象添加功能,这些功能可以再动态的撤销. (3)需要增加由一些基本功能的排列组合而产生的非常大量的功能, ...