职务地址:http :// www . lydsy . com / JudgeOnline / problem . php ?

id = 3531

标题效果:看到原来的标题。

算法讨论:树链拆分。

就可以。

Code:

#include <cstdio>
#include <algorithm> #define N 3000000
#define M 30000000
#define oo 0x7f7f7f7f using namespace std; int n,q,x,y,mm,tot,digit[10],w[N+10],c[N+10],next[N+10],son[N+10],ed[N+10],fa[N+10],head[N+10],heavy[N+10],
size[N+10],deep[N+10],id[N+10],tree1[M+10],tree2[M+10],l[N+10],r[N+10],root[N+10];
bool vis[N+10];
char s[10]; void add(int x,int y){
next[++mm]=son[x];
son[x]=mm;
ed[mm]=y;
} void dfs1(int x){
vis[x]=1;
size[x]=1;
for (int i=son[x];i;i=next[i]){
int y=ed[i];
if (!vis[y]){
fa[y]=x;
deep[y]=deep[x]+1;
dfs1(y);
size[x]+=size[y];
if (size[y]>size[heavy[x]]) heavy[x]=y;
}
}
} void dfs2(int x){
vis[x]=1;
id[x]=++tot;
if (!head[x]) head[x]=x;
if (heavy[x]){
head[heavy[x]]=head[x];
dfs2(heavy[x]);
}
for (int i=son[x];i;i=next[i]){
int y=ed[i];
if (!vis[y]) dfs2(y);
}
} void up(int rt){
tree1[rt]=tree1[l[rt]]+tree1[r[rt]];
tree2[rt]=max(tree2[l[rt]],tree2[r[rt]]);
} void modify(int& rt,int lc,int rc,int x,int y){
if (!rt) rt=++tot;
if (lc==rc){
tree1[rt]=y;
tree2[rt]=y;
return;
}
int mid=(lc+rc)/2;
if (x<=mid) modify(l[rt],lc,mid,x,y);
else modify(r[rt],mid+1,rc,x,y);
up(rt);
} int qsum(int rt,int lc,int rc,int L,int R){
if (!rt) return 0;
if (L==lc && R==rc) return tree1[rt];
int mid=(lc+rc)/2;
if (R<=mid) return qsum(l[rt],lc,mid,L,R);
if (L>mid) return qsum(r[rt],mid+1,rc,L,R);
return qsum(l[rt],lc,mid,L,mid)+qsum(r[rt],mid+1,rc,mid+1,R);
} int qmax(int rt,int lc,int rc,int L,int R){
if (!rt) return 0;
if (L==lc && R==rc) return tree2[rt];
int mid=(lc+rc)/2;
if (R<=mid) return qmax(l[rt],lc,mid,L,R);
if (L>mid) return qmax(r[rt],mid+1,rc,L,R);
return max(qmax(l[rt],lc,mid,L,mid),qmax(r[rt],mid+1,rc,mid+1,R));
} int qs(int x,int y){
int ans=0,C=c[x];
while (head[x]!=head[y]){
if (deep[head[x]]<deep[head[y]]) swap(x,y);
ans+=qsum(root[C],1,n,id[head[x]],id[x]);
x=fa[head[x]];
}
if (deep[x]>deep[y]) swap(x,y);
ans+=qsum(root[C],1,n,id[x],id[y]);
return ans;
} int qm(int x,int y){
int ans=-oo,C=c[x];
while (head[x]!=head[y]){
if (deep[head[x]]<deep[head[y]]) swap(x,y);
ans=max(ans,qmax(root[C],1,n,id[head[x]],id[x]));
x=fa[head[x]];
}
if (deep[x]>deep[y]) swap(x,y);
ans=max(ans,qmax(root[C],1,n,id[x],id[y]));
return ans;
} int main(){
#ifndef ONLINE_JUDGE
freopen("3531.in","r",stdin);
freopen("3531.out","w",stdout);
#endif
scanf("%d%d",&n,&q);
for (int i=1;i<=n;++i) scanf("%d%d",&w[i],&c[i]);
for (int i=1;i<n;++i){
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
dfs1(1);
for (int i=1;i<=n;++i) vis[i]=0;
dfs2(1);
tot=0;
for (int i=1;i<=n;++i) modify(root[c[i]],1,n,id[i],w[i]);
for (int i=1;i<=q;++i){
scanf("%s%d%d",s,&x,&y);
if (s[0]=='C')
if (s[1]=='C'){
modify(root[c[x]],1,n,id[x],0);
modify(root[y],1,n,id[x],w[x]);
c[x]=y;
}
else{
modify(root[c[x]],1,n,id[x],y);
w[x]=y;
}
else if (s[1]=='S') printf("%d\n",qs(x,y));
else printf("%d\n",qm(x,y));
}
return 0;
}

By Charlie Pan

Mar 14,2014



版权声明:本文博客原创文章,博客,未经同意,不得转载。

BZOJ 3531: [Sdoi2014]旅游的更多相关文章

  1. BZOJ 3531: [Sdoi2014]旅行 [树链剖分]

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1685  Solved: 751[Submit][Status] ...

  2. [BZOJ 3531] [Sdoi2014] 旅行 【离线+LCT】

    题目链接:BZOJ - 3531 题目分析 题目询问一条路径上的信息时,每次询问有某种特定的文化的点. 每个点的文化就相当于一种颜色,每次询问一条路径上某种颜色的点的信息. 可以使用离线算法, 类似于 ...

  3. bzoj 3531 [Sdoi2014]旅行(树链剖分,线段树)

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 876  Solved: 446[Submit][Status][ ...

  4. bzoj 3531 [Sdoi2014]旅行 (树剖+线段树 动态开点)

    3531: [Sdoi2014]旅行 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 2984  Solved: 1312[Submit][Status ...

  5. [bzoj 3531][SDOI2014]旅行(树链剖分+动态开点线段树)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3531 分析: 对于每个颜色(颜色<=10^5)都建立一颗线段树 什么!那么不是M ...

  6. BZOJ 3531 SDOI2014 旅行 树链剖分+线段树动态开点

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3531 题意概述: 给出一棵N个点的树,树上的每个结点有一个颜色和权值,支持以下四种操作: ...

  7. BZOJ 3531 [Sdoi2014]旅行 树链剖分+动态开点线段树

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

  8. bzoj 3531: [Sdoi2014]旅行

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

  9. 【刷题】BZOJ 3531 [Sdoi2014]旅行

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

随机推荐

  1. Windows下用Mingw编译Boost.Regex库

    下载Boost库,解压. 定位到regex库文件夹下. GCC所对应的MAKEFILE为gcc.mak 进入命令提示符下,输入make -f gcc.mak 这是如果直接按回车执行的话,会出现错误: ...

  2. activemq java版本要求

    <pre name="code" class="html">activemq: redis01:/root# cp apache-activemq- ...

  3. Qt之启动外部程序(使用参数很全面,还使用了setProcessChannelMode)

    简述 QProcess可以用来启动外部程序,并与它们交互. 要启动一个进程,通过调用start()来进行,参数包含程序的名称和命令行参数,参数作为一个QStringList的单个字符串. 另外,也可以 ...

  4. 移动App-UI配制篇

    杂志app-UI配制篇 背景 现在公司有需求是关于杂志app,里面每个页面可能有不同的展现方式,不同的内容,不同的操作方式.那么这里就有一个需求就是根据用户定制这些不同的展现方式,不同的内容,不同的操 ...

  5. 8592 KMP算法

    8592 KMP算法 时间限制:1000MS  内存限制:1000K 题型: 编程题   语言: 无限制 描写叙述 用KMP算法对主串和模式串进行模式匹配. 本题目给出部分代码.请补全内容. #inc ...

  6. KMP算法(具体求串的next[n])

     怎么求串的模式值next[n]   )next[0]= -1  意义:不论什么串的第一个字符的模式值规定为-1. )next[j]= -1   意义:模式串T中下标为j的字符,假设与首字符 同样,且 ...

  7. cocos2d 游戏开发:Cocos2d v3 &quot;hello world&quot;+显示飞船

    V3 RC4 版本号图片 显示一个飞船 将Chapter1中 SpaceCargoShip.png 文件 加入到项目里面. 代码在 init : CCSprite *spaceCargoShip = ...

  8. linux 查看某进程或程序的网卡流量(转)

    一.nethogs介绍 分享一个linux 下检测系统进程占用带宽情况的检查.来自github上的开源工具. 它不依赖内核中的模块.当我们的服务器网络异常时,可以通过运行nethogs程序来检测是那个 ...

  9. java matlab混合编程之返回值Struct类型

    java matlab混合编程的时候当返回值是Struct类型(matlab中的返回类型)如何来取得(java中)其值? 上网找,看到这个网页:http://www.mathworks.cn/cn/h ...

  10. SharePoint 内容部署-PowerShell

    1. 创建一个新的内容部署路径 New-SPContentDeploymentPath –Name "Marketing Internet Content" –SourceSPWe ...