#include<cstdio>
#include<iostream>
#define M 1000006
#define N 1000006
using namespace std;
int head[N],next[M],u[M],se[N],se1[N],n,m,size[N],l[N],lc[N][],f1[N],cnt,dui[N],lian[N],tim,l1,l2;
int r1;
struct data
{
int l,r,sum,tag;
}shu[*N];
void jia(int a1,int a2)
{
cnt++;
next[cnt]=head[a1];
head[a1]=cnt;
u[cnt]=a2;
return;
}
void dfs(int a1)
{
f1[a1]=;
size[a1]=;
for(int i=;i<=;i++)
{
if(l[a1]<(>>i))
break;
lc[a1][i]=lc[lc[a1][i-]][i-];
}
for(int i=head[a1];i;i=next[i])
if(!f1[u[i]])
{
lc[u[i]][]=a1;
l[u[i]]=l[a1]+;
dfs(u[i]);
size[a1]+=size[u[i]];
}
return;
}
void dfs1(int a1,int a2)
{
tim++;
dui[a1]=tim;
lian[a1]=a2;
int k=;
for(int i=head[a1];i;i=next[i])
if(!dui[u[i]]&&size[k]<size[u[i]])
k=u[i];
if(!k)
return;
dfs1(k,a2);
for(int i=head[a1];i;i=next[i])
if(!dui[u[i]])
dfs1(u[i],u[i]);
return;
}
void geng(int a1)
{
shu[a1].l=shu[a1*].l;
shu[a1].r=shu[a1*+].r;
shu[a1].sum=shu[a1*].sum+shu[a1*+].sum;
if(shu[a1*].r==shu[a1*+].l)
shu[a1].sum--;
return;
}
void build(int a1,int a2,int a3)
{
if(a2==a3)
{
shu[a1].sum=;
shu[a1].l=se1[a2];
shu[a1].r=se1[a2];
return;
}
int mid=(a2+a3)>>;
build(a1*,a2,mid);
build(a1*+,mid+,a3);
geng(a1);
return;
}
int lca(int a1,int a2)
{
if(l[a1]<l[a2])
swap(a1,a2);
int a3=l[a1]-l[a2];
for(int i=;i<=;i++)
if(a3&(<<i))
a1=lc[a1][i];
for(int i=;i>=;i--)
if(lc[a1][i]!=lc[a2][i])
{
a1=lc[a1][i];
a2=lc[a2][i];
}
if(a1==a2)
return a1;
return lc[a1][];
}
void geng1(int a1)
{
int a2=shu[a1].l;
shu[a1*].l=a2;
shu[a1*].r=a2;
shu[a1*].sum=;
shu[a1*].tag=;
shu[a1*+].l=a2;
shu[a1*+].r=a2;
shu[a1*+].sum=;
shu[a1*+].tag=;
shu[a1].tag=;
}
void gai1(int a1,int a2,int a3,int a4,int a5,int a6)
{
if(a4<=a2&&a5>=a3)
{
shu[a1].l=a6;
shu[a1].r=a6;
shu[a1].sum=;
shu[a1].tag=;
return;
}
if(shu[a1].tag)
geng1(a1);
int mid=(a2+a3)>>;
if(a4<=mid)
gai1(a1*,a2,mid,a4,a5,a6);
if(a5>mid)
gai1(a1*+,mid+,a3,a4,a5,a6);
geng(a1);
}
void gai(int a1,int t,int a3)
{
for(;lian[a1]!=lian[t];)
{
gai1(,,n,dui[lian[a1]],dui[a1],a3);
a1=lc[lian[a1]][];
}
gai1(,,n,dui[t],dui[a1],a3);
}
int xun1(int a1,int a2,int a3,int a4,int a5)
{
int ss=;
if(a4<=a2&&a5>=a3)
{
if(l1==-)
l1=shu[a1].l;
r1=shu[a1].r;
return shu[a1].sum;
}
if(shu[a1].tag)
geng1(a1);
int mid=(a2+a3)>>;
if(a4<=mid)
ss+=xun1(a1*,a2,mid,a4,a5);
if(a5>mid)
ss+=xun1(a1*+,mid+,a3,a4,a5);
if(a4<=mid&&a5>mid&&shu[a1*].r==shu[a1*+].l)
ss--;
return ss;
}
int xun(int a1,int t)
{
int sum=;
l2=-;
for(;lian[a1]!=lian[t];)
{
l1=-;
sum+=xun1(,,n,dui[lian[a1]],dui[a1]);
a1=lc[lian[a1]][];
if(r1==l2)
sum--;
l2=l1;
}
l1=-;
sum+=xun1(,,n,dui[t],dui[a1]);
if(r1==l2)
sum--;
return sum;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&se[i]);
for(int i=;i<n;i++)
{
int a1,a2;
scanf("%d%d",&a1,&a2);
jia(a1,a2);
jia(a2,a1);
}
dfs();
dfs1(,);
for(int i=;i<=n;i++)
se1[dui[i]]=se[i];
build(,,n);
char ch[];
for(int i=;i<=m;i++)
{
int a1,a2,a3=,a5=;
scanf("%s%d%d",ch,&a1,&a2);
int t=lca(a1,a2);
if(ch[]=='C')
{
scanf("%d",&a3);
gai(a1,t,a3);
gai(a2,t,a3);
}
else
{
a3=xun(a1,t);
a5=xun(a2,t);
a3+=a5;
a3--;
printf("%d\n",a3);
}
}
return ;
}

一个树链剖分,怎么这么长~~~~(>_<)~~~~

bzoj 2243: [SDOI2011]染色的更多相关文章

  1. BZOJ 2243: [SDOI2011]染色 [树链剖分]

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6651  Solved: 2432[Submit][Status ...

  2. bzoj 2243 [SDOI2011]染色(树链剖分,线段树)

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 4637  Solved: 1726[Submit][Status ...

  3. Bzoj 2243: [SDOI2011]染色 树链剖分,LCT,动态树

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 5020  Solved: 1872[Submit][Status ...

  4. bzoj 2243: [SDOI2011]染色 线段树区间合并+树链剖分

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 7925  Solved: 2975[Submit][Status ...

  5. bzoj 2243: [SDOI2011]染色 (树链剖分+线段树 区间合并)

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 9854  Solved: 3725[Submit][Status ...

  6. BZOJ 2243: [SDOI2011]染色 树链剖分 倍增lca 线段树

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  7. BZOJ 2243: [SDOI2011]染色 树链剖分+线段树区间合并

    2243: [SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数 ...

  8. bzoj 2243 [SDOI2011]染色(树链剖分+线段树合并)

    [bzoj2243][SDOI2011]染色 2017年10月20日 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询 ...

  9. 洛谷 P2486 [SDOI2011]染色/bzoj 2243: [SDOI2011]染色 解题报告

    [SDOI2011]染色 题目描述 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同 ...

  10. BZOJ 2243 [SDOI2011]染色 (树链剖分)(线段树区间修改)

    [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6870  Solved: 2546[Submit][Status][Disc ...

随机推荐

  1. [转载] 深入 superviser

    模块简介 新人接触线上的时候一般都会碰到supervise这个工具,导师对这个模块的解释一般就是,这个模块是监控进程,当进程挂掉之后,supervise会将进程启动.这样当进程出 现问题,如因出cor ...

  2. bootstrap学习笔记<三>(文本,代码域,列表)

    文本对齐 .text-left:左对齐 .text-center:居中对齐 .text-right:右对齐 .text-justify:两端对齐 <p class="text-left ...

  3. 64位WIN7+oracle11g+plsql安装

    64位WIN7+oracle11g+plsql安装   上部转自Oracle 11g R2 for Win7旗舰版(64位)的安装步骤 1.下载Oracle 11g R2 for Windows的版本 ...

  4. windows volume related concepts

    Volume --- 一个volume就是一个分区.  在该“物理硬盘”上创建一个或多个分区,再创建文件系统,才可以得到一个VOLUME.此时VOLUME相对于主机是一个逻辑设备. https://m ...

  5. TortoiseGIT

    TortoiseGIT 是Git版本控制系统的一个免费开源客户端,它是git版本控制的 Windows 扩展.可以使你避免使用枯燥而且不方便的命令行.它完全嵌入 Windows Explorer,使用 ...

  6. h5 input file ajax实现文件上传

    <input type="file" accept="image/*" height="0" class="file_inp ...

  7. hiho1099_constellation

    题目 一 个NxM(N, M <= 1000)的矩阵形成星空,矩阵中的点有两种字符,'#'代表星星,'.'代表空白,星空中的星星最多5000个:给出K(K<=20)个星图,每 个星图都是H ...

  8. markdown 语法学习

    markdown是一种轻量级的标记语言,和html类似,但是易读性比html要好很多. 基本语法: 1.标题和正文分隔线 === //至少三个连续等号,最高阶标题 --- //或者三个连续的减号,第二 ...

  9. IOC Container(服务容器)的工作机制

    IOC Container 是laravel的一个核心内容,有了IOC Container在Laravel的强大表现,我们可以在Laravel中实现很大程度的代码维护性.(文档我是看的懵逼懵逼的(*^ ...

  10. CentOS6.5配置python开发环境之一:CentOS图形化界面显示

    这两天在配置centos系统下python的开发环境和工具. 刚用centos,做做记录可以方便以后有需要的人...查资料确实挺麻烦的 centos6.5 sublime3 python27 subl ...