bzoj2243 [SDOI2011]染色
Description
给定一棵有n个节点的无根树和m个操作,操作有2类:
1、将节点a到节点b路径上所有点都染成颜色c;
2、询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”、“222”和“1”。
请你写一个程序依次完成这m个操作。
Input
第一行包含2个整数n和m,分别表示节点数和操作数;
第二行包含n个正整数表示n个节点的初始颜色
下面 行每行包含两个整数x和y,表示x和y之间有一条无向边。
下面 行每行描述一个操作:
“C a b c”表示这是一个染色操作,把节点a到节点b路径上所有点(包括a和b)都染成颜色c;
“Q a b”表示这是一个询问操作,询问节点a到节点b(包括a和b)路径上的颜色段数量。
Output
对于每个询问操作,输出一行答案。
Sample Input
6 5
2 2 1 2 1 1
1 2
1 3
2 4
2 5
2 6
Q 3 5
C 2 1 1
Q 3 5
C 5 1 2
Q 3 5
2 2 1 2 1 1
1 2
1 3
2 4
2 5
2 6
Q 3 5
C 2 1 1
Q 3 5
C 5 1 2
Q 3 5
Sample Output
3
1
2
1
2
HINT
数N<=10^5,操作数M<=10^5,所有的颜色C为整数且在[0, 10^9]之间。
Source
第一轮day1
树链剖分,以前写过,再写一下玩玩。
1 program rrr(input,output); 2 type 3 treetype=record 4 l,r,lc,rc,s,d:longint; 5 end; 6 etype=record 7 t,next:longint; 8 end; 9 var 10 a:array[0..400040]of treetype; 11 e:array[0..200020]of etype; 12 c,co,col,idx,head,siz,son,ss,q,father,dep:array[0..100010]of longint; 13 n,m,i,j,x,y,cnt,h,t,cc,ans:longint; 14 op:char; 15 procedure add(x,y:longint); 16 begin 17 inc(cnt);e[cnt].t:=y;e[cnt].next:=c[x];c[x]:=cnt; 18 end; 19 procedure split; 20 begin 21 h:=0;t:=1;q[1]:=1;father[1]:=0;dep[1]:=1; 22 while h<t do 23 begin 24 inc(h);i:=c[q[h]]; 25 while i<>0 do 26 begin 27 if e[i].t<>father[q[h]] then 28 begin 29 father[e[i].t]:=q[h];dep[e[i].t]:=dep[q[h]]+1; 30 inc(t);q[t]:=e[i].t; 31 end; 32 i:=e[i].next; 33 end; 34 end; 35 for i:=1 to n do siz[i]:=1; 36 fillchar(ss,sizeof(ss),0); 37 fillchar(son,sizeof(son),0); 38 for i:=n downto 1 do 39 begin 40 inc(siz[father[q[i]]],siz[q[i]]); 41 if siz[q[i]]>ss[father[q[i]]] then begin ss[father[q[i]]]:=siz[q[i]];son[father[q[i]]]:=q[i]; end; 42 end; 43 cnt:=0;fillchar(idx,sizeof(idx),0); 44 for i:=1 to n do 45 if idx[q[i]]=0 then 46 begin 47 j:=q[i]; 48 while j<>0 do begin inc(cnt);idx[j]:=cnt;head[j]:=q[i];j:=son[j]; end; 49 end; 50 end; 51 procedure build(k,l,r:longint); 52 var 53 mid,i:longint; 54 begin 55 a[k].l:=l;a[k].r:=r;a[k].d:=-1; 56 if l=r then begin a[k].lc:=col[l];a[k].rc:=col[l];a[k].s:=1;exit; end; 57 mid:=(l+r)>>1;i:=k+k; 58 build(i,l,mid);build(i+1,mid+1,r); 59 a[k].lc:=a[i].lc;a[k].rc:=a[i+1].rc; 60 a[k].s:=a[i].s+a[i+1].s;if a[i].rc=a[i+1].lc then dec(a[k].s); 61 end; 62 procedure pushdown(k:longint); 63 var 64 i:longint; 65 begin 66 if a[k].l=a[k].r then a[k].d:=-1; 67 if a[k].d=-1 then exit; 68 i:=k+k;a[i].lc:=a[k].d;a[i].rc:=a[k].d;a[i].s:=1;a[i].d:=a[k].d; 69 inc(i);a[i].lc:=a[k].d;a[i].rc:=a[k].d;a[i].s:=1;a[i].d:=a[k].d; 70 a[k].d:=-1; 71 end; 72 procedure change(k,x,y:longint); 73 var 74 mid,i:longint; 75 begin 76 pushdown(k); 77 if (x<=a[k].l) and (a[k].r<=y) then begin a[k].lc:=cc;a[k].rc:=cc;a[k].s:=1;a[k].d:=cc;exit; end; 78 mid:=(a[k].l+a[k].r)>>1;i:=k+k; 79 if x<=mid then change(i,x,y); 80 if mid<y then change(i+1,x,y); 81 a[k].lc:=a[i].lc;a[k].rc:=a[i+1].rc; 82 a[k].s:=a[i].s+a[i+1].s;if a[i].rc=a[i+1].lc then dec(a[k].s); 83 end; 84 function color(x:longint):longint; 85 var 86 k,mid:longint; 87 begin 88 k:=1; 89 while a[k].l<>a[k].r do 90 begin 91 pushdown(k); 92 mid:=(a[k].l+a[k].r)>>1; 93 if x<=mid then k:=k+k else k:=k+k+1; 94 end; 95 exit(a[k].lc); 96 end; 97 function ask(k,x,y:longint):longint; 98 var 99 mid,i,ans:longint; 100 begin 101 pushdown(k); 102 if (x<=a[k].l) and (a[k].r<=y) then exit(a[k].s); 103 mid:=(a[k].l+a[k].r)>>1;i:=k+k;ans:=0; 104 if x<=mid then ans:=ask(i,x,y); 105 if mid<y then ans:=ans+ask(i+1,x,y); 106 if (x<=mid) and (mid<y) and (a[i].rc=a[i+1].lc) then dec(ans); 107 exit(ans); 108 end; 109 procedure changec; 110 begin 111 while head[x]<>head[y] do 112 if dep[head[x]]>dep[head[y]] then begin change(1,idx[head[x]],idx[x]);x:=father[head[x]]; end 113 else begin change(1,idx[head[y]],idx[y]);y:=father[head[y]]; end; 114 if idx[x]<idx[y] then change(1,idx[x],idx[y]) else change(1,idx[y],idx[x]); 115 end; 116 procedure query; 117 begin 118 ans:=0; 119 while head[x]<>head[y] do 120 if dep[head[x]]>dep[head[y]] then 121 begin 122 ans:=ans+ask(1,idx[head[x]],idx[x]); 123 if color(idx[head[x]])=color(idx[father[head[x]]]) then dec(ans); 124 x:=father[head[x]]; 125 end 126 else 127 begin 128 ans:=ans+ask(1,idx[head[y]],idx[y]); 129 if color(idx[head[y]])=color(idx[father[head[y]]]) then dec(ans); 130 y:=father[head[y]]; 131 end; 132 if idx[x]<idx[y] then ans:=ans+ask(1,idx[x],idx[y]) else ans:=ans+ask(1,idx[y],idx[x]); 133 end; 134 begin 135 assign(input,'r.in');assign(output,'r.out');reset(input);rewrite(output); 136 readln(n,m); 137 for i:=1 to n do read(co[i]); 138 fillchar(c,sizeof(c),0);cnt:=0; 139 for i:=1 to n-1 do begin readln(x,y);add(x,y);add(y,x); end; 140 split; 141 for i:=1 to n do col[idx[i]]:=co[i]; 142 build(1,1,n); 143 for i:=1 to m do 144 begin 145 read(op,x,y); 146 if op='C' then begin read(cc);changec; end 147 else begin query;writeln(ans); end; 148 readln; 149 end; 150 close(input);close(output); 151 end.