就是简单的树链剖分,但标记下传的时候一定要 ^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. 深入探讨this指针

    深入探讨this指针   为了写这篇文章,准备了好长时间,翻遍了箱底的书籍.可是如今还是不敢放开手来写,战战兢兢.不是操心自己写错,而是唯恐自己错误误导别人.同一时候也希望这篇文章能给你一点收获.既然 ...

  2. Swift3.0语法变化

    写在前面 首先和大家分享一下学习新语法的技巧:用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Syntax- 让Xcod ...

  3. cocos2dx 3.1从零学习(一)——入门篇(一天学会打飞机)

    没办法,浏览这么高,为啥没人投票呢?朋友们,我这篇文章參加了csdn博文大赛.喜欢的来点个赞吧!点击:http://vote.blog.csdn.net/Article/Details?article ...

  4. 阿里技术嘉年华(ADC2013)总结与感悟

           上周末刚参加了ADC2013(2013.7.13-14),我报的是TCon测试论坛和UCAN用户体验设计论坛,因为我目前从事的是测试工作,但是还是想往用户体验(主要是用研)方向发展,所以 ...

  5. jsonp跨域原理解析

    前言: 跨域请求是前台开发中经常遇到的场景,但是由于浏览器同源策略,导致A域下普通的http请求没法加载B域下的数据,跨域问题由此产生.但是通过script标签的方式却可以加载非同域下的js,因此可以 ...

  6. SQL SERVER 中identity用法

    在数据库中, 常用的一个流水编号通常会使用 identity 栏位来进行设置, 这种编号的好处是一定不会重覆, 而且一定是唯一的, 这对table中的唯一值特性很重要, 通常用来做客户编号, 订单编号 ...

  7. Spark_Api_图解

  8. android Button 切换背景,实现动态按钮和按钮颜色渐变

        android Button 切换背景,实现动态按钮和按钮颜色渐变 一.添加android 背景筛选器selector实现按钮背景改变     1.右键单击项目->new->Oth ...

  9. Message Decoding

    Some message encoding schemes require that an encoded message be sent in two parts. The first part, ...

  10. akw、grep、sed常用命令

    awk 求和 cat data|awk '{sum+=$1} END {print "Sum = ", sum}' 平均值 cat data|awk '{sum+=$1} END ...