#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. servlet文件上传

    1.获取文件上传路径 String path=request.getServletContext.getRePath("/WEB-INF/resources"); 2.获得工厂 3 ...

  2. ScriptX.cab打印控件的使用,控件文件里有

    1.在head里添加 <object id="factory" style="display:none;" viewastext classid=&quo ...

  3. Mono for Android布局控件属性小结

    1. layout_weight 用于给一个线性布局中的诸多视图的重要度赋值. 所有的视图都有一个layout_weight值,默认为零,意思是需要显示 多大的视图就占据多大的屏幕空 间.若赋一个高于 ...

  4. MyEclipse8.5启动无法选择工作空间的问题

    方法一:打开Window---Preferences---General---Startup and Shutdown,勾选Prompt for workspace on startup 选项,再次登 ...

  5. 第一天……

    Hello,大家好! 不对,这个开头有点不对.我不应该这么说,这个博客我是为我自己而开通的.目的很简单,好记兴不如烂笔头,把每天所学所感写下来. 我想作一个有条理的人,一个有计划的人,一个有效率的人. ...

  6. C10K及C100K问题探讨 & 怎么应对大流量大并发

    首先开宗明义,离开业务单独讨论并发,都是扯淡. 就像 https://www.zhihu.com/question/20493166/answer/15998053 这里面说的 谈并发必然要谈业务,空 ...

  7. Eclipse NDK 配置

    一.关于NDK:NDK全称:Native Development Kit. 1.NDK是一系列工具的集合. NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java ...

  8. Android控件之CheckBox(复选框控件)

    一.有两种状态: 选中状态(true).未选中状态(false) 二.属性 android:id = "@+id/checkbox" android:layout_width=&q ...

  9. eclipse插件安装 (zhuan)

    https://my.oschina.net/gxs2012/blog/205875 http://blog.csdn.net/zhujiaxing666666/article/details/150 ...

  10. vim 空格和换行的删除和替换

      %s/\s//g %s/\r//g %s/\n//g   把一个很长的一行按空格分为多行 :%s/ +/\r/g简单解释一下:%s :在整个文件范围查找替换/ :分隔符+ :匹配空格,其中“ ”表 ...