题目传送门

题目大意:给定一棵无根树,每个节点有自己的类别和权值,现在给定两个类别相同的点,叫你求这2点路径上同类别节点的权值和/最大权值。

节点类别与权值会改变。

解题思路:考虑对每一个类别开一棵线段树,动态开点,可以写指针,也可以开数组写链表,然后剩下的就是树剖的东西了。我写的是指针,跑的略慢一些,时间效率为\( O(q \log^{2} n) \).

代码由于是在自家的mac上码的,所以和以前风格不大一样。

 #include <stdio.h>
#define MN 100005
inline void swp(int &a,int &b){a ^= b ^= a ^= b;}
inline int max(int a,int b){return a > b ? a : b;}
inline int in(){
int x = ,f = ; char ch = getchar();
while (ch < '' || ch > '') f = ch=='-' ? - : , ch = getchar();
while (ch >= '' && ch <= '' ) x = (x<<) + (x<<) + ch - '',ch = getchar();
return x*f;
}
struct segment_tree{
segment_tree *ls , *rs;
int sum,ma;
void combine(){
sum = ma = ;
if (ls != NULL){
sum += ls -> sum;
ma = max( ma , ls -> ma );
}if (rs != NULL){
sum += rs -> sum;
ma = max( ma , rs -> ma );
}
}
segment_tree (int sum=,int ma=):sum(sum),ma(ma){ls = rs = NULL;}
}*ST[MN];
#define S_T segment_tree
int to[MN<<],nxt[MN<<],cnt,head[MN];
int n,q,top[MN],siz[MN],son[MN],val[MN],belief[MN],fa[MN],dep[MN],pos[MN],dfsn;
inline void ins(int x,int y){to[++cnt] = y , nxt[cnt] = head[x] , head[x] = cnt;}
inline void insw(int x,int y){ins(x,y); ins(y,x);}
inline void dfs1(int u,int f,int d){
siz[u] = ; dep[u] = d; fa[u] = f;
for (register int i = head[u]; i; i = nxt[i])
if (to[i] != f) {
dfs1(to[i],u,d+); siz[u] += siz[to[i]];
if (siz[son[u]] < siz[to[i]]) son[u] = to[i];
}
}
inline void dfs2(int u,int tp){
top[u] = tp; pos[u] = (++dfsn); if (son[u]) dfs2(son[u],tp);
for (register int i = head[u]; i; i = nxt[i])
if (to[i] != fa[u] && to[i] != son[u]) dfs2(to[i],to[i]);
}
#define mid (l+r>>1)
inline void insert(S_T* &x,int l,int r,int pos,int val){
if (x == NULL) x = new S_T;
if (l == r){x -> sum = x -> ma = val; return;}
if (pos <= mid) insert(x -> ls,l,mid,pos,val);
else insert(x -> rs,mid+,r,pos,val);x->combine();
}
inline void Delete(S_T* &x,int l,int r,int pos){
if (l==r){delete x; x = NULL; return; }
if (pos<=mid) Delete(x -> ls,l,mid,pos);
else Delete(x -> rs,mid+,r,pos);
if (x -> ls == NULL && x -> rs == NULL){delete x; x = NULL; return; }
else x -> combine();
}
inline int QM(S_T* &x,int l,int r,int a,int b){
if (x == NULL) return ;
if (l == a && r == b) return x -> ma;
if (b<=mid) return QM(x -> ls,l,mid,a,b);
if (a>mid) return QM(x -> rs,mid+,r,a,b);
return max(QM(x -> ls,l,mid,a,mid),QM(x -> rs,mid+,r,mid+,b));
}
inline int QS(S_T* &x,int l,int r,int a,int b){
if (x == NULL) return ;
if (l == a && r == b) return x -> sum;
if (b<=mid) return QS(x -> ls,l,mid,a,b);
if (a>mid) return QS(x -> rs,mid+,r,a,b);
return QS(x -> ls,l,mid,a,mid)+QS(x -> rs,mid+,r,mid+,b);
}
inline int qm(int belief,int x,int y){
register int res = ;
while (top[x] != top[y]){
if (dep[top[x]] < dep[top[y]]) swp(x,y);
res = max(res,QM(ST[belief],,n,pos[top[x]],pos[x]));
x = fa[top[x]];
}if (dep[x] > dep[y]) swp(x,y);res = max(res,QM(ST[belief],,n,pos[x],pos[y]));
return res;
}
inline int qs(int belief,int x,int y){
register int res = ;
while (top[x] != top[y]){
if (dep[top[x]] < dep[top[y]]) swp(x,y);
res += QS(ST[belief],,n,pos[top[x]],pos[x]);
x = fa[top[x]];
}if (dep[x] > dep[y]) swp(x,y);res += QS(ST[belief],,n,pos[x],pos[y]);
return res;
}
void init(){
n = in() , q = in();
for (int i = ; i <= n; ++i) val[i] = in() , belief[i] = in();
for (register int i = ; i < n; ++i) insw(in(),in());
dfs1(,,);dfs2(,);
for (register int i = ; i <= n; ++i)
insert(ST[belief[i]],,n,pos[i],val[i]);
}
void solve(){
while(q--){
register char op[]; scanf("%s",op);
register int x=in(),y=in();
if (op[] == 'C'){
if (op[] == 'C'){
Delete(ST[belief[x]],,n,pos[x]);
insert(ST[belief[x] = y],,n,pos[x],val[x]);
}else insert(ST[belief[x]],,n,pos[x],val[x]=y);
}else{
if (op[] == 'M') printf("%d\n",qm(belief[x],x,y));
else printf("%d\n",qs(belief[x],x,y));
}
}
}
int main(){ init(); solve();}

【BZOJ3531】【SDOI2014】旅行的更多相关文章

  1. Bzoj3531: [Sdoi2014]旅行

    Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1698  Solved: 758 Description S国有N个城市,编号从1到N.城市间用N-1 ...

  2. BZOJ3531 [Sdoi2014]旅行 树链剖分 线段树

    原文链接:http://www.cnblogs.com/zhouzhendong/p/8080189.html 题目传送门 - BZOJ3531 题意概括 一棵树,n个节点,每一个节点两个值,一个颜色 ...

  3. BZOJ3531[Sdoi2014]旅行——树链剖分+线段树

    题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们 ...

  4. BZOJ3531:[SDOI2014]旅行(树链剖分)

    Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰 ...

  5. BZOJ3531 [Sdoi2014]旅行 【树剖 + 线段树】

    题目 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们用 ...

  6. [bzoj3531][Sdoi2014][旅行] (主席树+树链剖分)

    Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰. ...

  7. 2018.07.24 bzoj3531: [Sdoi2014]旅行(树链剖分+动态开点)

    传送门 树链剖分. 如何维护? 如果颜色少直接每种颜色一颗线段树走人. 但这题颜色数量不大于1e5" role="presentation" style="po ...

  8. 【块状树】【树链剖分】【线段树】bzoj3531 [Sdoi2014]旅行

    离线后以宗教为第一关键字,操作时间为第二关键字排序. <法一>块状树,线下ac,线上tle…… #include<cstdio> #include<cmath> # ...

  9. BZOJ3531 SDOI2014 旅行 - 树链剖分,主席树

    题意:给定一棵树,树上每个点有权值和类型.支持:修改某个点的类型:修改某个点的权值:询问某条链上某个类型的点的和/最大值.点数/类型数/询问数<=100000. 分析: 树链剖分,对每个类型的点 ...

  10. bzoj3531: [Sdoi2014]旅行 (树链剖分 && 动态开点线段树)

    感觉动态开点线段树空间复杂度好优秀呀 树剖裸题 把每个宗教都开一颗线段树就可以了 但是我一直TLE 然后调了一个小时 为什么呢 因为我 #define max(x, y) (x > y ? x ...

随机推荐

  1. linux系统增加开机启动服务/应用

    操作 在/etc/init.d下新建示例脚本文件(customize.sh),该脚本会启动zookeeper服务.内容如下: #!/bin/sh /usr/local/zookeeper-/bin/z ...

  2. Entity Framework Core Code First

    参考地址:https://docs.microsoft.com/zh-cn/ef/core/get-started/aspnetcore/new-db

  3. javaScript识别网址文本并转为链接文本

    最近项目有个需求:用户之间发送消息时,如果发送者输入的信息中含有网址文本,要在接受者界面中显示网址链接,点击该链接直接跳转到网页.这个功能和 QQ 发送网址文本的效果非常像,可以说是一模一样的. 思路 ...

  4. c# BinaryWriter 和 BinaryReader

    string path = @"C:\Users\Administrator\Desktop\1.txt"; using (FileStream ws = new FileStre ...

  5. Python-基础学习-Day1

    1 Python介绍 1.1 Python 是一门什么样的语言? python是一门动态解释性的强类型定义语言. 编译型的特点:可一致性差,运行速度快. 解释型的特点:边执行边解释,速度慢 1.2 P ...

  6. Spring Data Jpa简单了解

    原文来源:http://www.cnblogs.com/xuyuanjia/p/5707681.html 以下是自己简单整理原有文章,其实就是在原来文章基础上化重点以及可能会有所删减的方式进行整理,需 ...

  7. 南京邮电大学java程序设计作业在线编程第三次作业

    王利国的"Java语言程序设计第3次作业(2018)"详细 作业结果详细 总分:100 选择题得分:60  1. 设有如下定义语句: String s1="My cat& ...

  8. hdu2674 N!Again---思维

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2674 题目大意: 求n!%2009的值 思路: 由于模2009,所以大于等于2009的直接为0,前2 ...

  9. 解决:My97DatePicker 日期插件引用在PHP文件中maxDate和minDate控制失效问题

    开发环境: 语言:PHP 框架:ThinkPHP 问题:在引用插件My97DatePicker时,想实现:开始日期不能大于结束日期,结束时间不能小于开始时间 步骤一.查看文档官方文档http://ww ...

  10. 学习linux的一些指令

    简单说一下我对linux的理解,linux只有一个根目录,所有目录都挂在该根目录上,磁盘进行分区,然后生成文件系统,挂到目录上,/etc/fstab用于记录系统配置,比如分区挂载点,开机自动挂载等等. ...