【BZOJ3531】【SDOI2014】旅行
题目大意:给定一棵无根树,每个节点有自己的类别和权值,现在给定两个类别相同的点,叫你求这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】旅行的更多相关文章
- Bzoj3531: [Sdoi2014]旅行
Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1698 Solved: 758 Description S国有N个城市,编号从1到N.城市间用N-1 ...
- BZOJ3531 [Sdoi2014]旅行 树链剖分 线段树
原文链接:http://www.cnblogs.com/zhouzhendong/p/8080189.html 题目传送门 - BZOJ3531 题意概括 一棵树,n个节点,每一个节点两个值,一个颜色 ...
- BZOJ3531[Sdoi2014]旅行——树链剖分+线段树
题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们 ...
- BZOJ3531:[SDOI2014]旅行(树链剖分)
Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰 ...
- BZOJ3531 [Sdoi2014]旅行 【树剖 + 线段树】
题目 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们用 ...
- [bzoj3531][Sdoi2014][旅行] (主席树+树链剖分)
Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰. ...
- 2018.07.24 bzoj3531: [Sdoi2014]旅行(树链剖分+动态开点)
传送门 树链剖分. 如何维护? 如果颜色少直接每种颜色一颗线段树走人. 但这题颜色数量不大于1e5" role="presentation" style="po ...
- 【块状树】【树链剖分】【线段树】bzoj3531 [Sdoi2014]旅行
离线后以宗教为第一关键字,操作时间为第二关键字排序. <法一>块状树,线下ac,线上tle…… #include<cstdio> #include<cmath> # ...
- BZOJ3531 SDOI2014 旅行 - 树链剖分,主席树
题意:给定一棵树,树上每个点有权值和类型.支持:修改某个点的类型:修改某个点的权值:询问某条链上某个类型的点的和/最大值.点数/类型数/询问数<=100000. 分析: 树链剖分,对每个类型的点 ...
- bzoj3531: [Sdoi2014]旅行 (树链剖分 && 动态开点线段树)
感觉动态开点线段树空间复杂度好优秀呀 树剖裸题 把每个宗教都开一颗线段树就可以了 但是我一直TLE 然后调了一个小时 为什么呢 因为我 #define max(x, y) (x > y ? x ...
随机推荐
- Python 实现双端队列 Deque
操作 Deque() 创建一个空的双端队列 add_front(item) 从队头加入一个item元素 add_rear(item) 从队尾加入一个item元素 remove_front() 从队头删 ...
- 20145237 《Java程序设计》第九周学习总结
20145237 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令 ...
- 视图和URL配置
视图和URL配置 实验简介 上一章里我们介绍了如何创建一个Django项目并启动Django的开发服务器.本章你将学到用Django创建动态网页的基本知识. 同时,也教会大家怎么在本地机器上建立一个独 ...
- Codechef March Challenge 2014——The Street
The Street Problem Code: STREETTA https://www.codechef.com/problems/STREETTA Submit Tweet All submis ...
- 【作业】HansBug的前三次OO作业分析与小结
OO课程目前已经进行了三次的作业,容我在本文中做一点微小的工作. 第一次作业 第一次作业由于难度不大,所以笔者程序实际上写的也比较随意一些.(点击就送指导书~) 类图 程序的大致结构如下: 代码分析 ...
- vue项目结构
前言 我在 搭建vue项目环境 简单说明了项目初始化完成后的目录结构. 但在实际项目中,src目录下的结构需要跟随项目做一些小小的调整. 目录结构 ├── src 项目源码目录 │ ├── api 所 ...
- fabric.js和高级画板
本文介绍fabric.js框架使用,以及使用fabricjs打造一个高级画板程序. 高级画板功能介绍 全局绘制颜色选择 护眼模式.网格模式切换 自由绘制 画箭头 画直线 画虚线 画圆/椭圆/矩形/直角 ...
- python之路--day11---迭代器和生成器
迭代: 迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 为什么要有迭代器: 数据类型的取值,字符串,列表,元组依靠索引可以取值,但是字典,集合,文件这些数据类型无法 ...
- jenkins 简单实现php集成上线部署
基于公司git版本控制,搭建jenkins实现php集成部署(没有用gitlab,测试服配置较低,gitlab卡的不要不要的了-) 一.安装jenkins相关依赖 wget -O /etc/yum.r ...
- Spring Security 入门(1-6-2)Spring Security - 内置的filter顺序、自定义filter、http元素和对应的filterChain
Spring Security 的底层是通过一系列的 Filter 来管理的,每个 Filter 都有其自身的功能,而且各个 Filter 在功能上还有关联关系,所以它们的顺序也是非常重要的. 1.S ...