2023年8月10號提高組T3 樹

2021-08-06 05:05:55 字數 2264 閱讀 8341

給你一棵大小為n的有根樹,每個點有點權,要求完成以下操作:

v x y把點x的權值變成y

e x把有根樹的根變為x

q x查詢點x的子樹的最小值

第一行兩個整數n,m,表示點數和運算元。

接下來n行,每行兩個數f,v,第i行的兩個數表示i的父親和i的權值,且保證f接下來m行,每行表示乙個操作。

對於每個q操作,輸出乙個整數表示最小值。

對於30%的資料,n<=1000.

對於100%的資料,n,m<=100000,權值<=10^9

by bpm

不考慮修改點權和修改根是很好做的,dfs一輪就可以了。

考慮修改和查詢,我們可以通過dfs把樹轉換成序列,修改、查詢的操作就變成序列上的操作了,線段樹搞定。

再考慮換根。我們讓1恒為根,不難發現如果詢問節點x在當前根root的子樹內,則x在當前根下的子樹仍為x在1位根下的子樹;否則,簡單畫一下圖就可以發現,x在當前根下的子樹變成了除了以1為根時x的子樹外的其餘部分,也就是說把dfs序去掉x以1為根時的子樹那部分後,其餘部分就是x在當前根下的子樹。

繼續用線段樹來做即可。

#include 

#define rep(i, st, ed) for (int i = st; i <= ed; i += 1)

#define erg(i, st) for (int i = ls[st]; i; i = e[i].next)

#define min(x, y) (x)<(y)?(x):(y)

#define max(x, y) (x)>(y)?(x):(y)

#define inf 0x3f3f3f3f

#define n 100001

#define e n

struct edgee[e];

struct treenode

bool

operator

<=(treenode b)

}t[n << 2 | 1], rc[n];

int father[n], ls[n], v[n];

int edgecnt = 0, rcnt = 0;

inline

int read()

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

return x;

}inline

void addedge(int x, int y); ls[x] = edgecnt;

}inline

void modify(int now, int x, int v)

int mid = (t[now].l + t[now].r) >> 1;

if (x <= mid)

if (x > mid)

t[now].mn = min(t[now << 1].mn, t[now << 1 | 1].mn);

}inline

int query(int now, int l, int r)

if (t[now].l == l && t[now].r == r)

int mid = (t[now].l + t[now].r) >> 1;

if (r <= mid)

if (l > mid)

return min(query(now << 1, l, mid), query(now << 1 | 1, mid + 1, r));

}inline

void build(int now, int l, int r);

if (l == r)

int mid = (l + r) >> 1;

build(now << 1, l, mid);

build(now << 1 | 1, mid + 1, r);

}inline

void dfs(int fa, int now)

}int main(void)

build(1, 1, n);

int root = 1;

dfs(0, root);

rep(i, 1, m)else

if (ch == 'q')else

if (rc[root] < rc[x])

}printf("%d\n", min(query(1, 1, rc[now].l - 1), query(1, rc[now].r + 1, rcnt)));

}else

}else

if (ch == 'e')

}return

0;}

2023年8月16日提高組T3 旅館

有一間旅館,旅館內有n間排成一排的房間,一開始全為空。現在有m個要求 1 d表示詢問旅館內是否有連續d間空房間,有的話則輸出最小的乙個r,滿足從r開始連續d間房間均為空,同時會有人入住這d間房。若無法被滿足,則輸出0.2 l r表示把 l,r 內的房間全部設為空。第一行兩個整數n,m.接下來m行,每...

2023年8月7日提高組T3 選數

給出n個數a i 現在可以在其中任意選出若干個數,問有多少種選擇方案,使得這幾個數可以分成兩個和相等的集合。第一行是乙個正整數n,第二行每行n個正整數。輸出乙個數,表示方案數。對於30 的資料,n 10.對於100 的資料,n 20,a i 100000000.by bpm 略難每個數字前可以填1 ...

2023年8月10號提高組T2 飛行

description 有n個城市,編號為0到n 1。小b想從城市s到城市t。他們選擇了一家航空公司,這家公司有m種航線,每種航線連線了兩個不同的城市。看在小b是個妹子的份上,航空公司的老總給了小b一點優惠 小b可以免費在最多k種航線上搭乘飛機。問小b最小花費是多少。input 第一行三個整數n,m...