题意:有n个城市,每个城市有权值和颜色,支持的操作有单点修改权值,单点修改颜色,查询区间同颜色之和,查询区间同颜色最大值。

思路:对于每种颜色,放入不同的线段树,但其实整个加起来还是还是n个结点,值得注意的是,这里要使用动态开点,要一步步记录左右儿子的编号,而不能使用2i,2i+1直接去找,而这样建树的话,就可以很方便的查询同颜色的结点了,修改操作啥的把原颜色中的结点改为0,再在现在的颜色中开点就可以了。

#include <cstdio>
#include <algorithm>#define Rep(i,s,t) for(int i=s;i<=t;i++)
#define For(i,s,t) for(int i=s;i;i=t)using namespace std;const int maxx = 100000 + 25;
const int maxm = 4000000 + 25;
const int Inf = (unsigned)(-1) >> 1;int head[maxx],nxt[maxx<<1],to[maxx<<1],a[maxx],c[maxx];
int top[maxx],rnk[maxx],size[maxx],dpt[maxx],ftr[maxx],son[maxx];
int T[maxm],Tmax[maxm],lc[maxm],rc[maxm],rt[maxx];int num,cnt,tot,n,m,x,y,k;
char f[8];namespace Y{void Ins(int x,int y) {to[++num]=y;nxt[num]=head[x];head[x]=num;}    void Dfs1(int x){size[x] = 1;For( i , head[x] , nxt[i] ){int now = to[i];if(now == ftr[x]) continue;dpt[now] = dpt[x] + 1;ftr[now] = x;Dfs1(now);size[x] += size[now];if(size[now] > size[son[x]]) son[x] = now;}}void Dfs2(int x,int brn){rnk[x] = ++cnt;top[x] = brn;if(son[x]) Dfs2(son[x],brn);For( i , head[x] , nxt[i] )if(to[i] != ftr[x] && to[i] != son[x])Dfs2(to[i],to[i]);}void upt(int i){T[i] = T[lc[i]] + T[rc[i]];Tmax[i] = max(Tmax[lc[i]],Tmax[rc[i]]);}void modify(int &i,int pos,int l,int r,int k){if(!i) i = ++tot;if(l == r) {T[i] = Tmax[i] = k;return;}int mid = (l+r) >> 1;if(pos <= mid) modify(lc[i],pos,l,mid,k);if(pos >  mid) modify(rc[i],pos,mid+1,r,k);upt(i);}void chk(int &tmp,int pls,int flag){if(flag == 0) tmp = tmp + pls;if(flag == 1) tmp = max(tmp,pls);}int Query(int i,int x,int y,int l,int r,int flag){if(x <= l && r <= y) return flag? Tmax[i] : T[i];int ans = (flag)? -Inf : 0;int mid = (l+r) >> 1;if(x <= mid) chk(ans,Query(lc[i],x,y,l,mid,flag),flag);if(y >  mid) chk(ans,Query(rc[i],x,y,mid+1,r,flag),flag);return ans;}int Get(int i,int x,int y,int flag){int ans = (flag)? -Inf : 0;while(top[x] != top[y]){if(dpt[top[x]] > dpt[top[y]]) x^=y^=x^=y;chk(ans,Query(i,rnk[top[y]],rnk[y],1,n,flag),flag);y = ftr[top[y]];}if(rnk[x] > rnk[y]) x^=y^=x^=y;chk(ans,Query(i,rnk[x],rnk[y],1,n,flag),flag);return ans;}}using namespace Y;int main(){scanf("%d%d",&n,&m);Rep( i , 1 , n ) scanf("%d%d",&a[i],&c[i]);Rep( i , 1 , n-1 ) scanf("%d%d",&x,&y),Ins(x,y),Ins(y,x);Dfs1(1),Dfs2(1,1);Rep( i , 1 , n ) modify(rt[c[i]],rnk[i],1,n,a[i]);while( m-- ){scanf("%s",f);if(f[1] == 'S') scanf("%d%d",&x,&y),printf("%d\n",Get(rt[c[x]],x,y,0));if(f[1] == 'C'){ scanf("%d%d",&x,&y);modify(rt[c[x]],rnk[x],1,n,0);c[x]=y;modify(rt[c[x]],rnk[x],1,n,a[x]);}if(f[1] == 'W')scanf("%d%d",&x,&y),a[x]=y,modify(rt[c[x]],rnk[x],1,n,a[x]);if(f[1] == 'M') scanf("%d%d",&x,&y),printf("%d\n",Get(rt[c[x]],x,y,1));}return 0;
}

【Bzoj3531】旅行相关推荐

  1. BZOJ3531旅行

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 942 Solved: 467 Description S国有N个 ...

  2. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  3. [bzoj3531][Sdoi2014]旅行

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

  4. 【BZOJ3531】旅行,树链剖分+开点线段树

    传送门 写在前面:为自己和并肩作战的两个队友默哀 思路:感觉做的链剖题越来越厉害了,这道题让我接触到了线段树的一种新姿势--原来写线段树,对于某个节点i,左右儿子是直接当成i∗2i*2和i∗2+1i* ...

  5. 2022-2028年中国在线旅行预订市场投资分析及前景预测报告

    [报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了在线旅行行业相关概述.中国在线旅行行业运行环境.分析了中国在线旅行行 ...

  6. LeetCode简单题之旅行终点站

    题目 给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i] = [cityAi, cityBi] 表示该线路将会从 cityAi 直接前往 cityBi .请你找出 ...

  7. usaco Cow Tours 牛的旅行

    Cow Tours 牛的旅行 农民 John 的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场. 但是就目前而言,你能看到至少有两个牧区不连通.这样,农民 John 就有 ...

  8. gatsby_如何使用Gatsby和Leaflet创建夏季公路旅行地图绘制应用程序

    gatsby Get ready for the summer by building your own road trip mapping app with this step-by-step gu ...

  9. 汉印标签打印机app_旅行一族福音 汉印CP4000L便携照片打印机体验

    最近一段时间,有个问题经常在我脑海中出现:"我们为什么需要打印照片?" 不过没想到,让我瞬间解除这个疑惑的,却是近期刚刚上市的一款便携照片打印机-汉印CP4000L.自从知晓这款产 ...

最新文章

  1. 图片/容器/字体 透明度[opacity:0.4; filter:alpha(opacity=40)]
  2. 智慧城市顶层设计方法_主頁
  3. LeetCode 120. 三角形最小路径和
  4. 探索python--Robert J. Brunner
  5. 从阿里的产品能力模型分析,转产品如何避免“从头开始”
  6. Logstash 中type 和 tags
  7. WebRTC系列--视频编码控制之BALANCED(分辨率与帧率平衡模式)
  8. 更改Typora宽度
  9. C++字符串内数字统计
  10. Linux Centos 7软件防火墙
  11. JAVA系列:SimpleDateFormat解析带T字符的时间格式( yyyy-MM-ddTHH:mm:sssZ )
  12. 【CSDN博客频道携手图灵教育】“移动开发之我见”主题征文活动
  13. 关于代码布局(Coding Layout)
  14. 灰灰教你学python ~小黄鸡自动回复
  15. 新东方王强计算机水平,新东方的三位创始人之王强的创业故事
  16. 【峰回路转】Excel技巧百例 06.设置下拉框
  17. QPI与GMI/Infinity Fabric/CCX
  18. android的cooipad手机,苹果COO库克:Android平板电脑是大号智能手机
  19. AMD PUMA笔记本平台芯片组介绍
  20. Word生成图目录和表目录

热门文章

  1. 解决html、php中文乱码问题
  2. 联想企业网盘为企业云时代带来什么?
  3. Pinhole camera model相机模型
  4. 自学PYTHON分享 --基础1
  5. 【動態規劃】導彈攔截
  6. 使用C++制作一个蓝屏程序
  7. 华为od统一考试B卷【发广播】C++ 实现
  8. js添加元素的三种方法
  9. 算法工程师研发技能表
  10. 13种UML简介、工具及示例