职务地址: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. Mac 10.10 下安装jdk 1.7 以上

    mac 会默认的给用户安装1.6,1.6 以上的版本安装的时候就总是会提示错误问题 根据网上的安装方法,这里也总结下 首先确定挂载在mac上了 然后输入命令 (目前使用的jdk1.7Update67) ...

  2. [置顶] cocos2d-x 3.0游戏开发xcode5帅印博客教学 004.[HoldTail]主角的上下飞行跟移动

    cocos2d-x 3.0游戏开发xcode5帅印博客教学 004.[HoldTail]主角的上下飞行跟移动 写给大家的前言,在学习cocos2d-x的时候自己走了很多的弯路,也遇到了很多很多问题,不 ...

  3. MFC 总体理解

    在MFC程序中,我们并不经常直接调用Windows API,而是从MFC类创建对象并调用属于这些对象的成员函数.也就是说MFC封装了Windows API 你说你喜欢C++而MFC换一种说法就是一个用 ...

  4. 海蜘蛛网络科技官方网站 :: 做最好的中文软路由 :: 软件路由器 :: 软路由 :: 软件路由 :: RouterOs

    海蜘蛛网络科技官方网站 :: 做最好的中文软路由 :: 软件路由器 :: 软路由 :: 软件路由 :: RouterOs 企业简介 武汉海蜘蛛网络科技有限公司成立于2005年,是一家专注于网络新技术研 ...

  5. Android RingtoneManager铃声管理

    本篇介绍一下跳转到系统铃声选择界面,android中的铃声通过RingtoneManager管理,RingtoneManager管理来电铃声(TYPE_RINGTONE).提示音(TYPE_NOTIF ...

  6. 怎样学习java?

    嗯.不知不觉中,学习java的时间快要两年了.在学习这两年中.遇到的挫折非常多,收货的知识也非常多.以下我给出我自己在学习过程中使用到的经验.以及相关的资源链接,希望每个爱编程.爱java的人.能够有 ...

  7. 虚继承之单继承的内存布局(VC在编译时会把vfptr放到类的头部,这和Delphi完全一致)

    C++2.0以后全面支持虚函数与虚继承,这两个特性的引入为C++增强了不少功能,也引入了不少烦恼.虚函数与虚继承有哪些特性,今天就不记录了,如果能搞了解一下编译器是如何实现虚函数和虚继承,它们在类的内 ...

  8. 通过加载Kernel32来动态判断 当前操作系统32bit还是64bit

    工作原理:通过加载Kernel32来获取IsWow64Process 函数然后通过函数的地址操作,执行函数的操作. 在程序中只要我们获取了一个函数的地址,就可以找到正确的方法执行这个函数. 但是这种方 ...

  9. 广东省-IT公司红黑榜排名

    红榜Top100 Order Company Name Point Change  1 百富计算机技术(深圳)有限公司  94.00 --  2 中国网通广州分公司  88.00 --  3 深圳市汇 ...

  10. flex网上办(苹果)桌面系统仿真

    1.有登录界面 2.能够载入app(每一个app是单独的swf),并可拖动app的图标互相叠加 3.桌面上显示的哪些APP与目录是依据登陆的用户信息.从webservice中读取的(名字.图标信息等) ...