解题: SDOI 2011 染色

题面

强行把序列问题通过树剖套在树上。。。算了算是回顾了一下树剖的思想=。=

每次树上跳的时候注意跳的同时维护当前拼出来的左右两条链的靠上的端点,然后拼起来的时候讨论一下拼接点,最后一下左右两边的端点都要考虑

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 using namespace std;
  5 const int N=100005;
  6 struct a
  7 {
  8     int cnt;
  9     int lc,rc;
 10 };
 11 int num[N],nmb[N],val[4*N],lcol[4*N],rcol[4*N],laz[4*N];
 12 int siz[N],dep[N],anc[N],imp[N],top[N],dfn[N];
 13 int p[N],noww[2*N],goal[2*N];
 14 int n,m,t1,t2,t3,cnt,tot;
 15 char rd[2];
 16 void link(int f,int t)
 17 {
 18     noww[++cnt]=p[f];
 19     goal[cnt]=t,p[f]=cnt;
 20 }
 21 void DFS(int nde,int fth,int dth)
 22 {
 23     int tmp=0;
 24     siz[nde]=1,anc[nde]=fth,dep[nde]=dth;
 25     for(int i=p[nde];i;i=noww[i])
 26         if(goal[i]!=fth)
 27         {
 28             DFS(goal[i],nde,dth+1);
 29             siz[nde]+=siz[goal[i]];
 30             if(siz[goal[i]]>tmp)
 31                 tmp=siz[goal[i]],imp[nde]=goal[i];
 32         }
 33 }
 34 void MARK(int nde,int tpp)
 35 {
 36     dfn[nde]=++tot,nmb[tot]=num[nde],top[nde]=tpp;
 37     if(imp[nde])
 38     {
 39         MARK(imp[nde],tpp);
 40         for(int i=p[nde];i;i=noww[i])
 41             if(goal[i]!=anc[nde]&&goal[i]!=imp[nde])
 42                 MARK(goal[i],goal[i]);
 43     }
 44 }
 45 void pushup(int nde)
 46 {
 47     int ls=2*nde,rs=2*nde+1;
 48     lcol[nde]=lcol[ls],rcol[nde]=rcol[rs];
 49     val[nde]=val[ls]+val[rs]-(rcol[ls]==lcol[rs]);
 50 }
 51 void create(int nde,int l,int r)
 52 {
 53     if(l==r)
 54         val[nde]=1,lcol[nde]=rcol[nde]=nmb[l];
 55     else
 56     {
 57         int mid=(l+r)/2,ls=2*nde,rs=2*nde+1;
 58         create(ls,l,mid),create(rs,mid+1,r);
 59         pushup(nde);
 60     }
 61 }
 62 void release(int nde,int l,int r)
 63 {
 64     if(laz[nde])
 65     {
 66         int ls=2*nde,rs=2*nde+1;
 67         laz[ls]=lcol[ls]=rcol[ls]=laz[nde];
 68         laz[rs]=lcol[rs]=rcol[rs]=laz[nde];
 69         val[ls]=val[rs]=1; laz[nde]=0;
 70     }
 71 }
 72 void change(int nde,int l,int r,int nl,int nr,int task)
 73 {
 74     if(l>nr||r<nl)
 75         return ;
 76     else if(l>=nl&&r<=nr)
 77         val[nde]=1,lcol[nde]=rcol[nde]=laz[nde]=task;
 78     else
 79     {
 80         int mid=(l+r)/2,ls=2*nde,rs=2*nde+1; release(nde,l,r);
 81         change(ls,l,mid,nl,nr,task),change(rs,mid+1,r,nl,nr,task);
 82         pushup(nde);
 83     }    
 84 }
 85 a query(int nde,int l,int r,int nl,int nr)
 86 {
 87     if(l>=nl&&r<=nr)
 88         return (a){val[nde],lcol[nde],rcol[nde]};
 89     else
 90     {
 91         int mid=(l+r)/2,ls=2*nde,rs=2*nde+1; release(nde,l,r); 
 92         if(nr<=mid) return query(ls,l,mid,nl,nr);
 93         if(nl>mid) return query(rs,mid+1,r,nl,nr);
 94         a r1=query(ls,l,mid,nl,nr),r2=query(rs,mid+1,r,nl,nr),ret;
 95         ret.lc=r1.lc,ret.rc=r2.rc,ret.cnt=r1.cnt+r2.cnt-(r1.rc==r2.lc);
 96         return ret;
 97     }    
 98 }
 99 void path_change(int x,int y,int v)
100 {
101     while(top[x]!=top[y])
102     {
103         if(dep[top[x]]<dep[top[y]]) swap(x,y);
104         change(1,1,n,dfn[top[x]],dfn[x],v); x=anc[top[x]];
105     }
106     if(dep[x]>dep[y]) swap(x,y);
107     change(1,1,n,dfn[x],dfn[y],v); return ;
108 }
109 int path_query(int x,int y)
110 {
111     int rt=0,ll=-1,rr=-1;
112     while(top[x]!=top[y])
113     {
114         if(dep[top[x]]<dep[top[y]]) swap(x,y),swap(ll,rr);
115         a ret=query(1,1,n,dfn[top[x]],dfn[x]); x=anc[top[x]];
116         rt+=ret.cnt-(ll==ret.rc); ll=ret.lc;
117     }
118     if(dep[x]>dep[y]) swap(x,y),swap(ll,rr);
119     a ret=query(1,1,n,dfn[x],dfn[y]); rt+=ret.cnt-(ll==ret.lc)-(rr==ret.rc); 
120     return rt;
121 }
122 int main ()
123 {
124     scanf("%d%d",&n,&m);
125     for(int i=1;i<=n;i++)
126         scanf("%d",&num[i]);
127     for(int i=1;i<n;i++)    
128         scanf("%d%d",&t1,&t2),link(t1,t2),link(t2,t1);
129     DFS(1,0,1); MARK(1,1); create(1,1,n);
130     while(m--)
131     {
132         scanf("%s",rd);
133         if(rd[0]=='C')
134             scanf("%d%d%d",&t1,&t2,&t3),path_change(t1,t2,t3);
135         else 
136             scanf("%d%d",&t1,&t2),printf("%d\n",path_query(t1,t2));
137     }
138     return 0;
139 }
View Code

 

转载于:https://www.cnblogs.com/ydnhaha/p/9743416.html

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

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

相关文章

java.lang.OutOfMemoryError: PermGen space

使用Tomcat报java.lang.OutOfMemoryError: PermGen space错误时&#xff0c;这是tomcat的内存不够的原因&#xff0c;也就是tomcat的内存溢出。 这是我们只要在tomcat的配置下添加服务内存就可以了&#xff0c;添加内存方法&#xff0c;只要加入 -Xms256M -Xmx512M -XX:PermS…

怎么把jad反编译放到Eclipse中

可以在CSDN下载页上进行下载哦&#xff0c;免费的哦&#xff0c;不要积分。 http://download.csdn.net/detail/farxix/9838195 我们把下载下来的jad资源包解压出来&#xff0c;如下图&#xff1a; 首先&#xff1a; 然后&#xff1a; 打开eclipse进行设置&#xff0…

一些很有意思的JS现象

关于JS对象的 . 和 [] []除了属性名可以比 .天马行空以外(比如我们要添加一个为33-abc的属性&#xff0c;一定得用[]))&#xff0c;还有一个实际操作中的区别 Object.is的作用和两个奇特的现象 还记得isNaN的作用&#xff0c;但有时候我们就想直接比较两个数据&#xff0c;总不…

怎么查看eclipse的版本号

在电脑上找到你安装eclipse的路径&#xff0c;找到readme点击打开&#xff0c;如下图所示&#xff1a; 查看版本号&#xff1a;

Vue2.0 脚手架代码详解

参考作者&#xff1a;https://www.jianshu.com/p/2b661d01eaf8 只是为了方便个人学习。 来看一下脚手架创建后的项目目录 说明&#xff1a;在*.vue文件&#xff0c;template标签里写html代码&#xff0c;且template直接子级只能有一个标签。style标签里写样式&#xff0c;scrip…

如何使用多个端口访问tomcat

查端口号是否被占用 在cmd中使用 netstat -ano 命令&#xff1b; 处理端口号使用命令 taskkill /pid 1234 ( 8080指的是端口号对应的PID 号 ) 在使用tomcat服务器做为开发使用时&#xff0c;如果我们有多个项目要发布、启动时怎么办呢&#xff0c;在一个tomcat下添加多个项目…

win10 安装mysql 8.0.12

按照CSDN以及博客园的其他教程, 之前安装过几次都有或多或少的bug 主要安装步骤: 1.配置my.ini文件 2.管理员进入终端, 切换到.../bin目录下进行操作 3.指令操作: 1) mysqld --initialize --console              此指令正常情况下, 可以自动生成一项随机密码, 一…

查看端口占用情况

当tomcat被占用时&#xff0c;可以使用命令行来解决占用问题&#xff1b; 打开cmd 输入netstat -ano|findstr 7001 即可找到相应的pid号 7016 再使用taskkill /f /pid 7016 就可以去除占用端口号情况。

译:1. RabbitMQ Java Client 之 Hello World

这些教程介绍了使用RabbitMQ创建消息传递应用程序的基础知识。您需要安装RabbitMQ服务器才能完成教程 1. 打造第一个Hello World 程序 RabbitMQ是一个消息代理&#xff1a;它接受和转发消息。你可以把它想象成一个邮局&#xff1a;当你把你想要发布的邮件放在邮箱里时&#xff…

基于SpringBoot 2.0正式版的SpringCloud的微服务实战项目搭建

Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具&#xff0c;它为基于JVM的云应用开发中的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。 Spring Cloud包含…

structc 开源框架介绍

引言 - 一切才刚刚开始 structc 是 C 结构基础库. 简单可复用. structc - https://github.com/wangzhione/structc 之前也描述过几次 structc, 文字多代码风格少. 最近加班不多, 准备详细解说哈其思考初衷. 0.0 整体结构 structc ├── extern ├── LICENSE ├── Makefil…

CSS颜色

CSS的颜色可以通过以下方法指定&#xff1a; 十六进制颜色RGB颜色RGBA颜色HSL色彩HSLA颜色 十六进制颜色 指定一个十六进制的颜色其组成部分是&#xff1a;#RRGGBB&#xff0c;其中RR&#xff08;红色&#xff09;&#xff0c;GG&#xff08;绿色&#xff09;和BB&#xff08;蓝…

CAN总线(1)--初探(更新中)

前言&#xff1a; CAN总线可以控制可以使用Xilinx中IP核来直接实现&#xff0c;也可以使用专用的CAN芯片&#xff08;例如&#xff1a;SJA1000&#xff09;通过单片机和FPGA驱动控制来实现&#xff1b; 目前是使用控制器SJA1000来进行实现&#xff1b; CAN总线控制器-SJA1000 结…

如何给代码自动添加注释?

丰富的注释和良好的代码规范&#xff0c;对于代码的阅读性和可维护性起着至关重要的作用。几乎每个公司对这的要求还是比较严格的&#xff0c;往往会形成自己的一套编码规范。但是再实施过程中&#xff0c;如果全靠手动完成&#xff0c;不仅效率低下&#xff0c;还难以保证真正…

js第一天

1.JS介绍 全称叫JavaScript&#xff0c;但不是Java&#xff0c;js是一门前台语言&#xff0c;而Java是后台语言。 js的作者是布兰登.艾奇 前台语言&#xff1a;运行在客户端的 后台语言&#xff1a;跟数据库有关 2.JS可以干什么&#xff1f; 页面特效&#xff0c;开发页面游戏&…

Ubuntu 如何为 XMind 添加快速启动方式和图标

目录 Ubuntu 如何为 XMind 添加快速启动方式和图标Ubuntu 如何为 XMind 添加快速启动方式和图标 按照教程Ubuntu16.04LTS安装XMind8并创建运行图标进行Xmind安装 下载安装包打开~/Download文件夹&#xff0c;解压.zip压缩包&#xff0c;之后在解压的文件夹中打开终端&#xff0…

Luogu P4205 [NOI2005]智慧珠游戏

P4205 [NOI2005]智慧珠游戏 题意 题目描述 智慧珠游戏拼盘由一个三角形盘件和\(12\)个形态各异的零件组成。拼盘的盘 件如图\(1\)所示 对于由珠子构成的零件&#xff0c;可以放到盘件的任一位置&#xff0c;条件是能有地方放&#xff0c;且尺寸合适&#xff0c;所有的零件都允许…

Spring Boot + Spring Cloud 构建微服务系统(三):服务消费和负载(Feign)

Spring Cloud Feign Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端。它使得编写Web服务客户端变得更加简单。我们只需要通过创建接口并用注解来配置它既可完成对Web服务接口的绑定。它具备可插拔的注解支持&#xff0c;包括Feign注解、JAX-RS注解。它也…

Scrapy突破反爬虫的限制

7-1 爬虫和反爬的对抗过程以及策略基本概念爬虫&#xff1a;自动获取网站数据的程序&#xff0c;关键是批量的获取反爬虫&#xff1a;使用技术手段防止爬虫程序的方法误伤&#xff1a;反爬技术将普通用户识别为爬虫&#xff0c;如果误伤过高&#xff0c;效果再好也不能用一般ip…

wpf控件

控件——载应用程序上与用户进行交互的元素 所有的控件都是继承自System.windows.Control类&#xff0c;该类提供了一些基本的属性 1、 设置控件对齐方式 2、 设置Tab键顺序 3、 支持绘制背景&#xff0c;前景和边框 4、 支持格式化文本内容的尺寸和字体 Background&#xff1a…