【BZOJ2243】 [SDOI2011]染色

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,表示xy之间有一条无向边。

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

“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<=10^5,操作数M<=10^5,所有的颜色C为整数且在[0, 10^9]之间。

【分析】
还是树链剖分,主要是线段树那里,要记录最左边的颜色和最右边的颜色,合并的时候看看中间相接部分颜色是否相同,如果相同ans-1.
询问的时候是要重链、轻边的跳的,也是要记录左右的颜色,判断颜色是否相同。
代码如下:
  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cstring>
  4 #include<iostream>
  5 #include<algorithm>
  6 using namespace std;
  7 #define Maxn 100010
  8 
  9 struct node
 10 {
 11     int x,y,next;
 12 }t[2*Maxn];int len=0;
 13 
 14 int c[Maxn],fa[Maxn],size[Maxn],first[Maxn],dep[Maxn];
 15 int top[Maxn],w[Maxn],son[Maxn];
 16 int wl=0;
 17 
 18 void ins(int x,int y)
 19 {
 20     t[++len].x=x;t[len].y=y;
 21     t[len].next=first[x];first[x]=len;
 22 }
 23 
 24 struct nnode
 25 {
 26     int l,r,lc,rc,cl,cr,sum,lazy;
 27 }tr[2*Maxn];int tl=0;
 28 
 29 void dfs1(int x,int f)
 30 {
 31     dep[x]=dep[f]+1;
 32     size[x]=1;fa[x]=f;son[x]=0;
 33     for(int i=first[x];i;i=t[i].next) if(t[i].y!=f)
 34     {
 35         dfs1(t[i].y,x);
 36         size[x]+=size[t[i].y];
 37         if(size[t[i].y]>size[son[x]]) son[x]=t[i].y;
 38     }
 39 }
 40 
 41 void dfs2(int x,int tp)
 42 {
 43     top[x]=tp;w[x]=++wl;
 44     if(size[x]!=1) dfs2(son[x],tp);
 45     for(int i=first[x];i;i=t[i].next) if(t[i].y!=fa[x]&&t[i].y!=son[x])
 46     {
 47         dfs2(t[i].y,t[i].y);
 48     }
 49 }
 50 
 51 int build(int l,int r)
 52 {
 53     int x=++tl;
 54     tr[x].l=l;tr[x].r=r;tr[x].lazy=-1;tr[x].sum=0;
 55     if(l!=r)
 56     {
 57         int mid=(l+r)>>1;
 58         tr[x].lc=build(l,mid);
 59         tr[x].rc=build(mid+1,r);
 60     }
 61     return x;
 62 }
 63 
 64 void upd(int x)
 65 {
 66     if(tr[x].lazy==-1) return;
 67     tr[x].sum=1;tr[x].cl=tr[x].cr=tr[x].lazy;
 68     if(tr[x].l!=tr[x].r)
 69     {
 70         tr[tr[x].lc].lazy=tr[x].lazy;
 71         tr[tr[x].rc].lazy=tr[x].lazy;
 72     }
 73     tr[x].lazy=-1;
 74 }
 75 
 76 void change(int x,int l,int r,int y)
 77 {
 78     if(tr[x].l==l&&tr[x].r==r)
 79     {
 80         tr[x].lazy=y;
 81         return;
 82     }
 83     upd(x);
 84     int mid=(tr[x].l+tr[x].r)>>1;
 85     if(r<=mid) change(tr[x].lc,l,r,y);
 86     else if(l>mid) change(tr[x].rc,l,r,y);
 87     else
 88     {
 89         change(tr[x].lc,l,mid,y);
 90         change(tr[x].rc,mid+1,r,y);
 91     }
 92     upd(tr[x].lc);upd(tr[x].rc);
 93     tr[x].cl=tr[tr[x].lc].cl;
 94     tr[x].cr=tr[tr[x].rc].cr;
 95     tr[x].sum=tr[tr[x].lc].sum+tr[tr[x].rc].sum;
 96     if(tr[tr[x].lc].cr==tr[tr[x].rc].cl) tr[x].sum--;
 97 }
 98 
 99 void ffind(int x,int y,int z)
100 {
101     int f1=top[x],f2=top[y];
102     while(f1!=f2)
103     {
104         if(dep[f1]<dep[f2]) 
105         {
106             swap(f1,f2);
107             swap(x,y);
108         }
109         change(1,w[f1],w[x],z);
110         x=fa[f1];
111         f1=top[x];
112     }
113     if(dep[x]<dep[y]) swap(x,y);
114     change(1,w[y],w[x],z);
115 }
116 
117 int q1,q2,a1,a2;
118 int queryt(int x,int l,int r)
119 {
120     upd(x);
121     if(tr[x].l==l&&tr[x].r==r)
122     {
123         if(q1==tr[x].l) a1=tr[x].cl;
124         if(q2==tr[x].r) a2=tr[x].cr;
125         return tr[x].sum;
126     }
127     int mid=(tr[x].l+tr[x].r)>>1;
128     if(r<=mid) return queryt(tr[x].lc,l,r);
129     if(l>mid) return queryt(tr[x].rc,l,r);
130     int ans=queryt(tr[x].lc,l,mid)+queryt(tr[x].rc,mid+1,r);
131     if(tr[tr[x].lc].cr==tr[tr[x].rc].cl) ans--;
132     return ans;
133 }
134 
135 int query(int x,int y)
136 {
137     int cl=-1,cr=-1,f1=top[x],f2=top[y];
138     int ans=0;
139     while(f1!=f2)
140     {
141         if(dep[f1]>=dep[f2])
142         {
143             q1=w[f1];q2=w[x];
144             ans+=queryt(1,w[f1],w[x]);
145             if(a2==cl) ans--;
146             cl=a1;
147             x=fa[f1];f1=top[x];
148         }
149         else
150         {
151             q1=w[f2];q2=w[y];
152             ans+=queryt(1,w[f2],w[y]);
153             if(a2==cr) ans--;
154             cr=a1;
155             y=fa[f2];f2=top[y];
156         }
157     }
158     if(dep[x]<=dep[y])
159     {
160         q1=w[x];q2=w[y];
161         ans+=queryt(1,w[x],w[y]);
162         if(cl==a1) ans--;
163         if(cr==a2) ans--;
164     }
165     else
166     {
167         q1=w[y];q2=w[x];
168         ans+=queryt(1,w[y],w[x]);
169         if(cr==a1) ans--;
170         if(cl==a2) ans--;
171     }
172     return ans;
173 }
174 
175 int main()
176 {
177     int n,m;
178     scanf("%d%d",&n,&m);
179     for(int i=1;i<=n;i++) scanf("%d",&c[i]);
180     memset(first,0,sizeof(first));
181     for(int i=1;i<n;i++)
182     {
183         int x,y;
184         scanf("%d%d",&x,&y);
185         ins(x,y);ins(y,x);
186     }
187     dfs1(1,0);
188     dfs2(1,1);
189     build(1,n);
190     for(int i=1;i<=n;i++) change(1,w[i],w[i],c[i]);
191     char s[10];
192     while(m--)
193     {
194         scanf("%s",s);
195         if(s[0]=='Q')
196         {
197             int x,y;
198             scanf("%d%d",&x,&y);
199             printf("%d\n",query(x,y));
200         }
201         else
202         {
203             int x,y,z;
204             scanf("%d%d%d",&x,&y,&z);
205             ffind(x,y,z);
206         }
207     }
208     return 0;
209 }
[BZOJ2243]

 

2016-05-12 16:34:01

转载于:https://www.cnblogs.com/Konjakmoyu/p/5486202.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457935.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字信号处理的fpga实现_FPGA数字信号处理:通信类I/Q信号及产生

大侠好&#xff0c;欢迎来到FPGA技术江湖&#xff0c;江湖偌大&#xff0c;相见即是缘分。大侠可以关注FPGA技术江湖&#xff0c;在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源&#xff0c;或者一起煮酒言欢。大侠好&#xff0c;“宁夏李治廷”再一次和各位见…

iic通讯协议

IIC总线 一般串行数据通讯都有时钟和数据之分,有异步和同步之别. 有单线,双线和三线等. I2C肯定是2线的(不算地线). I2C协议确实很科学,比3/4线的SPI要好,当然线多通讯速率相对就快了. I2C的原则是: 在SCL1(高电平)时,SDA千万别忽悠!!! 否则,SDA下跳则"判罚"为&…

使用 Python 切割图片

刚好我有张 PNG 图片需要均匀切割&#xff0c;刚好我不会 PhotoShop&#xff0c;刚好我想用 Python 来练练手。 于是撸袖子码脚本。 import os from PIL import Imagedef splitimage(src, rownum, colnum, dstpath):img Image.open(src)w, h img.sizeif rownum < h and co…

python数据分析知识点_Python数据分析--Pandas知识点(三)

本文主要是总结学习pandas过程中用到的函数和方法, 在此记录, 防止遗忘. 下面将是在知识点一, 二的基础上继续总结. 前面所介绍的都是以表格的形式中展现数据, 下面将介绍Pandas与Matplotlib配合绘制出折线图, 散点图, 饼图, 柱形图, 直方图等五大基本图形. Matplotlib是python…

SPI通讯协议

SPI&#xff1a;高速同步串行口。是一种标准的四线同步双向串行总线。 SPI&#xff0c;是英语Serial Peripheral interface的缩写&#xff0c;顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM&#xff0c;FLASH&#x…

基于MVVM的知乎日报应用安卓源码

使用data binding , dagger2 , retrofit2和rxjava实现的&#xff0c;基于MVVM的知乎日报APP运行效果&#xff1a; <ignore_js_op> 使用说明&#xff1a; 项目结构android data binding来实现MVVM。dagger2来完成依赖注入。retrofit2rxjava实现restful的http请求。第三方类…

php签入html出来的影响seo吗_搜索引擎优化_SEO必备6大技能+SEO误区讲解!

大家好&#xff0c;我是逆冬&#xff0c;今天来分享一下实战SEO需要掌握什么样的技能以及SEO知识误区&#xff0c;本篇文章仅代表逆冬本人几年的经验、不见得适合每一个SEOer!下面就让逆冬本人来分析一下实战型SEO到底需要掌握什么技能。第1点&#xff1a;SEO需要不需要熟练掌握…

一种M2M业务的架构及实现M2M业务的方法

http://www.cnblogs.com/coryxie/p/3849764.html 技术领域 [0001] 本发明涉及通信技术领域&#xff0c;尤其涉及一种M2M业务的架构及实现M2M业务的方法。 背景技术 [0002] 随着通信技术的飞速发展以及通信技术与互联网技术的进一步融合&#xff0c;移动业务以及移动互联网技术普…

第二章 mybatis使用注解实现in查询(mysql)

mybatis实现in查询&#xff0c;两种方法&#xff1a; xml形式&#xff08;推荐&#xff09;注解方式&#xff08;个人喜欢注解&#xff0c;但是in场景可能不太适合注解&#xff09;代码&#xff1a; 1 Select("<script>" 2 "SELECT ID…

python面试代码题_python面试基础篇80题

1.为什么学习python?3.Python和Java、PHP、C、C#、C等其他语言的对比&#xff1f; C语言由于其底层操作特性和历史的积累&#xff0c;在嵌入式领域是当之无愧的王者。 PHP跨平台&#xff0c;性能优越&#xff0c;跟linux/unix结合比跟windows结合性能强45%,开发成本低,php5已经…

javascript 变量作用域

为什么80%的码农都做不了架构师&#xff1f;>>> javascript中的变量的作用域不同于java/c的变量规则。 1、在java/c中&#xff0c;如果有一个全局变量与一个局部变量重名&#xff0c;那么在局部变量的作用域中&#xff0c;局部变量会覆盖掉全局变量的值。当离开局部…

七月算法--12月机器学习在线班-第五次课笔记—回归

七月算法--12月机器学习在线班-第五次课笔记—回归 七月算法&#xff08;julyedu.com&#xff09;12月机器学习在线班学习笔记 http://www.julyedu.com 转载于:https://www.cnblogs.com/sweet-dew/p/5491271.html

公司网络搭建及×××到公司配置

一、公司路由器及子网配置公司192.168.1.0/24子网用于服务器集群&#xff0c;192.168.0.0/24子网用于办公子网&#xff0c;两个子网物理上不在一块。公司开业时&#xff0c;申请了电信40Mbps专线光纤&#xff0c;5个IP地址&#xff0c;网关&#xff1a;*.168.112.9 255.255.25…

蓝鸥零基础学习HTML5第五讲 CSS的基础样式

蓝鸥零基础学习HTML5第五讲 CSS的基础样式1.border<!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>Document</title><style>div {width:0px;height:0px;/*background: url("img/1.jpg…

C# 使用Conditional特性而不是#if条件编译

概述 #if/#endif 语句常用来基于同一份源码生成不同的编译结果&#xff0c;其中最常见的就是debug版和release版。但是这些工具在实际应用中并不是非常友好&#xff0c;因为它们容易被滥用&#xff0c;其代码页进而难以理解或调试。C#设计中考虑到这个问题&#xff0c;并提供了…

python安装opencv出现错误_Python3安装OpenCV出错,如何解决?

$ sudo pip install opencv-python $ sudo pip install opencv-contrib-python 参考下&#xff1a;python作业毕设&#xff1a;安装人工智能图像处理工具OpenCV​zhuanlan.zhihu.compython版本安装 适合所有平台&#xff1a; $ sudo pip install opencv-python $ sudo pip inst…

ioread32函数有关知识

x86体系和ARM体系的寻址方式是有差别的&#xff1a; 在x86下&#xff0c;为了能够满足CPU高速地运行&#xff0c;内存与CPU之间通过北桥相连并通过地址方式访问&#xff0c;而外设通过南桥与CPU相连并通过端口访问。 在ARM下也实现了类似的操作&#xff0c;通过两条不同的总线…

FPGA开发全攻略—— 调试

原文链接&#xff1a; FPGA开发全攻略连载之十三&#xff1a;FPGA实战开发技巧&#xff08;12&#xff09; 5.6 大规模设计的调试经验 在大规模设计的调试应该按照和设计理念相反的顺序&#xff0c;从底层测试&#xff0c;主要依靠ChipScope Pro 工具。下面主要介绍ChipScope P…

oracle创建表空间和用户授权

确定数据文件的存储地址&#xff0c;有两种情况&#xff0c;一个是明确存储地址&#xff0c;一个是跟其他表空间存在一个地方&#xff0c;但是不知道地址&#xff0c;这时候可以根据如下SQL进行查找&#xff1a;select t.* from sys.dba_data_files t where t.tablespace_name…

linux驱动 cdev,inode结构体

前面我们学习了字符设备结构体cdev Linux 字符设备驱动开发 &#xff08;一&#xff09;—— 字符设备驱动结构&#xff08;上&#xff09; 下面继续学习字符设备另外几个重要的 数据结构。 先看下面这张图&#xff0c;这是Linux 中虚拟文件系统、一般的设备文件与设备驱动程…