当前位置:网站首页>Poj 3237 Tree (Tree Chain Split)
Poj 3237 Tree (Tree Chain Split)
2022-07-05 21:42:00 【Chef de station du programmeur de pile complète】
Bonjour tout le monde,On se revoit,Je suis le chef de l'armée.,C'est pour aujourd'hui.IdeaCode d'inscription.
Liens vers les sujets:poj 3237 Tree
Objet:Un arbre donné,Trois opérations:
- CHANGE i v:Oui.iLe poids du noeud devientv
- NEGATE a b:Oui.abLes poids de tous les noeuds sur le chemin deviennent inverses
- QUERY a b:RequêteabValeur maximale du poids du noeud sur le chemin.
Comment résoudre le problème:Division de la chaîne des arbres.Ensuite, maintenez le poids du noeud avec l'arbre de segment,Requête de mise à jour finale.
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 10005;
const int INF = 0x3f3f3f3f;
int id, far[maxn], son[maxn], cnt[maxn], idx[maxn], top[maxn], dep[maxn];
int N, en, first[maxn], jump[maxn * 2], val[maxn];
struct Edge {
int u, v, w;
void set (int u, int v, int w) {
this->u = u;
this->v = v;
this->w = w;
}
}ed[maxn * 2];
void dfs_fir (int u, int pre, int d) {
dep[u] = d;
far[u] = pre;
cnt[u] = 1;
son[u] = 0;
for (int i = first[u]; i + 1; i = jump[i]) {
int v = ed[i].v;
if (v == pre)
continue;
dfs_fir(v, u, d + 1);
cnt[u] += cnt[v];
if (cnt[son[u]] < cnt[v])
son[u] = v;
}
}
void dfs_sec(int u, int rot) {
idx[u] = id++;
top[u] = rot;
if (son[u])
dfs_sec(son[u], rot);
for (int i = first[u]; i + 1; i = jump[i]) {
int v = ed[i].v;
if (v == far[u] || v == son[u])
continue;
dfs_sec(v, v);
}
}
#define lson(x) ((x)<<1)
#define rson(x) (((x)<<1)|1)
int lc[maxn << 2], rc[maxn << 2], filp[maxn << 2], Ma[maxn << 2], Mi[maxn << 2];
inline void maintain (int u) {
filp[u] ^= 1;
swap(Ma[u], Mi[u]);
Ma[u] = -Ma[u];
Mi[u] = -Mi[u];
}
inline void pushup(int u) {
Ma[u] = max(Ma[lson(u)], Ma[rson(u)]);
Mi[u] = min(Mi[lson(u)], Mi[rson(u)]);
}
inline void pushdown (int u) {
if (filp[u]) {
maintain(lson(u));
maintain(rson(u));
filp[u] = 0;
}
}
void build (int u, int l, int r) {
lc[u] = l;
rc[u] = r;
filp[u] = 0;
if (l == r) {
Ma[u] = Mi[u] = val[l];
return;
}
int mid = (l + r) / 2;
build(lson(u), l, mid);
build(rson(u), mid + 1, r);
pushup(u);
}
void modify (int u, int x, int w) {
if (lc[u] == x && rc[u] == x) {
Ma[u] = Mi[u] = w;
return;
}
pushdown(u);
int mid = (lc[u] + rc[u]) / 2;
if (x <= mid)
modify(lson(u), x, w);
else
modify(rson(u), x, w);
pushup(u);
}
void splay(int u, int l, int r) {
if (l <= lc[u] && rc[u] <= r) {
maintain(u);
return;
}
pushdown(u);
int mid = (lc[u] + rc[u]) / 2;
if (l <= mid)
splay(lson(u), l, r);
if (r > mid)
splay(rson(u), l, r);
pushup(u);
}
int query (int u, int l, int r) {
if (l <= lc[u] && rc[u] <= r)
return Ma[u];
pushdown(u);
int mid = (lc[u] + rc[u]) / 2, ret = -INF;
if (l <= mid)
ret = max(ret, query(lson(u), l, r));
if (r > mid)
ret = max(ret, query(rson(u), l, r));
pushup(u);
return ret;
}
inline void add_Edge(int u, int v, int w) {
ed[en].set(u, v, w);
jump[en] = first[u];
first[u] = en++;
}
void init () {
en = 0;
id = 1;
memset(first, -1, sizeof(first));
scanf("%d", &N);
int u, v, w;
for (int i = 0; i < N - 1; i++) {
scanf("%d%d%d", &u, &v, &w);
add_Edge(u, v, w);
add_Edge(v, u, w);
}
dfs_fir(1, 0, 0);
dfs_sec(1, 1);
for (int i = 0; i < N - 1; i++) {
int t = i * 2;
if (dep[ed[t].u] < dep[ed[t].v])
swap(ed[t].u, ed[t].v);
val[idx[ed[t].u]] = ed[t].w;
}
build(1, 1, N);
}
int query (int u, int v) {
int p = top[u], q = top[v], ret = -INF;
while (p != q) {
if (dep[p] < dep[q]) {
swap(p, q);
swap(u, v);
}
ret = max(ret, query(1, idx[p], idx[u]));
u = far[p];
p = top[u];
}
//printf("%d %d\n", u, v);
if (u == v)
return ret;
if (dep[u] > dep[v])
swap(u, v);
ret = max(ret, query(1, idx[son[u]], idx[v]));
return ret;
}
void modify (int u, int v) {
int p = top[u], q = top[v];
while (p != q) {
if (dep[p] < dep[q]) {
swap(p, q);
swap(u, v);
}
splay(1, idx[p], idx[u]);
u = far[p];
p = top[u];
}
if (u == v)
return;
if (dep[u] > dep[v])
swap(u, v);
splay(1, idx[son[u]], idx[v]);
}
void solve () {
int u, v;
char op[20];
while (scanf("%s", op), strcmp(op, "DONE") != 0) {
scanf("%d%d", &u, &v);
if (op[0] == 'C')
modify(1, idx[ed[u*2-2].u], v);
else if (op[0] == 'Q')
printf("%d\n", query(u, v));
else
modify(u, v);
}
}
int main () {
int cas;
scanf("%d", &cas);
while (cas--) {
init();
solve();
}
return 0;
}
Avis de copyright:Article original du blog.Blogs,Sans consentement,Non reproduit.
Éditeur:Programmeur de pile complète,Veuillez indiquer la source de la réimpression.:https://javaforall.cn/117584.htmlLien vers le texte original:https://javaforall.cn
边栏推荐
猜你喜欢
Oracle检查点队列–实例崩溃恢复原理剖析
Analysis and test of ModbusRTU communication protocol
Exercise 1 simple training of R language drawing
leetcode:1755. Sum of subsequences closest to the target value
MATLAB | App Designer·我用MATLAB制作了一款LATEX公式实时编辑器
总结出现2xx、3xx、4xx、5xx状态码的原因
Yolov5 training custom data set (pycharm ultra detailed version)
校招期间 准备面试算法岗位 该怎么做?
MMAP
华为联机对战如何提升玩家匹配成功几率
随机推荐
Zhang Lijun: la pénétration de l’incertitude dépend de quatre « invariants»
Pointer parameter passing vs reference parameter passing vs value parameter passing
Access Zadig self-test environment outside the cluster based on ingress controller (best practice)
HDU 4391 Paint The Wall 段树(水
An exception occurred in Huawei game multimedia calling the room switching method internal system error Reason:90000017
regular expression
Learning notes of statistical learning methods -- Chapter 1 Introduction to statistical learning methods
Sitge joined the opengauss open source community to jointly promote the ecological development of the database industry
@Validated basic parameter verification, grouping parameter verification and nested parameter verification
Li Kou ----- the maximum profit of operating Ferris wheel
Feng Tang's "spring breeze is not as good as you" digital collection, logged into xirang on July 8!
2.2.3 output of documents
Three components of openpyxl
冯唐“春风十里不如你”数字藏品,7月8日登录希壤!
Which securities company is better and which platform is safer for stock account opening
终端安全能力验证环境搭建和渗透测试记录
MySQL deep paging optimization with tens of millions of data, and online failure is rejected!
Advantages of robot framework
postgis 安装地理信息扩展
华为游戏多媒体调用切换房间方法出现异常Internal system error. Reason:90000017