三向城(NOIP模擬題)

2021-08-10 10:00:38 字數 1600 閱讀 8044

標籤:樹,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...