原题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2243

染色

Description

给定一棵有n个节点的无根树和m个操作,操作有2类:

1、将节点a到节点b路径上所有点都染成颜色c;

2、询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),

如“112221”由3段组成:“11”、“222”和“1”。

请你写一个程序依次完成这m个操作。

Input

第一行包含2个整数n和m,分别表示节点数和操作数;

第二行包含n个正整数表示n个节点的初始颜色

下面 行每行包含两个整数x和y,表示x和y之间有一条无向边。

下面 行每行描述一个操作:

“C a b c”表示这是一个染色操作,把节点a到节点b路径上所有点(包括a和b)都染成颜色c;

“Q a b”表示这是一个询问操作,询问节点a到节点b(包括a和b)路径上的颜色段数量。

Output

对于每个询问操作,输出一行答案。

Sample Input

6 5
2 2 1 2 1 1
1 2
1 3
2 4
2 5
2 6
Q 3 5
C 2 1 1
Q 3 5
C 5 1 2
Q 3 5

Sample Output

3
1
2

HINT

数N<=105,操作数M<=105,所有的颜色C为整数且在[0, 10^9]之间。

题解

对于每个点,维护最左端的颜色和最右端的颜色以及自己这一段颜色的总数就好了。

代码
#include<bits/stdc++.h>
#define ls son[v][0]
#define rs son[v][1]
using namespace std;
const int M=1e5+5;
int dad[M],son[M][2],lcol[M],rcol[M],col[M],tot[M],dye[M],n,m;
bool rev[M];
bool notroot(int v){return son[dad[v]][0]==v||son[dad[v]][1]==v;}
void up(int v)
{lcol[v]=ls?lcol[ls]:col[v];rcol[v]=rs?rcol[rs]:col[v];if(ls&&rs)tot[v]=tot[ls]+tot[rs]+1-(rcol[ls]==col[v])-(lcol[rs]==col[v]);else if(ls)tot[v]=tot[ls]+(rcol[ls]!=col[v]);else if(rs)tot[v]=tot[rs]+(lcol[rs]!=col[v]);else tot[v]=1;
}
void turn(int v){swap(ls,rs);swap(lcol[v],rcol[v]);rev[v]^=1;}
void pdye(int v,int c){dye[v]=col[v]=lcol[v]=rcol[v]=c;tot[v]=1;}
void down(int v)
{if(dye[v]){if(ls)pdye(ls,dye[v]);if(rs)pdye(rs,dye[v]);dye[v]=0;}if(rev[v]){if(ls)turn(ls);if(rs)turn(rs);rev[v]^=1;}
}
void push(int v){if(notroot(v))push(dad[v]);down(v);}
void spin(int v)
{int f=dad[v],ff=dad[f],k=son[f][1]==v,w=son[v][!k];if(notroot(f))son[ff][son[ff][1]==f]=v;son[v][!k]=f;son[f][k]=w;if(w)dad[w]=f;dad[f]=v;dad[v]=ff;up(f);up(v);
}
void splay(int v)
{push(v);int f,ff;while(notroot(v)){f=dad[v];ff=dad[f];if(notroot(f))spin((son[f][0]==v)^(son[ff][0]==f)?v:f);spin(v);}
}
void access(int v){for(int f=0;v;v=dad[f=v])splay(v),rs=f,up(v);}
void beroot(int v){access(v);splay(v);turn(v);}
void split(int x,int y){beroot(x);access(y);splay(y);}
void link(int x,int y){beroot(x);dad[x]=y;}
void in()
{int a,b;scanf("%d%d",&n,&m);for(int i=1;i<=n;++i){scanf("%d",&col[i]);lcol[i]=rcol[i]=col[i];tot[i]=1;}for(int i=1;i<n;++i)scanf("%d%d",&a,&b),link(a,b);
}
void ac()
{char ch[10];int a,b,c;for(int i=1;i<=m;++i){scanf("%s%d%d",ch,&a,&b);if(ch[0]=='C')scanf("%d",&c),split(a,b),pdye(b,c);else split(a,b),printf("%d\n",tot[b]);}
}
int main()
{in();ac();return 0;
}

BZOJ2243[SDOI2011] 染色相关推荐

  1. [bzoj2243][SDOI2011]染色

    来自FallDream 的博客,未经允许,请勿转载,谢谢qaq 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段 ...

  2. BZOJ2243: [SDOI2011]染色

    Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段), 如 ...

  3. bzoj2243 [SDOI2011]染色

    树链剖分,线段树维护三个值:区间颜色数.区间左端颜色.区间右端颜色,当左区间右端颜色=右区间左端颜色时候,总颜色-1,树上的维护类似. 代码 1 #include<cstdio> 2 co ...

  4. [Bzoj2243][SDOI2011]染色(线段树树剖)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2243 线段树+树链剖分,在线段树需要每次用lt和rt两个数组记录当前区间的左右边界的颜色 ...

  5. BZOJ-2243 [SDOI2011]染色

    树链剖分模版题. #include <cstdlib> #include <cstdio> #include <cstring> #include <algo ...

  6. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

  7. P2486 [SDOI2011]染色

    P2486 [SDOI2011]染色 题意: 题解: 与一般的树链剖分相比,不同点在于查询的不是路径上颜色的数量而是颜色段的数量 对于两个颜色段,112和221,两个颜色段数量都是2 如果合在一起颜色 ...

  8. [Luogu 2486] SDOI2011 染色

    [Luogu 2486] SDOI2011 染色 树剖水题,线段树维护. 详细题解不写了. 我只想说我写的线段树又变漂亮了qwq #include <algorithm> #include ...

  9. 洛谷 P2486 [SDOI2011]染色 树链剖分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 思路 PushDown与Update Q AC代码 总结与拓展 题面 题目链接 P2486 ...

  10. BZOJ 2243: [SDOI2011]染色

    2243: [SDOI2011]染色 >原题链接< Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点 ...

最新文章

  1. 爬虫之selenium对cookie的处理
  2. 学python可以做什么副业-写代码做副业月入10K的方法都藏在这几个公众号里!
  3. java js 正则区别_对比正则表达式在JavaScript与Java中的区别
  4. 服务器每秒钟执行命令数量是什么_如何合理的评估上线服务器数量
  5. flask mysql环境配置_Flask干货:访问数据库——Flask-SQLAlchemy初始化
  6. JAVA 实现 JWT
  7. 帆软决策报表JS实现点击超链切换TAB页
  8. 利用C++求坐标系中两点间距离
  9. PS抠图滤镜Topaz ReMask白纱透明抠图法
  10. js插件---画图软件wePaint如何使用(插入背景图片,保存图片,上传图片)
  11. java随机生成迷宫游戏地图_java随机生成迷宫(图的深度优先遍历)
  12. 视频编码c语言,MPEG4codec(c) MPEG4视频格式的编解码源码 C语言实现 - 下载 - 搜珍网...
  13. python的编码解码是什么意思_python - 这是什么编码,如何解码
  14. 办公软件使用学习笔记:excel第五节。excel表格筛选和排序使用方法总结。
  15. 邪恶的PLS-00103错误提示
  16. 对传统优化算法的一些总结(上)
  17. 房地产数据-python爬虫+数据可视化
  18. LSTM写仿造诗经作诗
  19. nba app android,NBA app官方版
  20. ASM原理详解,以及使用附代码,AOP利器

热门文章

  1. 快速突破面试算法之链表篇
  2. python在工程管理专业的应用_工程大数据在水利工程建设管理的应用
  3. 58java面试题_58到家,java开发实际面试题
  4. Wannafly挑战赛25 A 因子
  5. 2015年热恋的肉肉们
  6. C#连接oracle数据库提示ORA-12154: TNS: 无法解析指定的连接标识符
  7. Oracle的方案(Schema)和用户(User)的区别
  8. C# 在word中查找及替换文本
  9. jdbc、PreparedStatement预编译原理
  10. 广度优先遍历(Breadth First Search)