就是简单的树链剖分,但标记下传的时候一定要 ^1 而不能直接 = 1,我竟然WA在这么逗比的错误上不如一头撞死……

上代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define N 1100000
#define inf 0x7f7f7f7f
using namespace std; struct sss
{
int minnum, maxnum;
int push;
}t[N*];
int n, nowplace, bianp[N];
int p[N], next[N*], v[N*], c[N*], bnum;
int fa[N], son[N], siz[N], deep[N], top[N], w[N]; void build_tree(int now, int l, int r)
{
t[now].minnum = inf; t[now].maxnum = -inf; t[now].push = ;
if (l == r) return;
int mid = (l+r)/;
build_tree(now*, l, mid); build_tree(now*+, mid+, r);
} void downdate(int now)
{
if (!t[now].push) return; t[now].push = ;
t[now*].push ^= ; t[now*+].push ^= ;
swap(t[now*].maxnum, t[now*].minnum);
swap(t[now*+].maxnum, t[now*+].minnum);
t[now*].maxnum *= -; t[now*].minnum *= -;
t[now*+].maxnum *= -; t[now*+].minnum *= -;
} void update(int now)
{
t[now].maxnum = max(t[now*].maxnum, t[now*+].maxnum);
t[now].minnum = min(t[now*].minnum, t[now*+].minnum);
} void addbian(int x, int y)
{
bnum++; next[bnum] = p[x]; p[x] = bnum; v[bnum] = y;
bnum++; next[bnum] = p[y]; p[y] = bnum; v[bnum] = x;
} void dfs_1(int now, int nowfa, int nowdeep)
{
int k = p[now]; fa[now] = nowfa; deep[now] = nowdeep;
int maxson = ; son[now] = ; siz[now] = ;
while (k)
{
if (v[k] != nowfa)
{
bianp[(k+)/] = v[k];
dfs_1(v[k], now, nowdeep+);
siz[now] += siz[v[k]];
if (siz[v[k]] > maxson)
{
maxson = siz[v[k]];
son[now] = v[k];
}
}
k = next[k];
}
} void dfs_2(int now, int nowfa, int nowtop)
{
int k = p[now]; top[now] = nowtop; w[now] = ++nowplace;
if (son[now]) dfs_2(son[now], now, nowtop);
while (k)
{
if (v[k] != nowfa && v[k] != son[now])
dfs_2(v[k], now, v[k]);
k = next[k];
}
} int task(int now, int l, int r, int al, int ar)
{
if (al <= l && r <= ar) return t[now].maxnum;
int mid = (l+r)/, ans = -inf;
downdate(now);
if (al <= mid) ans = task(now*, l, mid, al, ar);
if (ar > mid) ans = max(ans, task(now*+, mid+, r, al, ar));
update(now); return ans;
} void tneg(int now, int l, int r, int tl, int tr)
{
if (tl <= l && r <= tr)
{
downdate(now);
swap(t[now].maxnum, t[now].minnum);
t[now].maxnum *= -; t[now].minnum *= -;
t[now].push ^= ; return;
}
int mid = (l+r)/;
downdate(now);
if (tl <= mid) tneg(now*, l, mid, tl, tr);
if (tr > mid) tneg(now*+, mid+, r, tl, tr);
update(now); return;
} void chan(int now, int l, int r, int cplace, int cnum)
{
if (l == r)
{
t[now].maxnum = t[now].minnum = cnum;
return;
}
int mid = (l+r)/;
downdate(now);
if (cplace <= mid) chan(now*, l, mid, cplace, cnum);
else chan(now*+, mid+, r, cplace, cnum);
update(now); return;
} void neg(int u, int v)
{
int f1 = top[u], f2 = top[v];
if (deep[f1] < deep[f2]) { swap(f1, f2); swap(u, v); }
if (f1 == f2)
{
if (u == v) return;
if (w[u] > w[v]) swap(u, v);
tneg(, , n, w[son[u]], w[v]);
return;
}
tneg(, , n, w[f1], w[u]); neg(fa[f1], v);
} int find(int u, int v)
{
int f1 = top[u],f2 = top[v];
if (deep[f1] < deep[f2]) { swap(f1, f2); swap(u, v); }
if (f1 == f2)
{
if (u == v) return -inf;
if (w[u] > w[v]) swap(u, v);
return task(, , n, w[son[u]], w[v]);
}
int ans = task(, , n, w[f1], w[u]);
return max(ans, find(fa[f1], v));
} int main()
{
int T; scanf("%d", &T);
while (T--)
{
scanf("%d", &n); memset(p, , sizeof(p));
build_tree(, , n); nowplace = ; bnum = ;
for (int i = ; i < n; ++i)
{
int x, y, z; scanf("%d%d%d", &x, &y, &z);
addbian(x, y); c[i] = z;
}
dfs_1(, , );
dfs_2(, , );
for (int i = ; i < n; ++i)
chan(, , n, w[bianp[i]], c[i]);
char s[];
while (scanf("%s", s) != EOF)
{
if (s[] == 'D') break;
int x, y; scanf("%d%d", &x, &y);
if (s[] == 'Q') printf("%d\n", find(x, y));
else if (s[] == 'C') chan(, , n, w[bianp[x]], y);
else if (s[]=='N') neg(x, y);
}
}
return ;
}

poj 3237 Tree的更多相关文章

  1. poj 3237 Tree [LCA] (树链剖分)

    poj 3237 tree inline : 1. inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高. 2. 很明显,类 ...

  2. poj 3237 Tree(树链拆分)

    题目链接:poj 3237 Tree 题目大意:给定一棵树,三种操作: CHANGE i v:将i节点权值变为v NEGATE a b:将ab路径上全部节点的权值变为相反数 QUERY a b:查询a ...

  3. poj 3237 Tree 树链剖分

    题目链接:http://poj.org/problem?id=3237 You are given a tree with N nodes. The tree’s nodes are numbered ...

  4. POJ 3237 Tree (树链剖分 路径剖分 线段树的lazy标记)

    题目链接:http://poj.org/problem?id=3237 一棵有边权的树,有3种操作. 树链剖分+线段树lazy标记.lazy为0表示没更新区间或者区间更新了2的倍数次,1表示为更新,每 ...

  5. poj 3237 Tree(树链剖分,线段树)

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 7268   Accepted: 1969 Description ...

  6. ●POJ 3237 Tree

    题链: http://poj.org/problem?id=3237 题解: LCT 说一说如何完成询问操作就好了(把一条链的边权变成相反数的操作可以类比着来): 首先明确一下,我们把边权下放到点上. ...

  7. POJ 3237 Tree (树链剖分)

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 2825   Accepted: 769 Description ...

  8. POJ 3237.Tree -树链剖分(边权)(边值更新、路径边权最值、区间标记)贴个板子备忘

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 12247   Accepted: 3151 Descriptio ...

  9. poj 3237 Tree 树链剖分+线段树

    Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...

  10. POJ 3237 Tree 【树链剖分】+【线段树】

    <题目链接> 题目大意: 给定一棵树,该树带有边权,现在对该树进行三种操作: 一:改变指定编号边的边权: 二:对树上指定路径的边权全部取反: 三:查询树上指定路径的最大边权值. 解题分析: ...

随机推荐

  1. UVA 1557 - Calendar Game(博弈dp)

    UVA 1557 - Calendar Game 题目链接 题意:给定一个日期,两个人轮流走,每次能够走一月或者一天,问最后谁能走到2001.11.4这个日子 思路:记忆化搜索,对于每一个日期,假设下 ...

  2. Android播播放完SD卡指定文件夹音乐之后,自动播放下一首

    最近做一个项目,需要连续播放音乐,播放完一首歌之后,自动播放完下一首歌.不要重复播放. 代码如下: package com.example.asyncplayer_ex; import java.io ...

  3. eclipse中Build Path-Add to Build Path相应到androidstudio的设置

    有些时候并不须要加入lib库进行编译,比如在使用xposed的jar包时,仅仅须要在eclipse里Build Path-Add to Build Path就可以,假设作为lib库加入进去反而会出现异 ...

  4. ABAP 日期时间函数(转)

    转自:http://www.sapjx.com/abap-datetime-function.html 函数名称 (内页-点击名称可查看操作) 函数说明 备注 FIMA_DATE_CREATE RP_ ...

  5. Seconds_Behind_Master

    http://blog.chinaunix.net/uid-28212952-id-3494560.html 今天同事遇到一个故障,xtrabackup备份中flush tables with rea ...

  6. java_闭包和回调实现一边按键盘一边演讲

    package ming; interface Teachable { void work(); } class Programer { private String name; public Str ...

  7. win7关机命令

    通过 DOS 命令 “shutdown” 来实现 Windows7 系统下的定时关机功能. 使用at 命令 at 12:00 shutdown -s,取消:at/delete shutdown -s ...

  8. Java基础知识强化101:Java 中的 String对象真的不可变吗 ?

    1. 什么是不可变对象?       众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对 ...

  9. ie6双边距bug及其解决办法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. java笔记00-目录

    --2013年7月26日17:49:59 学习java已久,趁最近有空,写一个总结: java笔记01-反射: