題解: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...