bzoj 2243: [SDOI2011]染色
#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]染色的更多相关文章
- BZOJ 2243: [SDOI2011]染色 [树链剖分]
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6651 Solved: 2432[Submit][Status ...
- bzoj 2243 [SDOI2011]染色(树链剖分,线段树)
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4637 Solved: 1726[Submit][Status ...
- Bzoj 2243: [SDOI2011]染色 树链剖分,LCT,动态树
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 5020 Solved: 1872[Submit][Status ...
- bzoj 2243: [SDOI2011]染色 线段树区间合并+树链剖分
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 7925 Solved: 2975[Submit][Status ...
- bzoj 2243: [SDOI2011]染色 (树链剖分+线段树 区间合并)
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 9854 Solved: 3725[Submit][Status ...
- BZOJ 2243: [SDOI2011]染色 树链剖分 倍增lca 线段树
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- BZOJ 2243: [SDOI2011]染色 树链剖分+线段树区间合并
2243: [SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数 ...
- bzoj 2243 [SDOI2011]染色(树链剖分+线段树合并)
[bzoj2243][SDOI2011]染色 2017年10月20日 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询 ...
- 洛谷 P2486 [SDOI2011]染色/bzoj 2243: [SDOI2011]染色 解题报告
[SDOI2011]染色 题目描述 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同 ...
- BZOJ 2243 [SDOI2011]染色 (树链剖分)(线段树区间修改)
[SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6870 Solved: 2546[Submit][Status][Disc ...
随机推荐
- alloc && afree
#define ALLOCSIZE 10000 static char allocbuf[ALLOCSIZE]; static char *allocp = allocbuf; char *alloc ...
- 【转】Github 上传代码
版权声明:欢迎转载(^ω^)~不过转载请注明原文出处:http://blog.csdn.net/catglory ლ(╹◡╹ლ) 写在前面: 弄了两小时终于搞定了,把经验整理下,方便我以后上传代码XD ...
- hdu 1115 Lifting the Stone
题目链接:hdu 1115 计算几何求多边形的重心,弄清算法后就是裸题了,这儿有篇博客写得很不错的: 计算几何-多边形的重心 代码如下: #include<cstdio> #include ...
- 谱聚类Ng算法的Matlab简单实现
请编写一个谱聚类算法,实现"Normalized Spectral Clustering-Algorithm 3 (Ng 算法)" 结果如下 谱聚类算法核心步骤都是相同的: •利用 ...
- java 反射机制的实例
[案例1]通过一个对象获得完整的包名和类名 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package Reflect; /** * 通过一个对象获得完整的包名和类名 ...
- js生成验证码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Unity shader(CG) 写一个 散色、折射、反射、菲涅尔、gamma、简单后期屏幕特效
http://www.lai18.com/content/506918.html 1.自生要求是很重要的,当然不是什么强迫工作之类的,而是自己有限的能力上不断的扩展兴趣上的内容. 2.用生活的眼光去发 ...
- robotframework笔记16
发布处理具有相同名称的关键字 使用机器人框架要么是关键词 图书馆 关键字 或 用户的关键字 . 前来自 标准 库 或 外部库 ,后者 中创建相同的文件在使用或进口 资源文件 . 许多关键字使用时,是很 ...
- android AutoCompleteTextView 自定义BaseAdapter
最近项目中需要做搜索功能,实现类似 Google.Baidu 搜索的 下拉提示效果.Android为我们提供了 AutoCompleteTextView 控件来完成此功能. 网上好多例子都是简单使用 ...
- 在AngularJS应用中实现认证授权
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAokAAAFwCAIAAABbwHY6AAAgAElEQVR4nOy9+XtcxbX3+/4H9z73jP ...