[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 ...
随机推荐
- 【每日scrum】NO.9
(1)这是我们冲刺的最后一天,晚上我们的团队进行了收尾工作:第一阶段的任务基本完成,软件主要实现了校园景点照片以及对应的介绍,查询最短路径,查询涉及相关景点的查询,查询全部路径,基本界面的设计,导航功 ...
- lintcode-419-罗马数字转整数
419-罗马数字转整数 给定一个罗马数字,将其转换成整数. 返回的结果要求在1到3999的范围内. 说明 什么是 罗马数字? https://en.wikipedia.org/wiki/Roman_n ...
- 《DWZ笔记一》<select>动态联动菜单
联动菜单,即组合框Combo box,在DWZ文档中对组合框combox的是这样描述的: 在传统的select 用class 定义:class=”combox”, html 扩展:保留原有属性name ...
- Java基于Tomcat Https keytool 自签证书
本文大部分内容系转载,原文地址:https://www.cnblogs.com/littleatp/p/5922362.html keytool 简介 keytool 是java 用于管理密钥和证书的 ...
- VisualStudio2013 代码查看优化 对齐线
http://jingyan.baidu.com/article/363872eccef5276e4ba16f91.html
- TTPPRC —— 商业分析模型
欢迎讨论 : ) 前言1 TTPPRC,是一个为了更容易.透切地进行商业分析而整理出的分析模型.通过这个模型,可以让不具备专业商业知识的大众都能容易得出商业分析结果. 此文是读者阅读原文后,而整理的一 ...
- Java 线程池详解
Executors创建线程池 Java中创建线程池很简单,只需要调用Executors中相应的便捷方法即可,比如Executors.newFixedThreadPool(int nThreads),但 ...
- 【笔记】sublime 一些常用功能和快捷键
Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑)Ctrl+G 跳转到相应的行Ctrl+J 合并行(已选择需要合并的多行时)Ctrl+L 选择整行(按住-继续选择下 ...
- 【开发工具IDE】Eclipse 安装 Maven 的 m2eclipse 插件
本段节选自http://www.cnblogs.com/dcba1112/archive/2011/05/01/2033805.html Eclipse是一款非常优秀的IDE.除了基本的语法标亮.代码 ...
- BZOJ5091 摘苹果(概率期望)
大胆猜想每一步都相当于是第一步.稍微验证一下发现是对的.就做完了. #include<iostream> #include<cstdio> #include<cmath& ...