標籤:樹,lca
題目描述
三向城是乙個巨大的城市,之所以叫這個名字,是因為城市中遍布著數不盡的三岔路口。(來自取名力為0的出題人)
具體來說,城中有無窮多個路口,每個路口有唯一的乙個正整數標號。除了1號路口外,每個路口都連出正好3條道路通向另外3個路口:編號為x(x>1)的路口連出3條道路通向編號為x*2,x*2+1和x/2(向下取整)的3個路口。1號路口只連出兩條道路,分別連向2號和3號路口。
所有道路都是可以雙向通行的,並且長度都為1。現在,有n個問題:從路口x到路口y的最短路長度是多少?
輸入格式
第一行包含乙個整數n,表示詢問數量;
接下來n行,每行包含兩個正整數x, y,表示詢問從路口x到路口y的最短路長度。
輸出格式
輸出n行,每行包含乙個整數,表示對每次詢問的回答。如果對於某個詢問不存在從x到y的路徑,則輸出-1。
樣例輸入
5 72 4
1 1樣例輸出
樣例解釋
5號路口到7號路口的路徑為:5->2->1->3->7,長度為4;
2號路口到4號路口的路徑為:2->4,長度為1;
1號路口到本身的路徑長度為0;
資料範圍
對30%的資料,x,y≤20;
對60%的資料,x,y≤105,n≤10;
對100%的資料,x,y≤109,n≤104。
先吐槽下出題人yy題目的語言功底……
t1難度,用lca思想直接做
code
#include#include#include#include#include#include#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define ll long long
#define mem(x,num) memset(x,num,sizeof x)
#ifdef win32
#define ll "%i64d"
#else
#define ll "%lld"
#endif
using namespace std;
inline ll read()
while(ch>='0'&&ch<='9')
return x*f;
}const int maxx=31;
int n,depx,depy,ans=0;
ll x,y;
int deep(ll x)
int main()
{ freopen("city.in","r",stdin);
freopen("city.out","w",stdout);
n=read();
rep(i,1,n){
ans=0;
x=read(),y=read();
depx=deep(x),depy=deep(y);
if(depx
三向切分的快速排序
在排序的實際應用中,經常會出現大量重複元素的陣列,比如生日排序。而在這種情況下,快速排序仍有巨大的改進空間,如 乙個元素重複的子陣列就不需要繼續排序了,但演算法卻仍會將它繼續切分為更小的陣列,三向切分的快速排序 正是基於此對 快速排序 的作出的改進。三向切分的快速排序將陣列切分為三部分,分別對應小於...
NOIP模擬題 連通
給定乙個無向圖,請編寫乙個程式實現以下兩種操作 1 d x y,從原圖中刪除連線x和y頂點的邊。2 q x y,詢問x和y頂點是否連通。這也是連通問題,考慮用並查集解決。但是這是刪除的問題耶,怎麼辦?考慮將刪除變為連通,能不能將所有操作給反過來,從最後乙個操作開始處理。當然是可以的。include ...
Noip模擬題 山峰
description在n m的棋盤上不重複的填1到n m 如果乙個數字比周圍的八個數字大,那麼他就是乙個山峰。現在告訴你所有山峰的位置,問你填數的方案數mod 12345678 input 輸入第一行兩個數字 n m意義如題目描述。接下來n 行,每行 m個字元,表示非山峰,x 表示山峰。1 n 4...