zoukankan      html  css  js  c++  java
  • 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.
  • 相关阅读:
    第四章
    第二章
    第三章
    第一章
    第十章心得
    第九章心得
    第八章心得
    第七章心得
    第六章心得
    第五章心得
  • 原文地址:https://www.cnblogs.com/Currier/p/6663614.html
Copyright © 2011-2022 走看看