BZOJ 3531: [Sdoi2014]旅游
职务地址: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]旅游的更多相关文章
- BZOJ 3531: [Sdoi2014]旅行 [树链剖分]
3531: [Sdoi2014]旅行 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1685 Solved: 751[Submit][Status] ...
- [BZOJ 3531] [Sdoi2014] 旅行 【离线+LCT】
题目链接:BZOJ - 3531 题目分析 题目询问一条路径上的信息时,每次询问有某种特定的文化的点. 每个点的文化就相当于一种颜色,每次询问一条路径上某种颜色的点的信息. 可以使用离线算法, 类似于 ...
- bzoj 3531 [Sdoi2014]旅行(树链剖分,线段树)
3531: [Sdoi2014]旅行 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 876 Solved: 446[Submit][Status][ ...
- bzoj 3531 [Sdoi2014]旅行 (树剖+线段树 动态开点)
3531: [Sdoi2014]旅行 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 2984 Solved: 1312[Submit][Status ...
- [bzoj 3531][SDOI2014]旅行(树链剖分+动态开点线段树)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3531 分析: 对于每个颜色(颜色<=10^5)都建立一颗线段树 什么!那么不是M ...
- BZOJ 3531 SDOI2014 旅行 树链剖分+线段树动态开点
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3531 题意概述: 给出一棵N个点的树,树上的每个结点有一个颜色和权值,支持以下四种操作: ...
- BZOJ 3531 [Sdoi2014]旅行 树链剖分+动态开点线段树
题意 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰. 为了方便,我们用 ...
- bzoj 3531: [Sdoi2014]旅行
Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰. ...
- 【刷题】BZOJ 3531 [Sdoi2014]旅行
Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰 ...
随机推荐
- Delphi 设置文件属性
复制代码uses FileCtrl; procedure TForm1.BitBtn1Click(Sender: TObject);begin with OpenDialog1 do if Execu ...
- (step6.3.3)hdu 1150(Machine Schedule——二分图的最小点覆盖数)
题目大意:第一行输入3个整数n,m,k.分别表示女生数(A机器数),男生数(B机器数),以及它们之间可能的组合(任务数). 在接下来的k行中,每行有3个整数c,a,b.表示任务c可以有机器A的a状态或 ...
- APPCAN学习笔记003---原生开发与HTML5技术
APPCAN学习笔记003---原生开发与HTML5技术 技术qq交流群:JavaDream:251572072 1.HTML5的优势: HTML5强悍牢固的骨架 CSS3精致到每一个毛孔的皮 ...
- HW Video Acceleration in Chrome/Chromium HTML5 video 视频播放硬件加速
Introduction Video decode (e.g. YouTube playback) and encode (e.g. video chat applications) are some ...
- 用Swift开发二维码扫描器教程
(原文:Building a QR Code Reader in Swift 作者:Simon Ng 译者:xiaoying )我相信大多数人都知道二维码(QR code)是什么,如果你对这个概念还不 ...
- Delphi调用C++导出的QT类
打开VS2008创建一个dll项目(创建了一个QT Library项目),新建头文件q4dapplication.h定义纯虚类: #ifndef Q4DAPPLICATION#define Q4DAP ...
- Mojo 分析日志接口
#!/usr/bin/perl #取文件行数 ##循环开始清空文件 use POSIX; use DBI; my $dir = '/data01/applog_backup'; my $file = ...
- dll导入导出资源文件查看工具 InspectExe
InspectExe lets you explore and diagnose problems with Win32 applications. It is integrated directly ...
- VC6迁移到VS2008几个问题——良好的代码,从我做起,从现在开始。
最近.有一个项目开发,需要使用一次项目的代码.只有当项目VC6下编译通过的,在VS2008下不一定编译通过,能编译通过也不一定能链接成功.以下总结一下我在一个VC6项目移植到VS2008中遇到的一些问 ...
- linux 软连接 硬连接
1.Linux链接概念 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. [硬连接] 硬连接指通过索引 ...