[Luogu 2486] SDOI2011 染色
[Luogu 2486] SDOI2011 染色
树剖水题,线段树维护。
详细题解不写了。
我只想说我写的线段树又变漂亮了qwq
#include <algorithm>
#include <cstdio>
#include <cstring>
const int MAXN=100010;
int n,m;
class HLD
{
private:
bool vis[MAXN];
int num;
static int rank[MAXN];
static struct Node
{
int v,depth,father,son,top,size,DFN;
}s[MAXN];
class SegmentTree
{
private:
struct Node
{
int v,left,right,lazy,color[2];
Node *c[2];
Node(int l,int r):left(l),right(r),lazy(0)
{
memset(color,0,sizeof color);
c[0]=c[1]=nullptr;
if(l==r)
{
v=1;
color[0]=color[1]=s[rank[l]].v;
return;
}
int mid=l+r>>1;
c[0]=new Node(l,mid);
c[1]=new Node(mid+1,r);
PushUp();
}
~Node(void)
{
if(c[0]!=nullptr)
delete c[0];
if(c[1]!=nullptr)
delete c[1];
}
void Modify(int x)
{
v=1;
lazy=color[0]=color[1]=x;
}
void PushUp(void)
{
v=c[0]->v+c[1]->v;
color[0]=c[0]->color[0];
color[1]=c[1]->color[1];
if(c[0]->color[1]==c[1]->color[0])
--v;
}
void PushDown(void)
{
if(c[0]!=nullptr)
c[0]->Modify(lazy);
if(c[1]!=nullptr)
c[1]->Modify(lazy);
lazy=0;
}
int Color(int x)
{
if(left==right)
return color[0];
if(lazy)
PushDown();
int mid=left+right>>1;
if(x>mid)
return c[1]->Color(x);
else
return c[0]->Color(x);
}
void Change(int l,int r,int v)
{
if(l==left && r==right)
{
Modify(v);
return;
}
if(lazy)
PushDown();
int mid=left+right>>1;
if(r<=mid)
c[0]->Change(l,r,v);
else if(l>mid)
c[1]->Change(l,r,v);
else
{
c[0]->Change(l,mid,v);
c[1]->Change(mid+1,r,v);
}
PushUp();
}
int Query(int l,int r)
{
if(l==left && r==right)
return v;
int mid=left+right>>1;
if(lazy)
PushDown();
if(r<=mid)
return c[0]->Query(l,r);
else if(l>mid)
return c[1]->Query(l,r);
else
{
int ans=c[0]->Query(l,mid)+c[1]->Query(mid+1,r);
if(c[0]->color[1]==c[1]->color[0])
--ans;
return ans;
}
}
}*root;
public:
SegmentTree(int n)
{
root=new Node(1,n);
}
~SegmentTree(void)
{
delete root;
}
int Color(int x)
{
return root->Color(x);
}
void Change(int l,int r,int v)
{
root->Change(l,r,v);
}
int Query(int l,int r)
{
return root->Query(l,r);
}
}*T;
struct Edge
{
int to;
Edge *next;
Edge(int to,Edge* next):to(to),next(next){}
~Edge(void)
{
if(next!=nullptr)
delete next;
}
}*head[MAXN];
void AddEdges(int u,int v)
{
head[u]=new Edge(v,head[u]);
head[v]=new Edge(u,head[v]);
}
void DFS1(int u,int k)
{
s[u].depth=k;
s[u].size=1;
int v;
for(Edge *i=head[u];i!=nullptr;i=i->next)
if(!s[v=i->to].size)
{
DFS1(v,k+1);
s[v].father=u;
s[u].size+=s[v].size;
if(s[v].size>s[s[u].son].size)
s[u].son=v;
}
}
void DFS2(int u,int top)
{
s[u].top=top;
s[u].DFN=++num;
rank[num]=u;
vis[u]=true;
if(s[u].son)
DFS2(s[u].son,top);
int v;
for(Edge *i=head[u];i!=nullptr;i=i->next)
if(!vis[v=i->to])
DFS2(v,v);
}
public:
HLD(int n):num(0)
{
memset(s,0,sizeof s);
std::fill(head+1,head+n+1,nullptr);
for(int i=1;i<=n;++i)
scanf("%d",&s[i].v);
for(int i=1,u,v;i<n;++i)
{
scanf("%d %d",&u,&v);
AddEdges(u,v);
}
DFS1(1,1);
DFS2(1,1);
T=new SegmentTree(n);
}
~HLD(void)
{
for(int i=1;i<=n;++i)
delete head[i];
delete T;
}
void Change(int x,int y)
{
int a,b,v;
scanf("%d",&v);
while((a=s[x].top)^(b=s[y].top))
if(s[a].depth>s[b].depth)
{
T->Change(s[a].DFN,s[x].DFN,v);
x=s[a].father;
}
else
{
T->Change(s[b].DFN,s[y].DFN,v);
y=s[b].father;
}
if(s[x].depth<s[y].depth)
T->Change(s[x].DFN,s[y].DFN,v);
else
T->Change(s[y].DFN,s[x].DFN,v);
}
void Query(int x,int y)
{
int a,b,ans=0;
while((a=s[x].top)^(b=s[y].top))
if(s[a].depth>s[b].depth)
{
ans+=T->Query(s[a].DFN,s[x].DFN);
x=s[a].father;
if(T->Color(s[a].DFN)==T->Color(s[x].DFN))
--ans;
}
else
{
ans+=T->Query(s[b].DFN,s[y].DFN);
y=s[b].father;
if(T->Color(s[b].DFN)==T->Color(s[y].DFN))
--ans;
}
ans+=s[x].depth<s[y].depth ? T->Query(s[x].DFN,s[y].DFN) : T->Query(s[y].DFN,s[x].DFN);
printf("%d\n",ans);
}
}*T;
int HLD::rank[MAXN];
HLD::Node HLD::s[MAXN];
int main(int argc,char** argv)
{
scanf("%d %d",&n,&m);
T=new HLD(n);
char c;
for(int i=1,x,y;i<=m;++i)
{
scanf("\n%c %d %d",&c,&x,&y);
if(c=='C')
T->Change(x,y);
else
T->Query(x,y);
}
delete T;
return 0;
}
谢谢阅读。
[Luogu 2486] SDOI2011 染色的更多相关文章
- Luogu P2486 [SDOI2011]染色(树链剖分+线段树合并)
Luogu P2486 [SDOI2011]染色 题面 题目描述 输入输出格式 输入格式: 输出格式: 对于每个询问操作,输出一行答案. 输入输出样例 输入样例: 6 5 2 2 1 2 1 1 1 ...
- BZOJ2243 洛谷2486 [SDOI2011]染色 树链剖分
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2243 题目传送门 - 洛谷2486 题意概括 一棵树,共n个节点. 让你支持以下两种操作,共m次操 ...
- luogu P2486 [SDOI2011]染色
树剖做法: 就是两个dfs+一个线段树 难度的取决基本==线段树的维护难度 所以对有点线段树基础的,树剖也不难做吧 这里操作有二 一:两点间路径染色 线段树的区间赋值操作 二:查询路径段的个数 考虑线 ...
- [SDOI2011]染色(树链剖分)
[SDOI2011]染色(luogu) Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段 ...
- BZOJ 2243: [SDOI2011]染色 [树链剖分]
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6651 Solved: 2432[Submit][Status ...
- bzoj-2243 2243: [SDOI2011]染色(树链剖分)
题目链接: 2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6267 Solved: 2291 Descript ...
- 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树
[BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...
- bzoj2243:[SDOI2011]染色
链剖就可以了.一开始的想法错了.但也非常接近了.妈呀调的要死...然后把字体再缩小一号查错起来比较容易QAQ. #include<cstdio> #include<cstring&g ...
- bzoj 2243 [SDOI2011]染色(树链剖分,线段树)
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4637 Solved: 1726[Submit][Status ...
随机推荐
- c# 免费版pdf转word尝试
链接:https://pan.baidu.com/s/1Dwuezo6YGe9CdlSyrwQyNg 密码:c81a 1.安装此程序 2.在安装文件的bin下拷贝dll: 3.代码引用 private ...
- winform default模式下和英文模式下 修改问题
1.修改控件大小.位置等属性在default模式下修改: 2.修改控件属性最好不要做鼠标拖动放大,拖动修改位置等,建议用属性栏中的数字来改变.
- zigbee,质量追溯系统,上位机,mis系统,C#(一)
一.效果截图 登录界面 主界面 查看养殖信息界面 添加养殖信息 温度采集实时监控界面1 温度采集实时监控界面2 信息追溯
- java使用匿名类直接new接口
翻看Vector代码的时候,看到这么一段. /** * Returns an enumeration of the components of this vector. The * returned ...
- maven 实践 :管理依赖
有人认为Maven是一个依赖管理工具,当然这种想法是错误的(确切的说Maven是一个项目管理工具,贯穿了整个项目生命周期,编译,测试,打包,发布...),但Maven给人造成这种错误的印象也是有原因的 ...
- 【Linux学习笔记】Linux C中内联汇编的语法格式及使用方法(Inline Assembly in Linux C)
http://blog.csdn.net/slvher/article/details/8864996 https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm. ...
- Delphi ADOQuery多个参数重复 改编技巧
今天看了多年前的一个帖子,发现回答不合理,有些还将其归为delphi的bug.其实主要是没有灵活应用参数. ADOQUERY查询时,这样不行,结果不正确. WITH ADOQUERY1 DO BEGI ...
- 【Java】JAVA开发人员常见环境工具安装
1.安装配置JDK1.7:jdk-7u45-windows-x64.exe,环境变量配置:JAVA_HOME---[F:\1024\jdk1.7],CLASSPATH---[.;%JAVA_HOME% ...
- BZOJ3574 HNOI2014抄卡组(哈希)
容易发现通配符中间的部分可以任意匹配,会造成的无法匹配的仅仅是前后缀,前缀和后缀可以分别独立处理.如果字符串均有通配符,只需要按前/后缀长度排序然后暴力匹配就可以了. 问题在于存在无通配符的字符串.显 ...
- QoS专题-第2期-QoS实现工具之MQC
QoS实现工具之MQC QoS技术可以对网络中报文进行分类处理,根据优先级提供不同的差分服务,如何实现这种差分服务呢?我们有一种强大的配置方法-模块化QoS命令行MQC(Modular QoS Com ...