【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 ...
随机推荐
- Beta冲刺第六天
一.昨天的困难 没有困难. 二.今天进度 1.林洋洋:更新申请ip为域名,去除druid数据源统计 2.黄腾达:协作详情中添加成员对话框优化 3.张合胜:修复侧栏菜单mini状态下不能显示问题 三.明 ...
- 《高级软件测试》JIRA使用手册(一)JIRA基本情况
JIRA 官方网站为:https://www.atlassian.com/software/jira 中文代理网站为:https://www.jira.cn 现版本:v7.3.0 Atlassian公 ...
- Something about SeekingJob---Resume简历
这几天脑子里满满的装的都是offer.offer.offer快到碗里来,但是offer始终不是巧克力,并没那么甜美可口易消化. 找工作刚开始,就遇到了不小的阻力,看到Boss直聘上各种与IT相关的工作 ...
- RE:1054652545 - 论自己是如何蠢死的
1.Java web 项目中 login/list 文件夹中return "login/list" 反复读取不到对应的jsp文件 一周后检查出来的原因上一级文件夹login前面多出 ...
- JAVA_SE基础——54.异常
异常的体系: ----------| Throwable 所以异常或者错误类的超类 --------------|Error 错误 错误一般是用于jvm或者是硬件引发的问题,所以我们一般不会通 ...
- 关于读取Sql Server数据库时间前端处理问题
var time = this.CreateTime; this.CreateTime = new Date(time.replace("T", " ")).F ...
- 工频相位无线同步模块PSYN5000系列在高压设备状态检测和局部放电故障定位的应用方案
关键词: PSYN5000,无线同步模块,工频相位,局部放电,在线监测,高压设备,设备状态,故障定位. 前言: 在电力监测领域,出于方便和安全考虑,有些系统不得不采用无线通信的方式,在这样一个无线通信 ...
- oracle导入命令,记录一下
工作中用到了,这个命令,记录一下,前提要安装imp.exe imp PECARD_HN/PECARD_HN@127.0.0.1:1521/orcl file=E:\work\dmp\PECARD_HN ...
- axure 预览"HTTP/1.1 302 Found"
使用Axure编辑原型时,点击预览出现"HTTP/1.1 302 Found" 第一想到的就是重新安装Axure和检查原型文件是否损坏,验证后证明前Axure和.rp文件都是完好的 ...
- 返回到前台的String出现乱码问题
使用springmvc给前天返回String类型的数据出现乱码问题可以在配置环境Spring-mvc.xml中添加如下代码 <mvc:annotation-driven> <mvc: ...