#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. Google账户_GooglePlay_关联

    PS:这过程叫一个折腾...穷逼的无奈啊... 1. 1.1. 网上搜到说,安装 google play & google框架服务,手机需要root,没去证实这个事情... 用了之前的 And ...

  2. PHPStorm怎么修改选中的背景颜色呢?

    File -> Settings -> editor ->color&fonts->general->下拉框中的selection background-> ...

  3. linux install sublime_text3

    ubuntu & debian: (baidu or google) 1). download ***.deb to install inux系统下怎么安装.deb文件? deb 是 ubun ...

  4. Java编程思想学习笔记_4(异常机制,容器)

    一.finally语句注意的细节: 当涉及到break和continue语句的时候,finally字句也会得到执行. public class Test7 { public static void m ...

  5. iOS--获取输入字符的第一个字母(汉字则获取拼音的第一个字母)

    - (NSString *)firstCharactor:(NSString *)aString { //转成了可变字符串 NSMutableString *str = [NSMutableStrin ...

  6. python 打包与部署

    环境:win10.eclipse-jee-mars.python2.7 打包在linux上进行安装测试 1.1 打包 项目目录结构如下: 打包对象:utils.reg 在P1项目的顶级目录,也就是ut ...

  7. 转!!java中的内部类总结

    java内部类 内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类 如同一个人是由大脑.肢体.器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液 ...

  8. OA系统部门结构树

    public class DepartmentUtils { /** * @param topList 顶级部门列表 * @param removeId 删除部门的id * @return */ pu ...

  9. IOS开发—UIDatePicker 日期/时间选取器(滚轮)

    UIDatePicker 是一个控制器类,封装了 UIPickerView,但是他是UIControl的子类,专门用于接受日期.时间和持续时长的输入.日期选取器的各列会按照指定的风格进行自动配置,这样 ...

  10. ios开发中的toll-free bridged

    所谓的Toll-free bridging是说您可以在某个框架的方法或函数 同时使用Core Foundatio和Foundation 框架中的某些类型. 很多数据类型支持这一特性,其中包括群体和字符 ...