当前位置:网站首页>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
边栏推荐
- Some common processing problems of structural equation model Amos software
- KingbaseES V8R3集群维护案例之---在线添加备库管理节点
- 使用Aspect制作全局异常处理类
- Alibaba cloud award winning experience: build a highly available system with polardb-x
- MySQL deep paging optimization with tens of millions of data, and online failure is rejected!
- 2022-07-03-cka- latest feedback from fans
- 1.2 download and installation of the help software rstudio
- Introduction of ArcGIS grid resampling method
- Access Zadig self-test environment outside the cluster based on ingress controller (best practice)
- Environment configuration problem record
猜你喜欢

Some common processing problems of structural equation model Amos software

Implementing Lmax disruptor queue from scratch (IV) principle analysis of multithreaded producer multiproducersequencer

EasyExcel的讀寫操作

怎么利用Tensorflow2进行猫狗分类识别

What should I do to prepare for the interview algorithm position during school recruitment?

Display DIN 4102-1 Class B1 fire test requirements

Yolov5 training custom data set (pycharm ultra detailed version)

Feng Tang's "spring breeze is not as good as you" digital collection, logged into xirang on July 8!

JMeter installation under win7

Defect detection - Halcon surface scratch detection
随机推荐
[daily training -- Tencent select 50] 89 Gray code (only after seeing the solution of the problem)
QML reported an error expected token ";", expected a qualified name ID
Uni app Bluetooth communication
Matlab | app designer · I used Matlab to make a real-time editor of latex formula
Reading and writing operations of easyexcel
datagrid直接编辑保存“设计缺陷”
Simple interest mode - evil Chinese style
SecureCRT使用提示
Sorting out the problems encountered in MySQL built by pycharm connecting virtual machines
selenium 查找b或p标签的内容
Longest swing sequence [greedy practice]
Oracle HugePages没有被使用导致服务器很卡的解决方法
Gcc9.5 offline installation
2022-07-03-CKA-粉丝反馈最新情况
How can Huawei online match improve the success rate of player matching
ESP32
HYSBZ 2243 染色 (树链拆分)
思特奇加入openGauss开源社区,共同推动数据库产业生态发展
Xlrd common operations
Get JS of the previous day (timestamp conversion)