/*H E A D*/
int from[maxn<<1],to[maxn<<1],nxt[maxn<<1],cost[maxn<<1],head[maxn],tot;
int size[maxn],fa[maxn],depth[maxn],top[maxn],son[maxn],dfn[maxn],pre[maxn],tot2;
void init(){
memset(head,-1,sizeof head);
memset(son,0,sizeof son);
memset(size,0,sizeof size);
memset(fa,0,sizeof fa);
tot=tot2=0;
}
void add(int u,int v,int w=0){
from[tot]=u;to[tot]=v;nxt[tot]=head[u];cost[tot]=w;
head[u]=tot++;
swap(u,v);
from[tot]=u;to[tot]=v;nxt[tot]=head[u];cost[tot]=w;
head[u]=tot++;
}
void dfs(int u,int p,int d){
size[u]=1;fa[u]=p;depth[u]=d;
erep(i,u){
int v=to[i];
if(v==p)continue;
dfs(v,u,d+1);
size[u]+=size[v];
if(size[v]>size[son[u]]){//update
son[u]=v;
}
}
}
void dfs2(int u,int tp){
pre[++tot2]=u;
dfn[u]=tot2;
top[u]=tp;
if(son[u]) dfs2(son[u],tp);//heavy --- ori top
erep(i,u){
int v=to[i];
if(v==son[u]||v==fa[u])continue;
dfs2(v,v);//light --- themselves
}
}
int val[maxn<<2];
struct ST{
int sum[maxn<<2],mx[maxn<<2],mn[maxn<<2];
bool rev[maxn<<2];
#define lc o<<1
#define rc o<<1|1
void pu(int o){
sum[o]=sum[lc]+sum[rc];
mx[o]=max(mx[lc],mx[rc]);
mn[o]=min(mn[lc],mn[rc]);
}
void pd(int o){
if(rev[o]){
sum[lc]=-sum[lc];mx[lc]=-mx[lc];mn[lc]=-mn[lc];
swap(mx[lc],mn[lc]);
sum[rc]=-sum[rc];mx[rc]=-mx[rc];mn[rc]=-mn[rc];
swap(mx[rc],mn[rc]);
rev[lc]^=1;
rev[rc]^=1;
rev[o]=0;
}
}
void build(int o,int l,int r){
rev[o]=0;mx[o]=-oo;mn[o]=oo;
if(l==r){
sum[o]=mx[o]=mn[o]=val[pre[l]];//note
return;
}
int m=l+r>>1;
build(lc,l,m);
build(rc,m+1,r);
pu(o);
}
void update(int o,int l,int r,int k,int v){
if(l==r){
sum[o]=mx[o]=mn[o]=v;
return;
}
pd(o);
int m=l+r>>1;
if(k<=m) update(lc,l,m,k,v);
else update(rc,m+1,r,k,v);
pu(o);
}
void flip(int o,int l,int r,int L,int R){
if(L<=l&&r<=R){
rev[o]^=1;
sum[o]=-sum[o];
mx[o]=-mx[o];
mn[o]=-mn[o];
swap(mx[o],mn[o]);
return;
}
pd(o);
int m=l+r>>1;
if(L<=m) flip(lc,l,m,L,R);
if(R>m) flip(rc,m+1,r,L,R);
pu(o);
}
int query(int o,int l,int r,int L,int R,int op){
if(L<=l&&r<=R){
switch(op){
case 1: return sum[o];
case 2: return mx[o];
case 3: return mn[o];
}
}
pd(o);
int m=l+r>>1;
int ans;
if(op==1){
ans=0;
if(L<=m) ans+=query(lc,l,m,L,R,op);
if(R>m) ans+=query(rc,m+1,r,L,R,op);
}
else if(op==2){
ans=-oo;
if(L<=m) ans=max(query(lc,l,m,L,R,op),ans);
if(R>m) ans=max(query(rc,m+1,r,L,R,op),ans);
}
else{
ans=oo;
if(L<=m) ans=min(query(lc,l,m,L,R,op),ans);
if(R>m) ans=min(query(rc,m+1,r,L,R,op),ans);
}
return ans;
}
}st;
char str[555];
void solve(){
int l,r,p1,p2,sum=0,mx=-oo,mn=oo;
l=read();r=read();l++;r++;
p1=top[l];p2=top[r];
while(p1!=p2){
if(depth[p1]<depth[p2]){
swap(p1,p2);
swap(l,r);
}
if(str[0]=='N') st.flip(1,1,tot2,dfn[p1],dfn[l]);
else if(str[0]=='S') sum+=st.query(1,1,tot2,dfn[p1],dfn[l],1);
else if(str[1]=='I') mn=min(mn,st.query(1,1,tot2,dfn[p1],dfn[l],3));
else if(str[1]=='A') mx=max(mx,st.query(1,1,tot2,dfn[p1],dfn[l],2));
l=fa[p1];
p1=top[l];
}
if(depth[l]>depth[r]) swap(l,r);
if(l==r){
// if(str[0]=='N') st.flip(1,1,tot2,dfn[l],dfn[r]); //!WrongAnswer
if(str[0]=='S') println(sum);
else if(str[1]=='I') println(mn);
else if(str[1]=='A') println(mx);
}
else{
l=son[l];
if(str[0]=='N'){
st.flip(1,1,tot2,dfn[l],dfn[r]);
}
else if(str[0]=='S'){
sum+=st.query(1,1,tot2,dfn[l],dfn[r],1);
println(sum);
}
else if(str[1]=='I'){
mn=min(mn,st.query(1,1,tot2,dfn[l],dfn[r],3));
println(mn);
}
else if(str[1]=='A'){
mx=max(mx,st.query(1,1,tot2,dfn[l],dfn[r],2));
println(mx);
}
}
}
int main(){
int n,u,v,w,x,y;
while(~iin(n)){
init();
rep(i,1,n-1){
u=read();v=read();w=read();
u++;v++;
add(u,v,w);
}
dfs(1,0,1);
dfs2(1,1);
rep(i,0,tot-1){
if(depth[from[i]]>depth[to[i]]){//
swap(from[i],to[i]);
}
val[to[i]]=cost[i];
}
st.build(1,1,tot2);
int m=read();
rep(i,1,m){
s0(str);
if(str[0]=='C'){
x=read();y=read();
st.update(1,1,tot2,dfn[to[(x-1)<<1]],y);//note bridgeNum->edgeNum
}
else solve();
}
}
return 0;
}

BZOJ - 2157 树链剖分+线段树的更多相关文章

  1. bzoj 2157: 旅游【树链剖分+线段树】

    裸的树链剖分+线段树 但是要注意一个地方--我WA了好几次才发现取完相反数之后max值和min值是要交换的-- #include<iostream> #include<cstdio& ...

  2. BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )

    BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...

  3. BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)

    BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...

  4. BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)

    前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f( ...

  5. bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2852  Solved: 1668[Submit][Sta ...

  6. BZOJ 3589 动态树 (树链剖分+线段树)

    前言 众所周知,90%90\%90%的题目与解法毫无关系. 题意 有一棵有根树,两种操作.一种是子树内每一个点的权值加上一个同一个数,另一种是查询多条路径的并的点权之和. 分析 很容易看出是树链剖分+ ...

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

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

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

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

  9. BZOJ2243 (树链剖分+线段树)

    Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...

  10. POJ3237 (树链剖分+线段树)

    Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...

随机推荐

  1. 10.IN 操作符

    IN 操作符 IN 操作符允许我们在 WHERE 子句中规定多个值. SQL IN 语法 SELECT column_name(s) FROM table_name WHERE column_name ...

  2. CF835F Roads in the Kingdom

    话说这是去年大爷的一道NOIP模拟赛题,对着大爷的代码看了一堂课的我终于把这题写掉了. 本题要求在基环树给定的环上删去一条边使剩下的树的直径最小,输出这个最小直径. 那么基环树可以画成这样子的: 有一 ...

  3. redirect_uri域名与后台配置不一致,错误码:10003

    登录公众平台,重新配置下网页授权域名就可以了 参考https://blog.csdn.net/haoxuexiaolang/article/details/79432073

  4. Part5核心初始化_lesson4---关闭mmu

    1.ARM存储体系 2.cache 3.虚拟地址 那么谁来完成把虚拟地址转换成物理地址呢? 4.这个工作就由MMU来转换!! 5.关闭MMU和cache 他们都是通过cp15协处理器来控制的!应该在A ...

  5. hdu 4678 Mine

    HDU 4678 把点开空地时会打开的一大片区域看成一块,题目中说到,在一盘游戏 中,一个格子不可能被翻开两次,说明任意两块空地不会包含相同的格子. 那么就可以看成一个组合游戏. 当空地旁边没连任何数 ...

  6. (转)那天有个小孩教我WCF[一][1/3]

    原文地址:http://www.cnblogs.com/AaronYang/p/2950931.html 既然是小孩系列,当然要有一点基础才能快速掌握,归纳,总结的一个系列,哈哈 前言: 第一篇嘛,不 ...

  7. MongoDB整理笔记の安装及配置

    1.官网下载 地址:http://www.mongodb.org/downloads mongodb-linux-x86_64-2.4.9.tgz (目前为止,64位最新版本) 2.解压 切换到下载目 ...

  8. 使用JS完成首页定时弹出广告图片

    一.需求分析 在首页中的顶部做一个定时弹出广告图片. 二.技术分析 隐藏图片: display: none        定时操作: setInterval(“显示图片的函数”, 3000); 三.代 ...

  9. GitHub小技巧-定义项目语言

    GitHub是根据项目里文件数目最多的文件类型,识别项目类型.后端项目难免会包含前端的资源,有时候就会被标记成前端语言,因为项目里 css 等文件比较多, 被误识别成css项目. GitHub不提供指 ...

  10. c# as与is的区别

    在c#语言中关于类型的判断与转换有is和as这2种操作符,具体用法如下: is检查一个对象是否兼任与指定的类型,并返回一个Boolean值:true或false,主要,is操作符永远不会抛出异常,一下 ...