bzoj2243

2243: [SDOI2011]染色

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 6753  Solved: 2496
[Submit][Status][Discuss]

Description

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

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

2、询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”、“222”和“1”。

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

Input

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

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

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

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

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

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

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]之间。

Source

第一轮day1

树链剖分练习。

1.每次查询时记得跳上去时,要把两个端点是否相等计算进去。color[num[fa[top[x]]]]==color[num[top[x]]]记得判断,这里用单点查询即可。

(这里不会出现错误,有人会想:fa[top[x]]会不会跳到了这两个点的路径外?不会,因为当dep[top[x]]<dep[top[x]时交换x,y所以当x已经在最上面的区间时,他就不会动了,只有y会向上跳)

2.每次查询时query(l,mid) query(mid+1,r)时也要判断rc[x*2]==lc[x*2+1](查询时)当且仅当a<=mid<b时要判断;(a,b是要查询的区间),因为如果这两个端点不在查询的区间里,那么也就没有必要判断了。

3.tag要先变成-1,颜色可能为0

4.pushdown是把下面节点的信息修改,不是仅仅修改他的tag。(不清楚)

一组数据:

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

这组数据说明了第二条

 

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 200010
struct edge 
{int to,nxt;
}e[N];
int n,m,cnt,k;
int head[N],size[N],rc[N<<2],lc[N<<2],sum[N<<2],tag[N<<2];
int num[N],c[N],fa[N],top[N],son[N],dep[N];
void link(int u,int v)
{e[++cnt].nxt=head[u];head[u]=cnt;e[cnt].to=v;
}
int min(int x,int y)
{return x<y?x:y;
}
int max(int x,int y)
{return x>y?x:y;
}
void dfs1(int u,int Fa)
{int Max=0; size[u]=1;for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(v!=Fa){fa[v]=u;dep[v]=dep[u]+1;dfs1(v,u);if(size[v]>Max){son[u]=v;Max=size[v];}size[u]+=size[v];}}
}
void dfs2(int u,int acs,int Fa)
{top[u]=acs; num[u]=++k;if(son[u]) dfs2(son[u],acs,u);for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(v!=Fa&&v!=son[u]) dfs2(v,v,u);}
}
void pushdown(int x)
{if(tag[x]!=-1){tag[x*2+1]=tag[x*2]=tag[x];sum[x*2+1]=sum[x*2]=1;lc[x*2+1]=lc[x*2]=rc[x*2+1]=rc[x*2]=tag[x];tag[x]=-1;}
}
void update(int l,int r,int x,int a,int b,int c)
{if(l>b||r<a) return;if(l>=a&&r<=b){tag[x]=lc[x]=rc[x]=c; sum[x]=1;return;}if(r<=b) rc[x]=c;if(l>=a) lc[x]=c;pushdown(x);update(l,(l+r)/2,x*2,a,b,c);update((l+r)/2+1,r,x*2+1,a,b,c);sum[x]=sum[x*2]+sum[x*2+1]-(rc[x*2]==lc[x*2+1]);
}
int query(int l,int r,int x,int a,int b)
{if(l>b||r<a) return 0;if(l>=a&&r<=b) return sum[x];pushdown(x);int ret=0;ret+=query(l,(l+r)/2,x*2,a,b);ret+=query((l+r)/2+1,r,x*2+1,a,b);if((l+r)/2>=a&&(l+r)/2<b) ret-=(rc[x*2]==lc[x*2+1]);return ret;
}
int pquery(int l,int r,int x,int pos)
{if(l==r) return tag[x];pushdown(x);if(pos>(l+r)/2) return pquery((l+r)/2+1,r,x*2+1,pos);else return pquery(l,(l+r)/2,x*2,pos);
}
void ask(int x,int y)
{int ans=0;while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y);ans+=query(1,n,1,num[top[x]],num[x]);
//        printf("color=%d\n",pquery(1,n,1,num[fa[top[x]]]));ans-=(pquery(1,n,1,num[top[x]])==pquery(1,n,1,num[fa[top[x]]]));        x=fa[top[x]];}ans+=query(1,n,1,min(num[x],num[y]),max(num[x],num[y]));printf("%d\n",ans);
}
void change(int x,int y,int c)
{while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y);update(1,n,1,num[top[x]],num[x],c);x=fa[top[x]];}update(1,n,1,min(num[x],num[y]),max(num[x],num[y]),c);
}
int main()
{memset(tag,-1,sizeof(tag));
//    lc[0]=rc[0]=-1;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&c[i]);}for(int i=1;i<n;i++){int u,v; scanf("%d%d",&u,&v);link(u,v); link(v,u);}dfs1(1,0);dfs2(1,1,0);for(int i=1;i<=n;i++){update(1,n,1,num[i],num[i],c[i]);}while(m--){char s[10]; scanf("%s",s);    if(s[0]=='Q'){int x,y; scanf("%d%d",&x,&y);ask(x,y);}if(s[0]=='C'){int x,y,c; scanf("%d%d%d",&x,&y,&c);change(x,y,c);}    }return 0;
} 
View Code

 

转载于:https://www.cnblogs.com/19992147orz/p/6250350.html

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

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

相关文章

eclipse linux windows 乱码,Ubuntu下Eclipse打开Windows下的工程文件乱码解决办法

Eclipse在Windows下默认使用的是GBK(包括GB2312)编码&#xff0c;而在Linux系统默认使用的是UTF-8编码&#xff0c;并且eclipse编码设置下拉列表不提供GBK编码可选项。如果eclipse打开工程或者文本乱码&#xff0c;基本可以肯定(因为常用的就这两种)这个工程/文本使用的是GBK编…

linux桌面旋转了180度,[多图]回顾每一款默认Ubuntu壁纸

每个默认的Ubuntu壁纸Ubuntu 4.10’Warty Warthog’当人们抱怨Ubuntu发行版中的“ 褐色 ”时&#xff0c;我经常想回到Ubuntu的第一张墙纸&#xff0c;以便他们的意见可以转变为“上下文”。事后看来&#xff0c;这只墙纸完全是一块毫无生气的带有徽标的棕色块。当然&#xff0…

【转】Apache 配置虚拟主机三种方式

Apache 配置虚拟主机三种方式 原文博客http://www.cnblogs.com/hi-bazinga/archive/2012/04/23/2466605.html一、基于IP 1. 假设服务器有个IP地址为192.168.1.10&#xff0c;使用ifconfig在同一个网络接口eth0上绑定3个IP&#xff1a; [rootlocalhost root]# ifconfig eth0:1 1…

linux weblogic 防火墙,本地访问weblogic控制台无反应,关闭linux操作系统防火墙

有时候&#xff0c;我们在Linux操作系统上成功启动了weblogic&#xff0c;也查看了7001端口的状态是开启的。但是访问weblogic控制台没有反应&#xff0c;也没有报错。使用 netstat -ano | grep 7001 查看端口的状态可是访问weblogic控制台&#xff0c;还是没有反应。我们在本地…

fedora linux搜狗输入法,在Fedora 28系统下安装搜狗输入法

以下介绍在Fedora 28系统下安装搜狗输入法&#xff0c;也适用在Fedora 27下的安装&#xff0c;亲测可以。先声明一下&#xff0c;在Fedora 27及以后版本中出现的输入框候选词界面变形但不影响使用。第一步&#xff1a;安装fzug软件源具体方法如下&#xff1a;1.添加 FZUG 源Fed…

linux reboot命 过程,IDRAC安装dell服务器操作系统(linux or windows),用到生命周期管理器...

1、首先给服务器装上idrac模块&#xff0c;然后给idrac配置一个远程IP&#xff0c;用作管理2、在web界面输入IP&#xff0c;弹出以下界面&#xff0c;输入账号密码登录3、认证成功后&#xff0c;点击虚拟控制台启动4、进入如下界面&#xff0c;点击菜单栏的《虚拟介质》&#x…

DroidPlugin插件化开发

360手机助手使用的 DroidPlugin&#xff0c;它是360手机助手团队在Android系统上实现了一种插件机制。它可以在无需安装、修改的情况下运行APK文件,此机制对改进大型APP的架构&#xff0c;实现多团队协作开发具有一定的好处。 它是一种新的插件机制&#xff0c;一种免安装的运行…

io wait linux,另辟蹊径-诊断工具之 IO wait

导读最近在做日志的实时同步&#xff0c;上线之前是做过单份线上日志压力测试的&#xff0c;消息队列和客户端、本机都没问题&#xff0c;但是没想到上了第二份日志之后&#xff0c;问题来了&#xff1a;1、问题&#xff1a;集群中的某台机器 top 看到负载巨高&#xff0c;集群…

Oracle第二天

Oracle第二天 整体安排&#xff08;3天&#xff09; 第一天&#xff1a;Oracle的安装配置&#xff08;服务端和客户端&#xff09;&#xff0c;SQL增强&#xff08;单表查询&#xff09;。 第二天&#xff1a;SQL增强&#xff08;多表查询、子查询、伪列-分页&#xff09;&…

linux搭建虚拟化平台报告,部署KVM虚拟化平台------搭建(示例代码)

一 、部署KVM虚拟化平台hyper-v是windows中的虚拟化1、KVM模块直接整合在Linux内核中&#xff0c;kvm是内核模块&#xff0c;虚拟机与kvm模块之间为管理工具2、KVM组成1.KVM Driver---虚拟机创建---虚拟机内存分配---虚拟CPU寄存器读写---虚拟CPU运行2.QEMU (经过简化与修改)--…

linux 选择文件指定的行数据类型,06练习题

1.如何删除一个非空子目录/tmp&#xff1f; BA. del /tmp/*B. rm -rf /tmpC. rm -Ra /tmp/*D. rm -rf /tmp/*2.存放linux默认系统日志文件是 BA./var/log/dmesg #系统启动时日志B./var/log/messages #系统日志C./var/log/secure #登录相关 安全3.用命令ls -l显示出来文件txt的描…

C#多线程编程

C#多线程编程 一、使用线程的理由 1、可以使用线程将代码同其他代码隔离&#xff0c;提高应用程序的可靠性。 2、可以使用线程来简化编码。 3、可以使用线程来实现并发执行。 二、基本知识 1、进程与线程&#xff1a;进程作为操作系统执行程序的基本单位&#xff0c;拥有应用程…

《DSP using MATLAB 》示例Example6.3

代码&#xff1a; C0 0; B1 [2 4; 3 1]; A1 [1 1 0.9; 1 0.4 -0.4]; B2 [0.5 0.7; 1.5 2.5; 0.8 1]; A2 [1 -1 0.8; 1 0.5 0.5; 1 0 -0.5]; [b1, a1] par2dir(C0, B1, A1)[b2, a2] par2dir(C0, B2, A2)b conv(b1, b2) % Overall direct form numerator a conv(a1…

简单说明c语言程序步骤,C语言的入门简介和三个简单的C语言程序详细说明

学习一种编程语言&#xff0c;最重要的是建立一个练习环境&#xff0c;边学边练才能学好。Keil软件是目前最流行开发80C51系列单片机的软件&#xff0c;Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案&#xff0c;通过一个集成…

java入门,学习笔记

编译 通过javac编译java程序&#xff0c;会编译出一个后缀为class的文件&#xff0c;我们再通过java虚拟机&#xff08;jvm&#xff09;执行编译后的java程序。 在java中始终有一个main函数&#xff0c;它作为程序的入口&#xff0c;程序从这个入口开始执行一直到结束。 public…

linux命令之ifconfig详细解释

依赖于ifconfig命令中使用一些选项属性&#xff0c;ifconfig工具不仅可以被用来简单地获取网络接口配置信息&#xff0c;还可以修改这些配置。 1&#xff0e;命令格式&#xff1a; ifconfig [网络设备] [参数] 2&#xff0e;命令功能&#xff1a; ifconfig 命令用来查看和配置网…

loadrunner controller:实时查看VUser的运行情况

1) 如下图&#xff0c;在Run标签页&#xff0c;点击“Vusers...”打开Vuser窗口&#xff1b; 2) 如下图选中一个Vuser点击按钮可以打开Run-Time Viewer窗口&#xff0c;RTV窗口页面显示的就是该Vuser当前的操作&#xff1b; 3) 如下图所示&#xff0c;…

【二色汉诺塔 】

/* 二色汉诺塔 */#include <stdio.h>void hanoi(int disks, char sources, char temp, char target) {if(disks 1){printf("move disk from %c to %c \n", sources, target);printf("move disk from %c to %c \n", sources, target);}else{hanoi(d…

c语言凸包算法,基于C语言的凸包算法实现

基于C语言的凸包算法实现非计算机专业&#xff0c;代码有些的不好的地方&#xff0c;大佬轻喷^ _ ^根据要求&#xff0c;需要使用C语言实现凸包算法——Graham扫描法&#xff0c;本文将从算法理解、实现思路、遇到的问题及其解决方案三个方面来阐述实现过程。算法理解凸包算法G…

VS Code 使用小技巧

所有插件查找地址&#xff08;https://marketplace.visualstudio.com/&#xff09; 编码快捷方式&#xff08;http://docs.emmet.io/cheat-sheet/&#xff09; 安装插件出现 错误unable to verify the first certificate &#xff08;无法确认第一证书&#xff09;   解决方…