poj 3237

树剖+线段树。
刚开始想用记录该区域被NEGATE了几次,结果发现不可行,翻别人博客发现了原来维护最大值maxvmaxv和最小值minvminv,NEGATE就是maxv=−minv,minv=maxvmaxv=-minv, minv=maxv, 正确性显然。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i, j, k) for (i=(j);i<=(k);i++)
#define fd(i, k, j) for (i=(k);i>=(j);i--)
#define fe(i, u) for (i=head[u];i!=-1;i=e[i].next)
#define rd(a) scanf("%d", &a)
#define rd2(a, b) scanf("%d%d", &a, &b)
#define rd3(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define ms(i, j) memset(i, j, sizeof i)
#define FN2 "poj3237"
using namespace std;const int MAXN = 10000 + 5, INF = 200000000;struct data{int to, next;}e[MAXN*2];
int n, wi[MAXN], ai[MAXN], bi[MAXN], head[MAXN], cnt;
int p[MAXN], top[MAXN], son[MAXN], dep[MAXN], fa[MAXN], siz[MAXN];
int pre;
void dfs1(int u, int pa) {int i;dep[u] = dep[pa] + 1, fa[u] = pa, siz[u] = 1;fe (i, u) {int v = e[i].to;if (v!=pa) {dfs1(v, u);siz[u] += siz[v];if (son[u]==-1||siz[son[u]]<siz[v]) son[u] = v;}}
}
void dfs2(int u, int chain) {int i;p[u] = ++pre, top[u] = chain;if (son[u]!=-1) {dfs2(son[u], chain);fe (i, u) {int v = e[i].to;if (v!=fa[u]&&v!=son[u]) dfs2(v, v);}}
}
#define lc (o<<1)
#define rc (o<<1|1)
#define M ((l+r)>>1)
int maxv[MAXN*4], minv[MAXN*4], lazy[MAXN*4];
void proc(int &a, int &b) {int t = a; a = -b, b = -t;}
void pushup(int o) {maxv[o] = max(maxv[lc], maxv[rc]);minv[o] = min(minv[lc], minv[rc]);
}
void pushdown(int o, int l, int r) {if (l==r) return ;if (lazy[o]) {lazy[lc] ^= 1, lazy[rc] ^= 1;proc(maxv[lc], minv[lc]), proc(maxv[rc], minv[rc]);lazy[o] = 0;}
}
void update(int o, int l, int r, int p, int v) {pushdown(o, l, r);if (l==r) {maxv[o] = minv[o] = v;return ;}if (p<=M) update(lc,l,M,p,v); else if (M<p) update(rc,M+1,r,p,v);pushup(o);
}
void ngt(int o, int l, int r, int x, int y) {pushdown(o, l, r);if (x<=l&&r<=y) {proc(maxv[o], minv[o]);lazy[o] = 1;return ;}if (x<=M) ngt(lc,l,M,x,y); if (M<y)  ngt(rc,M+1,r,x,y);pushup(o);
}
int query(int o, int l, int r, int x, int y) {pushdown(o, l, r);int ret = -INF;if (x<=l&&r<=y) return maxv[o];if (x<=M) ret=max(ret,query(lc,l,M,x,y)); if (M<y)  ret=max(ret,query(rc,M+1,r,x,y));return ret;
}
void tongt(int u, int v) {int f1 = top[u], f2 = top[v];while (f1!=f2) {if (dep[f1]<dep[f2]) swap(f1, f2), swap(u, v);ngt(1,1,n,p[f1], p[u]);u = fa[f1], f1 = top[u];}if (dep[u]<dep[v]) swap(u, v);ngt(1,1,n,p[v]+1, p[u]);
}
int toget(int u, int v) {int f1 = top[u], f2 = top[v], ret = -INF;while (f1!=f2) {if (dep[f1]<dep[f2]) swap(f1, f2), swap(u, v);ret = max(ret, query(1,1,n,p[f1], p[u]));u = fa[f1], f1 = top[u];}if (dep[u]<dep[v]) swap(u, v);return max(ret, query(1,1,n,p[v]+1, p[u]));
}
void ins(int u, int v) {cnt++; e[cnt].to = v, e[cnt].next = head[u], head[u] = cnt;cnt++; e[cnt].to = u, e[cnt].next = head[v], head[v] = cnt;
}
void init() {int i; rd(n); cnt = pre = 0;fo (i, 1, n) head[i] = -1, p[i] = 0, top[i] = 0, son[i] = -1, dep[i] = 0, fa[i] = 0, siz[i] = 0;fo (i, 1, n*2) e[i].to = 0, e[i].next = -1;fo (i, 1, n*4) maxv[i] = -INF, minv[i] = INF, lazy[i] = 0;fo (i, 1, n-1) {rd3(ai[i], bi[i], wi[i]);ins(ai[i],bi[i]);}
}
void solve() {int i;dfs1(1, 0), dfs2(1, 1);fo (i, 1, n-1) {int a1 = ai[i], b1 = bi[i];if (dep[a1]>dep[b1]) update(1,1,n, p[a1], wi[i]);if (dep[a1]<dep[b1]) update(1,1,n, p[b1], wi[i]);}char ch[10];while (1) {scanf("%s", ch);if (ch[0]=='D') break;if (ch[0]=='C') {int x, v; rd2(x, v);int a1 = ai[x], b1 = bi[x];if (dep[a1]>dep[b1]) update(1,1,n, p[a1], v);if (dep[a1]<dep[b1]) update(1,1,n, p[b1], v);}if (ch[0]=='N') {int u, v; rd2(u, v);tongt(u, v);} if (ch[0]=='Q') {int u, v; rd2(u, v);printf("%d\n", toget(u, v));} }
}
int main() {#ifndef ONLINE_JUDGEfreopen(FN2".in","r",stdin);freopen(FN2".out","w",stdout);#endifint t; rd(t);while (t--) init(), solve();return 0;
}

一个很弱的数据:

input:
112
1 2 6
2 3 7
3 4 1
3 5 -4
5 6 -3
1 7 2
7 8 3
7 9 6
7 10 7
9 11 -1
11 12 4
QUERY 6 12
CHANGE 2 10
QUERY 6 12
NEGATE 5 2
QUERY 6 12
CHANGE 4 10
QUERY 6 12
NEGATE 8 10
QUERY 6 12
DONEoutput:
7
10
6
10
10

|poj 3237|树链剖分|线段树|Tree相关推荐

  1. CodeForces - 609E Minimum spanning tree for each edge(最小生成树+树链剖分+线段树/树上倍增)

    题目链接:点击查看 题目大意:给出一张 n 个点和 m 条边组成的无向图,现在询问包含每一条边的最小生成树 题目分析:考虑求解次小生成树的思路: 求出最小生成树 ans 枚举每一条非树边 ( u , ...

  2. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MB Submit: 1153  Solved: 421 [Submit][Sta ...

  3. CodeForces - 160D Edges in MST(思维+tarjan/树链剖分+线段树)

    题目链接:点击查看 题目大意:给出一张 n 个点 m 条边组成的带权无向图,现在对于每条边来说,确定一下其分类: 一定是最小生成树上的边 可能是最小生成树上的边 一定不是最小生成树的边 题目分析:两种 ...

  4. BZOJ3862Little Devil I——树链剖分+线段树

    题目大意: 给一棵树,每条边可能是黑色或白色(起始都是白色),有三种操作: 1.将u到v路径上所有边颜色翻转(黑->白,白->黑) 2.将只有一个点在u到v路径上的边颜色翻转 3.查询u到 ...

  5. P2486 [SDOI2011]染色(树链剖分+线段树)

    题干描述 输入描述 输出格式 对于每个询问操作,输出一行答案. 输入输出样例 输入 #1 复制 6 5 2 2 1 2 1 1 1 2 1 3 2 4 2 5 2 6 Q 3 5 C 2 1 1 Q ...

  6. BZOJ4127Abs——树链剖分+线段树

    题目描述 给定一棵树,设计数据结构支持以下操作 1 u v d 表示将路径 (u,v) 加d 2 u v 表示询问路径 (u,v) 上点权绝对值的和 输入 第一行两个整数n和m,表示结点个数和操作数 ...

  7. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

  8. HDU 2460 Network(双连通+树链剖分+线段树)

    HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...

  9. BZOJ2325[ZJOI2011]道馆之战——树链剖分+线段树

    题目描述 口袋妖怪(又名神奇宝贝或宠物小精灵)红/蓝/绿宝石中的水系道馆需要经过三个冰地才能到达馆主的面前,冰地中 的每一个冰块都只能经过一次.当一个冰地上的所有冰块都被经过之后,到下一个冰地的楼梯才 ...

  10. YbtOJ-染色计划【树链剖分,线段树,tarjan】

    正题 题目大意 给出nnn个点的一棵树,每个点有个颜色aia_iai​,你每次可以选择一个颜色全部变成另一个颜色. 求最少多少次操作可以把一种颜色变成一个完整的连通块. 1≤k≤n≤2×1051\le ...

最新文章

  1. (0095)iOS开发之本地文件预览的三种方法(3)
  2. Chrome 的又一个bug?
  3. mysql 单表查询
  4. Node.js 切近实战(八) 之Excel在线(文件权限)
  5. Codeforces Round 261 Div.2 D Pashmak and Parmida's problem --树状数组
  6. 仿射组合(Affine Combination)的定义与性质
  7. matlab电气教程下载,Matlab 2020b介绍及下载安装步骤
  8. 小波去噪程序c语言,else - 小波去噪c语言程序
  9. 傲梅分区助手损害大吗_【分区助手技术员v9.00】磁盘分区工具,很好用!
  10. PHP 开源 ERP 系统 Discover
  11. 计算机显卡更新,电脑显卡升级,教您显卡怎么升级
  12. Hadoop之MapReduce02【自定义wordcount案例】
  13. 修真院教学模式三大阶段之任务体系
  14. 专访|带着问题去学习,Apache DolphinScheduler 王福政
  15. webshell一句话
  16. 2020年网络搭建与应用国赛题-防火墙ipsec建立分解
  17. 【数据结构】使用队列实现循环调度法
  18. 每日一题-59(查询活跃业务)
  19. 腾讯高工保姆级“Java成长手册”,层层递进,全是精华!Github上都没有!
  20. 如何利用长尾关键词挖掘推广口红?

热门文章

  1. 属牛的女孩取名:优美文雅、声声入耳的女孩名字
  2. PowerVR SDK 2020 Release 2发布:多处更新优化,性能更强大
  3. 专科三年的教训,写给自己,也给正在学习路上的你
  4. java游戏魔界村_魔界村(附秘籍)游戏下载-魔界村游戏最新版v2.0-爱单机
  5. Redis Client 之 Jedis与Lettuce
  6. Python学习Day01
  7. 第12课:(2)线性回归建模实验
  8. PocketPC常用程序和设置打开命令参数列表
  9. 跨境物流主要流程是什么样?
  10. (转载)Windows文件系统过滤驱动开发教程