BZOJ3730 震波 動態點分治

2022-03-30 05:42:38 字數 1191 閱讀 8962

#include #include #include #include #include #include #define space putchar(' ')

#define enter putchar('\n')

using namespace std;

typedef long long ll;

template void read(t &x)

template void write(t x)

const int n = 100005, inf = 0x3f3f3f3f;

int n, m, ans;

int ecnt, adj[n], nxt[2*n], go[2*n];

int val[n], fa[n][20], dis[n][20], dep[n], sze[n], son[n], rt, sz;

bool vis[n];

vector bit[n], fbit[n];

/* 變數解釋:

fa[i][j] : 第j次分治中, i所屬的連通塊的重心

dis[i][j] : i到fa[i][j]的距離

dep[i] : 點分樹上i的深度

sze, son, rt, sz 用於求重心

vis 用於點分治標註

bit[i] : 當i為重心時, 能求"離i距離為j的點的權值和是多少"的樹狀陣列

fbit[i]: 當fa[i][dep[i] - 1]為重心時, 能求"含i連通塊離fa[i][dep[i] - 1]距離為j的點的權值和是多少"的樹狀陣列

*/void add(int u, int v)

void getg(int u, int pre)

son[u] = max(son[u], sz - sze[u]);

if(son[u] < son[rt]) rt = u;

}void dfs(int u, int pre, int top, int d)

}void build(int u)

}int ask(int u, int k)

int fask(int u, int k)

void change(int u, int x)

}int query(int u, int k)

int main()

return 0;

}

BZOJ3730 震波 動態點分治

在一片土地上有n個城市,通過n 1條無向邊互相連線,形成一棵樹的結構,相鄰兩個城市的距離為1,其中第i個城市的價值為value i 不幸的是,這片土地常常發生 並且隨著時代的發展,城市的價值也往往會發生變動。0 x k 表示發生了一次 震中城市為x,影響範圍為k,所有與x距離不超過k的城市都將受到影...

bzoj 3730 震波 動態樹分治

給出一棵樹,點有點權,每次詢問距離乙個點不超過k kk 100000 n le100000 n 1000 00把點分樹建出來,然後對每個分治中心用樹狀陣列維護到該點距離為定值的點權和,以及到他點分樹上父親距離為定值的點權和。查詢的時候每次沿著父親往上跳,在計算當前點貢獻時需要減去上乙個點所在子樹的貢...

bzoj3730 震波 動態樹分治

第一行包含兩個正整數n和m。第二行包含n個正整數,第i個數表示value i 接下來n 1行,每行包含兩個正整數u v,表示u和v之間有一條無向邊。接下來m行,每行包含三個數,表示m次操作。包含若干行,對於每個詢問輸出一行乙個正整數表示答案。這道題是動態樹分治的模板題。簡要的思路 先建出分治樹,每次...