题目传送门

题目大意:给定一棵无根树,每个节点有自己的类别和权值,现在给定两个类别相同的点,叫你求这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. java web 初学

    我希望在本学期本堂课上学会使用java web 框架 精通mvc架构模式 学会通过框架和数据库对产品进行构造与编写. 我计划每周用16小时的时间进行学习java web 一周4学时上课时间 周一到周五 ...

  2. Alpha冲刺Day5

    Alpha冲刺Day5 一:站立式会议 今日安排: 首先由于经过黄腾飞短暂的测试,发现导入导出仍然有一些问题,今天需要进行完善 由黄腾飞负责企业自查风险管理子模块,要求为单元进行风险点的管理 由张梨贤 ...

  3. 《高级软件测试》11.15.全组完成jira安装,开始任务的部分书写

    今日任务完成情况如下: 小段:完成linux环境上jira的安装,并将jira的安装过程录制下来 小费:完成linux环境下jira的安装,开始部分任务的书写 小高:完成了jira的安装,并进一步熟悉 ...

  4. HNOI 2012 永无乡

    codevs 1477 永无乡 http://codevs.cn/problem/1477/ 2012年湖南湖北省队选拔赛  时间限制: 1 s  空间限制: 128000 KB   题目描述 Des ...

  5. python 3.x 爬虫基础---常用第三方库(requests,BeautifulSoup4,selenium,lxml )

    python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 python 3.x 爬虫基础---常用第三方库 ...

  6. apache的重写规则

    RewriteEngine OnRewriteCond %{REQUEST_FILENAME} .*\.(jpg|jpeg|gif|png) [NC]RewriteRule .* http://i8. ...

  7. Hangfire使用ApplicationInsigts监控

    起因 我司目前使用清真的ApplicationInsights(以下简称Ai)来做程序级监控.(Ai相关文档: https://azure.microsoft.com/zh-cn/services/a ...

  8. nodejs调试总结

    之前nodejs开发中最痛苦的就是调试,因为我之前开发node时使用的编辑器还没有将nodejs的调试也集成进去,所以简单对nodejs开发的调试做了点探索,nodejs本身就有调试功能,同时node ...

  9. 记一次将公司网站http换成https

    看了博客园将近一年了,一直都只是在被动的看,总觉得应该写点什么,但是又不知道该写点什么.今天正好公司要把网站由http换成https,那我就顺便记录一下吧. 由于之前没有弄过,所以就面向百度编程. 首 ...

  10. C# JavaScriptSerializer找不到引用

    遇到一个问题,还是第一次遇到,虽然比较简单,还是记录一下 一.写了一个小工具,为了方便就建了个Form窗体,结果用到了JavaScriptSerializer类,可是怎么都找不到System.Web. ...