/*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. 581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况

    [抄题]: Given an integer array, you need to find one continuous subarray that if you only sort this su ...

  2. Intent对象若干数据项的含义总结

    Intent作为组件之间通信的手段和协议,包含了诸如Action.Data.Type.Category.Component.Extras和Flags等数据项,各自拥有各自的含义和作用.当调用组件发出一 ...

  3. Luogu 2573 [SCOI2012]滑雪

    BZOJ 2753 首先可以按照题目要求的把所有的有向边建出来,然后进去广搜就可以求出第一问的解,然后考虑如何求解第二问,我们把所有搜到的边按照到达的点的高度位第一关键字,边的长度为第二关键字排序之后 ...

  4. rest-framework之序列化组件

    一:django自带序列化组件 Django内置的serializers(把对象序列化成json字符串) from django.core import serializers def test(re ...

  5. POJ1062 昂贵的聘礼(带限制的spfa)

    Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低 ...

  6. 博客迁移到http://pengliu.cf

    博客迁移到http://pengliu.cf

  7. C#ADO.NET基础二

    DataAdapter的使用,批量增删改 1.使用DataAdapter查询 private void Select2() { try { using (SQLiteConnection conn = ...

  8. Unite Shanghai 2019全日程曝光(建议收藏)

    https://mp.weixin.qq.com/s/KvAyXpDhqWROtTX1Ol3a4Q 5月10-12日,Unite Shanghai 2019即将在上海国际会议中心正式开幕.本次大会共设 ...

  9. bzoj1565【NOI2009】植物大战僵尸(最小割)

    题目描述 Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其中Plants防守,而Zombies进攻.该款游戏包含多 ...

  10. CentOS71611部署Django

    web.conf <VirtualHost *:> WSGIScriptAlias / /var/www/datacn/datacn/wsgi.py Alias /static/ /var ...