有乙個樹狀的城市網路(即 nnn 個城市由 n−1n-1n−1 條道路連線的連通圖),首都為 111 號城市,每個城市售賣價值為 aia_iai 的珠寶。
你是乙個珠寶商,現在安排有 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 的子串。輸入描...