非常好的树剖模板题了,直接C颗线段树上去就好了,动态开点一次写对~

#pragma GCC opitmize("O3")
#pragma G++ opitmize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 100010
#define mid (l+r>>1)
using namespace std;
struct edge{ int v,nt; } G[200010];
struct nod{ int l,r,s,m; } s[3000010];
int h[N],sz[N],top[N],son[N],f[N],d[N];
int n,m,cnt=1,tot=0,clk=0,w[N],l[N],c[N],rt[N];
inline void gmax(int& x,int y){ x<y?x=y:0; }
inline void ps(nod& x){x.s=s[x.l].s+s[x.r].s;x.m=max(s[x.l].m,s[x.r].m);
}
inline void adj(int x,int y){ G[++cnt]=(edge){y,h[x]}; h[x]=cnt;G[++cnt]=(edge){x,h[y]}; h[y]=cnt;
}
void dfs(int x,int p){d[x]=d[p]+1; sz[x]=1; f[x]=p;for(int v,i=h[x];i;i=G[i].nt)if(!d[v=G[i].v]){dfs(v,x); sz[x]+=sz[v];if(sz[v]>sz[son[x]]) son[x]=v;}
}
void dgs(int x,int p){top[x]=p; l[x]=++clk;if(son[x]) dgs(son[x],p);for(int v,i=h[x];i;i=G[i].nt)if(!l[v=G[i].v]) dgs(v,v);
}
void insert(int l,int r,int& x,int p,int k){if(!x) x=++tot;if(l==r) { s[x].s=s[x].m=k; return; }if(p<=mid) insert(l,mid,s[x].l,p,k);else insert(mid+1,r,s[x].r,p,k);ps(s[x]);
}
void remove(int l,int r,int& x,int p){if(l==r){ x=0; return; }if(p<=mid) remove(l,mid,s[x].l,p);else remove(mid+1,r,s[x].r,p);if(s[x].l || s[x].r) ps(s[x]); else x=0;
}
void modify(int l,int r,int x,int p,int k){if(l==r){ s[x].s=s[x].m=k; return; }if(p<=mid) modify(l,mid,s[x].l,p,k);else modify(mid+1,r,s[x].r,p,k);ps(s[x]);
}
int queryS(int l,int r,int x,int L,int R){if(!x) return 0;if(L<=l && r<=R) return s[x].s;int ans=0;if(L<=mid) ans+=queryS(l,mid,s[x].l,L,R);if(mid<R) ans+=queryS(mid+1,r,s[x].r,L,R);return ans;
}
int gSum(int x,int y){int ans=0,C=c[x];for(;top[x]!=top[y];y=f[top[y]]){if(d[top[x]]>d[top[y]]) swap(x,y);ans+=queryS(1,n,rt[C],l[top[y]],l[y]);}if(d[x]>d[y]) swap(x,y);return ans+queryS(1,n,rt[C],l[x],l[y]);
}
int queryM(int l,int r,int x,int L,int R){if(!x) return 0;if(L<=l && r<=R) return s[x].m;int ans=0;if(L<=mid) gmax(ans,queryM(l,mid,s[x].l,L,R));if(mid<R) gmax(ans,queryM(mid+1,r,s[x].r,L,R));return ans;
}
int gMax(int x,int y){int ans=0,C=c[x];for(;top[x]!=top[y];y=f[top[y]]){if(d[top[x]]>d[top[y]]) swap(x,y);gmax(ans,queryM(1,n,rt[C],l[top[y]],l[y]));}if(d[x]>d[y]) swap(x,y);return max(ans,queryM(1,n,rt[C],l[x],l[y]));
}
int main(){freopen("travel.in","r",stdin);freopen("travel.out","w",stdout); scanf("%d%d",&n,&m);for(int i=1;i<=n;++i) scanf("%d%d",w+i,c+i);for(int x,y,i=1;i<n;++i) scanf("%d%d",&x,&y),adj(x,y); dfs(1,0); dgs(1,1); char o[3];for(int i=1;i<=n;++i) insert(1,n,rt[c[i]],l[i],w[i]);for(int x,y;m--;){scanf("%s%d%d",o,&x,&y);if(*o=='C'){if(o[1]=='C'){remove(1,n,rt[c[x]],l[x]);insert(1,n,rt[y],l[x],w[x]);c[x]=y;} else {modify(1,n,rt[c[x]],l[x],y);w[x]=y;}} else {if(o[1]=='S') printf("%d\n",gSum(x,y));else printf("%d\n",gMax(x,y));}}
}

转载于:https://www.cnblogs.com/Extended-Ash/p/9477168.html

Jzoj3625 旅行(travel)相关推荐

  1. 开车旅行 travel

    题目描述 JY J Y JY是一个爱旅游的探险家,也是一名强迫症患者.现在 JY J Y JY想要在 C C C国进行一次长途旅行,C国拥有n个城市(编号为0,1,2...,n−1" rol ...

  2. 旅行(travel)

    时间限制: 5 Sec 内存限制: 512 MB 题目描述 小R开车去C国旅行.C国所有n座城市构成一棵树,且树上的每条边的长度L_i满足1≤L_i≤2.小R打算白天开车,晚上到达一个城市后在该城市休 ...

  3. 哈里王子启动可持续旅行倡议 携程作为创始成员入选

    9月3日,荷兰阿姆斯特丹,携程旅行网作为全球旅游行业代表,受邀加入英国萨塞克斯公爵哈里王子发起的全球可持续旅行倡议:Travalyst.该倡议的名称取自英文中的旅行(Travel)与催化剂(Catal ...

  4. 【英语:语法基础】C6.日常对话-旅行专题

    旅行专题 1.交通出行类 2.旅行装备类 3.航空旅行 `Travel by Air` `Flight` 航班 办理登机 行李托运 中转 行李超重 选座 拿登机牌&告知登机口 航班延误 航班取 ...

  5. Test on 11/14/2016

    @kaike 第一题太简单我不想说什么 来说第二题. 1.小x的旅行   (travel.pas/c/cpp) [问题描述] 小x大学毕业后,进入了某个公司做了高层管理,他每年的任务就是检查这个公司在 ...

  6. Java编程基础10——面向对象_多态抽象类接口

    1.多态的概述及其成员访问特点代码体现 A:多态(polymorphic)概述 事物存在的多种形态 B:多态前提- 1.要有继承关系 2.要有方法重写 3.要有父类引用指向子类对象. C:多态中的成员 ...

  7. 自学成才翁_仅因为您是自学成才,并不意味着您必须独自学习。

    自学成才翁 by Piotr Bakker 皮特·巴克(Piotr Bakker) 仅因为您是自学成才,并不意味着您必须独自学习. (Just because you're self-taught d ...

  8. 新概念英语(第一册)复习(原文及全文翻译)——Lesson 111 - Lesson 130

    Lesson 111 The most expensive model [课文] MR.FRITH:I like this television very much. How much does it ...

  9. 环境资源与相关词汇中英文对照

    大气 ATMOSPHERE 大气组成 Atmospheric composition 空气质量 Air quality 大气化学 Atmospheric chemistry 大气成分 Atmosphe ...

最新文章

  1. 设计model层的理念和思路
  2. android 之ExpandableListView详解
  3. leetcode 318. Maximum Product of Word Lengths | 318. 最大单词长度乘积
  4. bootstrap.yml与application.properties区别?
  5. Java中的LinkedHashMap
  6. 前端学习(2818):小程序学习之新建页面
  7. ASP.NET MVC源码现在可以下载了(翻译)
  8. [转载] python之flask框架
  9. laravel连接mysql8_php – 如何使用laravel运行MySql 8?
  10. 板绘新手sai入门基础教程,非常详细全面!
  11. 一.用matlab生成想要的分布数据——均匀分布
  12. M/M/m排队模型 (单队列多服务台并联服务模型)数学建模: 基于生灭过程的理论计算和基于事件推进的Matlab模拟仿真思路
  13. Android HttpClient 与JSON解析
  14. Redis 基本命令和五大基础数据类型
  15. MATLAB理论力学应用
  16. pta中c语言编程问题答案,pta题库答案_浙大远程教育2015秋 程序设计基础C 求PTA实验代码题库liujiahai-C答案_淘题吧...
  17. 2023最新苹果CMS10魔加主题1.1.6去授权版+支持全部版本
  18. oracle如何新建用户
  19. mysql semi-sync(半同步复制)
  20. 基于屏幕空间渲染的液体模拟

热门文章

  1. 718保时捷spyder_我要买保时捷718 Spyder的原因:新手也可以玩手动
  2. 京东方网络推广外包将为三星提供OLED 屏幕可造成韩国显示产业动荡
  3. java jsp js xml_jsp实现将信息放入xml中的方法
  4. java 编写命令行工具_编写命令行工具
  5. mysql error manager,MYSQL Starting MySQL. ERROR! Manager of pid-file quit without updating file
  6. python matplotlib pyplot title_Matplotlib pyplot.title(字符串)返回
  7. 服务器跑python程序_远程编写+调试服务器上的Python程序
  8. 安卓ttf格式的字体包_苹果官网御用字体
  9. 开发日记-20190802 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 18
  10. github bilibili