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 ...
随机推荐
- 一些比较好的shellscript脚本
1. 变量与替换 #!/bin/bash # 变量替换 # 另外, 变量替换还有许多别的语法 # 例如, b=${a/23/bb} 将 23 替换成 bb 等等, 用到时再找 a=375 hello= ...
- 使用myeclipse建立maven项目(重要)
maven是管理项目的,myeclipse是编写代码的.第一次写项目都要配置好多东西,很麻烦,now 来看看怎样新建一个maven项目. 工具/原料 myeclipse maven 方法/步骤 ...
- 【Todo】蒙特卡洛(蒙特卡罗)树 & 卷积网络
https://www.zhihu.com/question/41176911/answer/90066752 这里面有关于Deep Learning和蒙特卡洛树的一些内容 https://www.z ...
- java中compareTo和compare方法之比较
这两个方法经常搞混淆,现对其进行总结以加深记忆. compareTo(Object o)方法是java.lang.Comparable接口中的方法,当需要对某个类的对象进行排序时,该类需要实现Comp ...
- js encodeURI方法认识
很早就知道js中encodeURI方法,也很早就用过,但是每次看到它总感觉有些陌生,因为不知道到底是什么原理,和普通的编码到底什么关系, 今天在查看w3c api时又遇到了她,正好有空就多看了几眼,突 ...
- sap 中怎样把非限制库存转为销售订单库存?
把非限制库存转为销售订单库存: MB1B 移动类型413 把销售订单库存转为非限制库存: MB1B移动类型411 E 切记!
- dede 调用四级导航
一.修改文件:\include\taglib目录下的channel.lib.php,请将以下代码全部复制替换上述文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- Android 使用dagger2进行依赖注入(基础篇)
0. 前言 Dagger2是首个使用生成代码实现完整依赖注入的框架,极大减少了使用者的编码负担,本文主要介绍如何使用dagger2进行依赖注入.如果你不还不了解依赖注入,请看这一篇. 1. 简单的依赖 ...
- spring来了-05-JDBC
概述 Spring对C3P0连接池的支持很完善 Spring对jdbc提供了JdbcTemplate,来简化jdbc操作, JdbcTemplate模板工具类,类似于DbUtils组件 JDBC: p ...
- js和jquery获取子元素
<ul id="nav"> <li></li> <li> <ul> <li></li> < ...