poj 3237 Tree
就是简单的树链剖分,但标记下传的时候一定要 ^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的更多相关文章
- poj 3237 Tree [LCA] (树链剖分)
poj 3237 tree inline : 1. inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高. 2. 很明显,类 ...
- poj 3237 Tree(树链拆分)
题目链接:poj 3237 Tree 题目大意:给定一棵树,三种操作: CHANGE i v:将i节点权值变为v NEGATE a b:将ab路径上全部节点的权值变为相反数 QUERY a b:查询a ...
- poj 3237 Tree 树链剖分
题目链接:http://poj.org/problem?id=3237 You are given a tree with N nodes. The tree’s nodes are numbered ...
- POJ 3237 Tree (树链剖分 路径剖分 线段树的lazy标记)
题目链接:http://poj.org/problem?id=3237 一棵有边权的树,有3种操作. 树链剖分+线段树lazy标记.lazy为0表示没更新区间或者区间更新了2的倍数次,1表示为更新,每 ...
- poj 3237 Tree(树链剖分,线段树)
Tree Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 7268 Accepted: 1969 Description ...
- ●POJ 3237 Tree
题链: http://poj.org/problem?id=3237 题解: LCT 说一说如何完成询问操作就好了(把一条链的边权变成相反数的操作可以类比着来): 首先明确一下,我们把边权下放到点上. ...
- POJ 3237 Tree (树链剖分)
Tree Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 2825 Accepted: 769 Description ...
- POJ 3237.Tree -树链剖分(边权)(边值更新、路径边权最值、区间标记)贴个板子备忘
Tree Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 12247 Accepted: 3151 Descriptio ...
- poj 3237 Tree 树链剖分+线段树
Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...
- POJ 3237 Tree 【树链剖分】+【线段树】
<题目链接> 题目大意: 给定一棵树,该树带有边权,现在对该树进行三种操作: 一:改变指定编号边的边权: 二:对树上指定路径的边权全部取反: 三:查询树上指定路径的最大边权值. 解题分析: ...
随机推荐
- 04.URL路径访问与模块控制器之间的关系
<?php //初使化,进行加载. //通过这个英文名来了解,他是定义的与thinkphp有关的核心框架文件目录路径 //他可以通过这一个常量,在以后运行的时候都去找这个路径,确保在运行过程当, ...
- android 多语言版本开发
最近项目中用用到语言切换功能,第一想到的就是资源文件,没错. 在资源文件中新建一个文件夹values-en,en表示英语,有一些还细化到地区,如values-en-rUS 即美国地区的英语,r是必需的 ...
- 网络IPC:套接字之寻址
在学习用套接字做一些有意义的事情之前,需要知道如何确定一个目标通信进程. 进程的标识有两个部分:计算机的网络地址可以帮助标识网络上想与之通信的计算机,而服务可以帮助标识计算机上特定的进程. 1.字节序 ...
- bash的for循环从命令读取值
bash的for循环可以很方便地从命令读取值,还可以指定分割值 下面的程序可以打印文件的内容,前面加上行号 #!/bin/bash # 打印每一行的内容,前面加行号 filename="/h ...
- python 实现接口测试
接口的类型有很多,但是我们经常遇见经常用的就get和post两种.这两种有什么区别呢?个人理解主要是表现在安全性方面. Python代码POST任意的HTTP数据以及使用Cookie的方法,有需要的朋 ...
- Web Navigation
Description Standard web browsers contain features to move backward and forward among the pages rece ...
- [JavaEE,MVC] Struts工作原理
基本概念 Struts是Apache 基金会Jakarta 项目组的一个Open Source 项目,它采用MVC模式,能够很好地帮助java 开发者利用J2EE开发Web应用.和其他的java架构一 ...
- ie6双边距bug及其解决办法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- find & rm
1)查找并删除3天前的历史文件 rm -rfi `find /tmp/ -ctime 3` 2)按分钟查找 find -cmin N
- 安装Laravel之坎坷记述
写这篇文章记录以及分享我安装Laravel框架的一些经验 过程如下: 1.按照官方的描述,第一步是先安装composer来管理依赖=>composer下载传送门 下载之后点击安装,按照提示它需要 ...