城市漫遊 牛客

2022-03-31 22:48:37 字數 1325 閱讀 2823

題解:u - v這條簡單路徑上的邊會經過奇數次,其餘的邊會經過偶數次,因為從簡單路徑中的點出去後還得回來。直接算的話每次詢問都得搜整棵樹,顯然效率是極其低的。如果先預處理出整棵樹的邊都經過偶數次的花費v,那麼答案就等於 v — 簡單路徑中的邊經過偶數次的花費 + 簡單路徑中的邊經過奇數次的代價。下一步是得到後兩項,借助lca,維護路徑的字首和就ok了。

注意取模!!!!!!

#include#define ll long long

#define p pair#define pb push_back

#define lson root << 1

#define inf (int)2e9 + 7

#define maxn (int)1e5 + 7

#define rson root << 1 | 1

#define linf (unsigned long long int)1e18

#define mem(arry, in) memset(arry, in, sizeof(arry))

using

namespace

std;

const ll mod = 1000000007

;int

n, m, tot;

int head[maxn], pa[maxn][20

], d[maxn];

ll odd[maxn], even[maxn];

struct

nodeg[maxn

<< 1

];void

inite()

void addedge(int u, int v, int w, int

t)void dfs(int u, int

p)

else

dfs(v, u);

}}void

compute()

}}int lct(int u, int

v)

if(u == v) return

u;

for(int i = 19; i >= 0; i--)

}return pa[u][0];}

intmain()

compute();

scanf("%d

", &m);

for(int i = 0; i < m; i++)

return0;

}

牛客 城市網路 樹上倍增

題意 給一棵 n nn 個點的樹,每個節點代表乙個城市,每個城市賣價值為 a ia i ai 的珠寶,有 q qq 次詢問,每次詢問從 u uu 城市到 v vv 城市,一開始有價值為 c cc 的珠寶,如果當前經過的城市珠寶價值大於已有的所有珠寶的最大價值,就購買。保證 v vv 在 u uu 到...

牛客NC13331 城市網路 樹上倍增

鏈結 題目描述 有乙個樹狀的城市網路 即 n 個城市由 n 1 條道路連線的連通圖 首都為 1 號城市,每個城市售賣價值為 a i 的珠寶。你是乙個珠寶商,現在安排有 q 次行程,每次行程為從 u 號城市前往 v 號城市 走最短路徑 保證 v 在 u 前往首都的最短路徑上。在每次行程開始時,你手上有...

牛客練習賽26 C 城市規劃

思路 這題要用o n 的複雜度 讀入優化才不會超時。對於線段 l,r 將右端點標記,同時儲存以點r為右端點的線段的最大左端點值max r 由小到大遍歷所有城市,同時用 l 表示已斷開的城市的最大值,在遇到城市i被標記時,判斷max r 與l的大小,若max r 大於l,則說明還有路徑沒有斷開,則 a...