就是简单的树链剖分,但标记下传的时候一定要 ^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. 关于Android与pc通信时中文乱码的分析和解决

    初步实现了Android与pc服务器的通信之后,又碰到了传说中令人头疼不已的中文乱码问题.既然出现了乱码,那么原因自然是协议不通了.我们知道eclipse中默认的编码标准是GBK,而安卓程序开发所默认 ...

  2. iOS开发——UI篇&九宫格算法

    九宫格算法 关于iOS开发中九宫格的实现虽然使用不多,而且后面会有更好的方实现,但是作为一个程序员必需要知道的就是九宫格算法的实现. 一:实现思路: (1)明确每一块用得是什么view (2)明确每个 ...

  3. Xtrabackup每周增量备份脚本程序

    Xtrabackup每周增量备份脚本程序(含附件)   程序描述 本程序是一个对percona xtrabackup使用的脚本,它完成了MySQL每周的备份. 程序结构 此程序包含了4个目录(bin. ...

  4. slots - Python的结构体 转

          上个月看了篇文章 “SAVING 9 GB OF RAM WITH PYTHON’S __SLOTS__”,原来Python也有类似结构体的东东.拖了一个月才写这篇,是因为太久没看pyth ...

  5. 关于File.getPath,File.getAbsolutePath,File.getCanonicalPath的区别

    这个问题, 不了解一下还是挺恍惚它们之间的区别的. 其实也挺简单的. getPath()-->>new File()时的路径 getAbsolutePath()-->>当前路径 ...

  6. Build类

    在开发中 我们有时候会需要获取当前手机的系统版本来进行判断,或者需要获取一些当前手机的硬件信息. android.os.Build类中.包括了这样的一些信息.我们可以直接调用 而不需要添加任何的权限和 ...

  7. rabbitmq——用户管理

    安装最新版本的rabbitmq(3.3.1),并启用management plugin后,使用默认的账号guest登陆管理控制台,却提示登陆失败. 翻看官方的release文档后,得知由于账号gues ...

  8. 利用 Composer 完善自己的 PHP 框架(一)——视图装载

    本教程示例代码见 https://github.com/johnlui/My-First-Framework-based-on-Composer 回顾 经过了上一个 系列教程  <利用 Comp ...

  9. BloomFilter——读数学之美札记

    之前接触过bitmap,读吴军先生的数学之美,看到了一个更强大的数据结构,布隆过滤器(Bloomfilter),赶紧记下来吧,忘了怪可惜的. bitmap的使用是很有局限性的,往往只能用于海量数值型数 ...

  10. JS的replace方法【转】

    replace() 方法的参数 replacement 可以是函数而不是字符串.在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用.该函数的第一个参数是匹配模式的字符串.接下来的参数 ...