【BZOJ2243】染色(树链剖分)
题意:
给定一棵有n个节点的无根树和m个操作,操作有2类:
1、将节点a到节点b路径上所有点都染成颜色c;
2、询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”、“222”和“1”。
请你写一个程序依次完成这m个操作。
数N<=10^5,操作数M<=10^5,所有的颜色C为整数且在[0, 10^9]之间。
思路:树上的路径染色问题可以用树剖解决。
对于线段树的某个节点我们记录以下信息:最左端颜色,最右端颜色,整段中段数,以及lazytag。
其中lazytag>=0时表示该区间要改成什么颜色,-1表示当前节点没有标记。
转换到树上做即可
BZOJ过了样例就一遍过(萎靡)
type un=record
l,r,s,tag:longint;
end;
var t:array[..]of un;
f:array[..,..]of longint;
head,vet,next,flag,dep,fa,top,
tid,id,size,son,a:array[..]of longint;
n,m,i,j,k,x,y,z,q,tot,time:longint;
ch:string;
emp:un; procedure swap(var x,y:longint);
var t:longint;
begin
t:=x; x:=y; y:=t;
end; procedure add(a,b:longint);
begin
inc(tot);
next[tot]:=head[a];
vet[tot]:=b;
head[a]:=tot;
end; procedure dfs1(u:longint);
var e,v,maxsize,i:longint;
begin
flag[u]:=; size[u]:=; maxsize:=; son[u]:=;
for i:= to do
begin
if dep[u]<(<<i) then break;
f[u,i]:=f[f[u,i-],i-];
end; e:=head[u];
while e<> do
begin
v:=vet[e];
if flag[v]= then
begin
dep[v]:=dep[u]+;
f[v,]:=u;
fa[v]:=u;
dfs1(v);
size[u]:=size[u]+size[v];
if size[v]>maxsize then
begin
maxsize:=size[v];
son[u]:=v;
end;
end;
e:=next[e];
end;
end; procedure dfs2(u,ance:longint);
var e,v:longint;
begin
flag[u]:=; inc(time); tid[u]:=time; id[time]:=u; top[u]:=ance;
if son[u]> then dfs2(son[u],ance);
e:=head[u];
while e<> do
begin
v:=vet[e];
if flag[v]= then dfs2(v,v);
e:=next[e];
end;
end; function lca(x,y:longint):longint;
var i,d:longint;
begin
if dep[x]<dep[y] then swap(x,y);
d:=dep[x]-dep[y];
for i:= to do
if d and (<<i)> then x:=f[x,i];
for i:= downto do
if f[x,i]<>f[y,i] then
begin
x:=f[x,i]; y:=f[y,i];
end;
if x=y then exit(x);
exit(f[x,]);
end; procedure pushup(p:longint);
begin
t[p].l:=t[p<<].l; t[p].r:=t[p<<+].r;
if t[p<<].r<>t[p<<+].l then t[p].s:=t[p<<].s+t[p<<+].s
else t[p].s:=t[p<<].s+t[p<<+].s-;
end; procedure pushdown(p,l,r:longint);
var tmp:longint;
begin
tmp:=t[p].tag; t[p].tag:=-;
if (tmp=-)or(l=r) then exit;
t[p<<].s:=; t[p<<+].s:=;
t[p<<].tag:=tmp; t[p<<+].tag:=tmp;
t[p<<].l:=tmp; t[p<<].r:=tmp;
t[p<<+].l:=tmp; t[p<<+].r:=tmp;
end; procedure build(l,r,p:longint);
var mid:longint;
begin
if l=r then
begin
t[p].s:=;
t[p].tag:=-;
exit;
end;
t[p].tag:=-;
mid:=(l+r)>>;
build(l,mid,p<<);
build(mid+,r,p<<+);
end; procedure update(l,r,x,y,v,p:longint);
var mid:longint;
begin
pushdown(p,l,r);
if (l>=x)and(r<=y) then
begin
t[p].l:=v; t[p].r:=v;
t[p].s:=; t[p].tag:=v;
exit;
end;
mid:=(l+r)>>;
if x<=mid then update(l,mid,x,y,v,p<<);
if y>mid then update(mid+,r,x,y,v,p<<+);
pushup(p);
end; function query(l,r,x,y,p:longint):longint;
var mid,t1,t2:longint;
begin
pushdown(p,l,r);
if (l>=x)and(r<=y) then exit(t[p].s);
mid:=(l+r)>>;
t1:=; t2:=;
if x<=mid then t1:=query(l,mid,x,y,p<<);
if y>mid then t2:=query(mid+,r,x,y,p<<+);
if t1= then exit(t2);
if t2= then exit(t1);
query:=t1+t2;
if t[p<<].r=t[p<<+].l then dec(query);
end; function get(l,r,x,p:longint):longint;
var mid:longint;
begin
pushdown(p,l,r);
if (l=x)and(r=x) then exit(t[p].l);
mid:=(l+r)>>;
if x<=mid then exit(get(l,mid,x,p<<))
else exit(get(mid+,r,x,p<<+));
end; function ask(x,y:longint):longint;
var q:longint;
begin
q:=lca(x,y);
ask:=;
while top[x]<>top[q] do
begin
ask:=ask+query(,n,tid[top[x]],tid[x],);
if get(,n,tid[top[x]],)=get(,n,tid[fa[top[x]]],) then dec(ask);
x:=fa[top[x]];
end;
ask:=ask+query(,n,tid[q],tid[x],);
while top[y]<>top[q] do
begin
ask:=ask+query(,n,tid[top[y]],tid[y],);
if get(,n,tid[top[y]],)=get(,n,tid[fa[top[y]]],) then dec(ask);
y:=fa[top[y]];
end;
ask:=ask+query(,n,tid[q],tid[y],);
dec(ask); end; procedure solve(x,y,z:longint);
var q:longint;
begin
q:=lca(x,y);
while top[x]<>top[q] do
begin
update(,n,tid[top[x]],tid[x],z,);
x:=fa[top[x]];
end;
update(,n,tid[q],tid[x],z,);
while top[y]<>top[q] do
begin
update(,n,tid[top[y]],tid[y],z,);
y:=fa[top[y]];
end;
update(,n,tid[q],tid[y],z,);
end; begin
assign(input,'bzoj2243.in'); reset(input);
assign(output,'bzoj2243.out'); rewrite(output);
readln(n,m);
for i:= to n do read(a[i]);
for i:= to n- do
begin
readln(x,y);
add(x,y);
add(y,x);
end;
dfs1();
fillchar(flag,sizeof(flag),);
dfs2(,);
build(,n,);
for i:= to n do update(,n,tid[i],tid[i],a[i],);
//for i:= to n do write(a[id[i]],' ');
for i:= to m do
begin
readln(ch);
x:=; y:=; z:=;
case ch[] of
'C':
begin
for k:= to length(ch) do
begin
if ch[k]=' ' then break;
x:=x*+ord(ch[k])-ord('');
end;
j:=k+;
for k:=j to length(ch) do
begin
if ch[k]=' ' then break;
y:=y*+ord(ch[k])-ord('');
end;
j:=k+;
for k:=j to length(ch) do z:=z*+ord(ch[k])-ord('');
solve(x,y,z);
end; 'Q':
begin
for k:= to length(ch) do
begin
if ch[k]=' ' then break;
x:=x*+ord(ch[k])-ord('');
end;
j:=k+;
for k:=j to length(ch) do y:=y*+ord(ch[k])-ord('');
writeln(ask(x,y));
end;
end;
end;
close(input);
close(output);
end.
【BZOJ2243】染色(树链剖分)的更多相关文章
- BZOJ 2243 染色 | 树链剖分模板题进阶版
BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...
- 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树
[BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...
- BZOJ2243 洛谷2486 [SDOI2011]染色 树链剖分
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2243 题目传送门 - 洛谷2486 题意概括 一棵树,共n个节点. 让你支持以下两种操作,共m次操 ...
- bzoj-2243 2243: [SDOI2011]染色(树链剖分)
题目链接: 2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6267 Solved: 2291 Descript ...
- bzoj2243[SDOI2011]染色 树链剖分+线段树
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 9012 Solved: 3375[Submit][Status ...
- BZOJ 2243: [SDOI2011]染色 [树链剖分]
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6651 Solved: 2432[Submit][Status ...
- Bzoj 2243: [SDOI2011]染色 树链剖分,LCT,动态树
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 5020 Solved: 1872[Submit][Status ...
- [bzoj 2243]: [SDOI2011]染色 [树链剖分][线段树]
Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“ ...
- BZOJ 2243: [SDOI2011]染色 树链剖分 倍增lca 线段树
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- BZOJ 2243: [SDOI2011]染色 树链剖分+线段树区间合并
2243: [SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数 ...
随机推荐
- iOS JS 交互之利用系统JSContext实现 JS调用oc方法
ios js 交互分为两块: 1.oc调用js 这一块实现起来比较简单, 我的项目中加载的是本地的html,js,css,需要注意的是当你向工程中拖入这些文件时,选择如下操作,(拖入的文件夹是蓝色的, ...
- UIKeyboardType
typedef NS_ENUM(NSInteger, UIKeyboardType) { UIKeyboardTypeDefault, // Default type for the current ...
- 配置centos7解决 docker Failed to get D-Bus connection 报错
在centos7的容器里面出现了一个BUG,就是serveice启动服务的时候出现报错,不能用service启动服务.[root@e13c3d3802d0 /]# service httpd star ...
- NOIP模拟赛 czy的后宫4
czy的后宫4 [问题描述] czy有很多妹子,妹子虽然数量很多,但是质量不容乐观,她们的美丽值全部为负数(喜闻乐见). czy每天都要带N个妹子到机房,她们都有一个独一无二的美丽值,美丽值为-1到- ...
- Python自学笔记_
1. if语句 判断语句. 1 a=2 2 b=3 3 if a>b: 4 print("a>b") 5 else: 6 print("a<b" ...
- 面向对象之元类(metaclass)
一.前言: 要搞懂元类必须要搞清楚下面几件事: 类创建的时候,内部过程是什么样的,也就是我们定义类class 类名()的过程底层都干了些啥 类的调用即类的实例化过程的了解与分析 我们已经知道元类存在的 ...
- Java Web系统常用的第三方接口
1. Web Service 接口 1.1 接口方式说明和优点 在笔者的开发生涯中,当作为接口提供商给第三方提供接口时,以及作为客户端去调用第三方提供的接口时,大部分时候都是使用 Web Se ...
- light oj 1104 Birthday Paradox (概率题)
Sometimes some mathematical results are hard to believe. One of the common problems is the birthday ...
- JVM执行子系统探究——类文件结构初窥
类文件(.class)是搞java的都非常熟悉的文件,一般我们在编写java之后文件之后,首先通过javac工具生成.class类字节码文件,而后在执行程序的时候由虚拟机加载执行.那么为什么要生成.c ...
- javascript 内置日期转换方法
var d = new Date(); console.log(d); // 输出:Mon Nov 04 2013 21:50:33 GMT+0800 (中国标准时间) console.log(d.t ...