JZOJ 省選模擬 挖寶

2021-10-05 05:11:13 字數 3297 閱讀 9955

description

有乙個挖寶遊戲,它在一棵 n 個點的樹上進行,寶藏埋在某個未知的點 ?。每次挖掘乙個點 u,玩家得到的反饋資訊是乙個數值 d,

表示 u 號點到 ? 號點簡單路徑上的邊數。這個遊戲會進行 q 次,每次遊戲藏寶的位置不一定相同。

你作為一名優秀的 ??er,對自己無比自信。你希望用最少的挖掘次數來找出寶藏。於是你挑了兩個不同的點 a,b 進行挖掘,並得

到了反饋資訊,分別為 。接下來的第三次挖掘中,你想要直接奔著乙個可能的 ? 進行挖掘。由於樹太大了,憑藉人眼無法找

出 ? 的確切位置,你便轉向了電腦,開始寫乙個程式,幫助你解決這個問題。

input

第一行輸入兩個正整數 n,q,表示樹的點數和遊戲次數。

接下來 n − 1 行,每行輸入兩個正整數 u,v,描述一條樹邊。保證輸入的是一棵樹。

接下來 q 行,每行輸入四個正整數 表示一次遊戲進行兩次挖掘得到的反饋資訊。

output

輸出 q行。每行包含乙個整數表示乙個滿足條件的藏寶地點,或者輸出 −1 表示無解。當有多個可能的藏寶地點時,輸出任意乙個即可。

sample input

【樣例輸入】

5 31 2

2 33 4

3 52 1 4 1

2 2 4 2

1 1 2 1

sample output

【樣例輸出】35

首先要判斷這個點是否存在,這很容易判

然後我們分四種情況討論

u 在 a 子樹中。需要保證深度足夠

u 在 b 子樹中。同1

u 在 路徑(a,b)上的某個點的子樹內,這相當於走了一段然後下去

u 在 路徑(a,b)外面的子樹,相當於先走到lca再下去

#include

using

namespace std;

const

int n=

1e6+77;

int a[n]

,b[n]

,dep[n]

,n,q,cnt,nxt[n<<1]

,to[n<<1]

,ls[n]

,c[n]

,d[n]

,pos[n<<1]

,num,logn[n<<1]

,st[n<<1]

[21],g[n]

;int dfn[n]

,f[n][20

],ans,s3[n]

,t3[n]

;void

add(

int x,

int y)

void

dfs1

(int u,

int pa)

else

if(dep[c[v]

]>dep[d[u]])

else

if(dep[c[v]

]>dep[t3[u]])

}}void

init()

for(

int j=1;

(1<

<=cnt; j++

)for

(int i=

1; i+(1

<

<=cnt; i++)}

intlca

(int l,

int r)

intdist

(int x,

int y)

intjump

(int x,

int d)

intcalc

(int x,

int y,

int d)

void

dfs2

(int u,

int pa)

else

dfs2

(v,u);}

}int

solve12

(int u,

int v,

int du,

int dv,

int z)

else

if(dep[d[u]

]-dep[u]

>=du)

return

calc

(u,d[u]

,du);}

else

if(dep[c[u]

]-dep[u]

>=du)

return

calc

(u,c[u]

,du);}

if(du==dv+dis)

else

if(dep[d[v]

]-dep[v]

>=dv)

return

calc

(v,d[v]

,dv);}

else

if(dep[c[v]

]-dep[v]

>=dv)

return

calc

(v,c[v]

,dv);}

return-1

;}intsolve3

(int u,

int v,

int du,

int dv,

int z)

else

if(b[z]

!=fu&&b[z]

!=fv)

else

}else

if(a1<=dep[u]

-dep[z]

)else

}else

else}}

return-1

;}intsolve4

(int u,

int v,

int du,

int dv,

int z)

return-1

;}intmain()

ans=-1

;if(u==v)

int z=

lca(u,v)

; ans=

solve12

(u,v,du,dv,z);if

(ans==-1

) ans=

solve3

(u,v,du,dv,z);if

(ans==-1

) ans=

solve4

(u,v,du,dv,z)

;printf

("%d\n"

,ans);}

}

JZOJ 省選模擬 string

一行乙個整數表示答案。sample input 樣例輸入 3 3sample output 樣例輸出 首先我們忽略重複的字串,定義 n 表示長度為 n 的回文串,或由兩個回文串拼成的字串數量。那麼可以通過列舉第乙個回文串的長度 可以為 0 可以算出f n 但是正如剛才所說,會對如 abaaba 這樣...

JZOJ 省選模擬 Moorio Kart

description 由於目前可供奶牛們使用的約會 並沒有給 farmer john 留下深刻印象,他決定推出乙個基於新匹配演算法的奶牛交友 該演算法可基於公牛和母牛間的共同興趣對公牛和母牛進行匹配。bessie 在尋找情人節 barn dance 的合作夥伴時,決定試用這個 在註冊賬戶之後,fj...

JZOJ 省選模擬 死星(deathstar )

樣例 1 輸入 4 3b4 樣例 2 輸入 6 4af00 sample output 樣例 1 輸出 2樣例 2 輸出 三元環 可以直接列舉兩個點,利用 bitset 計算出第三個點有多少種可能。注意到乙個不合法的三元環等價於存在乙個出度為 2 的點,計算所有三元環內這樣的點數 之和即可,這樣更快...