bzoj2243 [SDOI2011]染色

Posted Currier

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,表示xy之间有一条无向边。

下面 行每行描述一个操作:

“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
 

Sample Output

3
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.

 

以上是关于bzoj2243 [SDOI2011]染色的主要内容,如果未能解决你的问题,请参考以下文章

[BZOJ2243][SDOI2011]染色

BZOJ2243: [SDOI2011]染色

BZOJ2243: [SDOI2011]染色

bzoj 2243: [SDOI2011]染色

BZOJ2243: [SDOI2011]染色

BZOJ 2243 SDOI 2011染色