当前位置:网站首页>POJ 3237 tree (tree chain splitting)
POJ 3237 tree (tree chain splitting)
2022-07-05 21:42:00 【Full stack programmer webmaster】
Hello everyone , I meet you again , I'm the king of the whole stack , I've prepared for you today Idea Registration code .
The main idea of the topic : Given a tree , Three operations :
- CHANGE i v: take i The node weight becomes v
- NEGATE a b: take ab The weights of all nodes on the path become opposite
- QUERY a b: Inquire about ab The maximum value of the node weight on the path .
Their thinking : The tree chain splits . Then use the segment tree to maintain the node weights , End to end update query .
#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;
}Copyright notice : This article is an original blog article . Blog , Without consent , Shall not be reproduced .
Publisher : Full stack programmer stack length , Reprint please indicate the source :https://javaforall.cn/117584.html Link to the original text :https://javaforall.cn
边栏推荐
- Arcgis\qgis no plug-in loading (no offset) mapbox HD image map
- EN 438-7 laminated sheet products for building covering decoration - CE certification
- Interview questions for basic software testing
- 【日常训练--腾讯精选50】89. 格雷编码(看题解才会的)
- EasyExcel的读写操作
- 面试官:并发编程实战会吗?(线程控制操作详解)
- 校招期间 准备面试算法岗位 该怎么做?
- 从零开始实现lmax-Disruptor队列(四)多线程生产者MultiProducerSequencer原理解析
- Longest swing sequence [greedy practice]
- R language learning notes
猜你喜欢

2.2.5 basic sentences of R language drawing

Summarize the reasons for 2XX, 3xx, 4xx, 5xx status codes

Clickhouse copy paste multi line SQL statement error

场景化面试:关于分布式锁的十问十答

Arcgis\qgis no plug-in loading (no offset) mapbox HD image map

Teach yourself to train pytorch model to Caffe (I)

Golang (1) | from environmental preparation to quick start

Some common processing problems of structural equation model Amos software

Sorting out the problems encountered in MySQL built by pycharm connecting virtual machines

Introduction of ArcGIS grid resampling method
随机推荐
Objects in the list, sorted by a field
Three components of openpyxl
Summarize the reasons for 2XX, 3xx, 4xx, 5xx status codes
Interviewer: will concurrent programming practice meet? (detailed explanation of thread control operation)
深信服X计划-网络协议基础 DNS
GCC9.5离线安装
秋招将临 如何准备算法面试、回答算法面试题
uni-app 蓝牙通信
面试官:并发编程实战会吗?(线程控制操作详解)
KingbaseES V8R3集群维护案例之---在线添加备库管理节点
Pointer parameter passing vs reference parameter passing vs value parameter passing
Introduction of ArcGIS grid resampling method
Simple interest mode - evil Chinese style
Simple interest mode - lazy type
Chapter 05_ Storage engine
Get JS of the previous day (timestamp conversion)
递归查询多级菜单数据
Robot framework setting variables
Selenium gets the verification code image in DOM
Parker driver maintenance COMPAX controller maintenance cpx0200h