美團 CodeM 複賽 城市網路

2021-08-03 15:01:29 字數 1479 閱讀 6012

有乙個樹狀的城市網路(即 nnn 個城市由 n−1n-1n−1 條道路連線的連通圖),首都為 111 號城市,每個城市售賣價值為 aia_ia​i​​ 的珠寶。

你是乙個珠寶商,現在安排有 qqq 次行程,每次行程為從 uuu 號城市前往 vvv 號城市(走最短路徑),保證 vvv 在 uuu 前往首都的最短路徑上。

在每次行程開始時,你手上有價值為 ccc 的珠寶(每次行程可能不同),並且每經過乙個城市時(包括 uuu 和 vvv),假如那個城市中售賣的珠寶比你現在手上的每一種珠寶都要優秀(價值更高,即嚴格大於),那麼你就會選擇購入。

現在你想要對每一次行程,求出會進行多少次購買事件。

對每個位置倍增求出祖先中第乙個大於自己的,然後可以建出新的樹(其實是森林如果你當0號點不存在的話)。

每次詢問倍增求出u的祖先中第乙個大於自己的位置(注意判斷這個是否在v以下),然後再在新樹上倍增。

#include

#include

#include

#define fo(i,a,b) for(i=a;i<=b;i++)

using namespace std;

const int maxn=100000+10;

int h[maxn],go[maxn*2],nxt[maxn*2],a[maxn];

int h2[maxn],g2[maxn*2],n2[maxn*2];

int f[maxn][25],g[maxn][25],dep[maxn],dp[maxn],fa[maxn][25],zjy[maxn],d[maxn];

int i,j,k,l,t,n,m,tot,top,ans;

intread()

while (ch>='0'&&ch<='9')

return

x*f;

}void add(int

x,int

y)void add2(int

x,int

y)void dfs(int

x,inty)}

void dg(intx)}

int main()

dfs(1,0);

fo(i,1,n) zjy[i]=floor(log(i)/log(2));

fo(j,1,zjy[n])

fo(i,1,n)

tot=0;

fo(i,2,n)

if (a[t]>a[i]) add2(t,i);

}fo(i,1,n)

if (!d[i])

fo(j,1,zjy[n])

fo(i,1,n)

fa[i][j]=fa[fa[i][j-1]][j-1];

while (m--)

if (a[t]<=l||dep[t]printf("0\n");

else

ans-=dp[t];

ans++;

printf("%d\n",ans);}}

}

美團 CodeM 複賽 配對遊戲

有 nnn 個人排成一排,一開始全部面向前方,然後隨機朝左或是朝右轉。然後我們不斷審查這個佇列,每次選擇兩個面對面的相鄰的人,將他們從佇列中取出。例如 表示向右,表示向左 佇列 的消除過程為,到 到 到空佇列 每次去除一對 佇列 的消除過程為,到 到 到 每次去除一對 求最後期望能夠剩下多少人。可以...

美團codeM預賽A 倒水

倒水 時間限制 1秒 空間限制 32768k 有乙個大水缸,裡面水的溫度為t單位,體積為c公升。另有n杯水 假設每個杯子的容量是無限的 每杯水的溫度為t i 單位,體積為c i 公升。現在要把大水缸的水倒入n杯水中,使得n杯水的溫度相同,請問這可能嗎?並求出可行的最高溫度,保留4位小數。注意 一杯溫...

美團CODEM 字串

時間限制 1秒 空間限制 32768k 給出乙個正整數n,我們把1.n在k進製下的表示連起來記為s n,k 例如s 16,16 123456789abcdef10,s 5,2 11011100101。現在對於給定的n和字串t,我們想知道是否存在乙個k 2 k 16 使得t是s n,k 的子串。輸入描...