当前位置: 首页 > 编程日记 > 正文

BZOJ 4817: [Sdoi2017]树点涂色(LCT+树剖+线段树)

题目描述

Bob有一棵 nn 个点的有根树,其中1号点是根节点。Bob在每个点上涂了颜色,并且每个点上的颜色不同。

定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色。

Bob可能会进行这几种操作:

  • 1 x

把点 xx 到根节点的路径上所有的点染上一种没有用过的新颜色。

  • 2 x y

求 xx 到 yy 的路径的权值。

  • 3 x

在以x为根的子树中选择一个点,使得这个点到根节点的路径权值最大,求最大权值。

Bob一共会进行 mm 次操作

输入输出格式

输入格式:

第一行两个数 n,mn,m 。

接下来 n-1n1 行,每行两个数 a,ba,b ,表示 aa 与 bb 之间有一条边。

接下来 mm 行,表示操作,格式见题目描述

输出格式:

每当出现2,3操作,输出一行。

如果是2操作,输出一个数表示路径的权值

如果是3操作,输出一个数表示权值的最大值

输入输出样例

输入样例#1: 复制
5 6
1 2
2 3
3 4
3 5
2 4 5
3 3
1 4
2 4 5
1 5
2 4 5
输出样例#1: 复制
3
4
2
2

说明

共10个测试点

测试点1, 1\leq n,m\leq10001n,m1000

测试点2、3,没有2操作

测试点4、5,没有3操作

测试点6,树的生成方式是,对于 i(2\leq i \leq n)i(2in) ,在1到 i-1i1 中随机选一个点作为i的父节点。

测试点7, 1\leq n,m\leq 500001n,m50000

测试点8, 1\leq n \leq 500001n50000

测试点9,10,无特殊限制

对所有数据, 1\leq n \leq 10^51n105 , 1\leq m \leq 10^51m105

时间限制:1s

空间限制:128MB

题解

照例先膜一发大佬

说真的是道好题,LCT,树剖,dfs序,线段树都得用上

然后抄题解抄得不亦乐乎悲催的没有发现一个地方我和大佬思路是完全不一样的……

后来因为这个地方调了整整一个小时……我少了一个小时的睡觉时间!!!

先讲个思路……

操作一

因为颜色都不一样,也没有必要维护颜色了

然后我们能发现,任何时候同一个颜色必定是一条链,而且深度严格递增

很显然,因为每一次颜色修改只会在到根的路径上进行

所以每一个颜色都可以用LCT中的splay来维护了

并且我们发现,操作一不就是LCT中的access么?

操作二

每一个颜色都在一个splay中

所以一条路径上的颜色数量就是跨过了几个splay,也就是经过了几条虚边

于是split就好了显然是行不通的,因为因为乱搞会破坏掉关系

然后可以考虑用树上差分

$f[x]+f[y]-2*f[lca(x,y)]+1$就是这条路径上的颜色数量了(lca被减了两次要加回来)(f表示到根节点的虚边数量)

然后考虑怎么维护$f$

刚开始时是节点的深度

然后显然access的时候会对$f$有影响,一条边变虚,一条边变实

所以只要把原来的虚边指向的子树答案全部+1,实边指向的子树答案全部-1

这就是一个子树操作啦

用线段树+dfs序,可以很轻松的完成子树操作

操作三

查询其实和修改差不多

直接线段树查询即可

ps:写的树剖求LCA,结果因为原树和splay都要维护father,看了看大佬的板子只用了一个数组,结果莫名其妙T到死……算了滚去睡觉了(¦3[▓▓]实在太困了……

  1 //minamoto
  2 #include<iostream>
  3 #include<cstdio>
  4 using std::swap;
  5 using std::max;
  6 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
  7 char buf[1<<21],*p1=buf,*p2=buf;
  8 inline int read(){
  9     #define num ch-'0'
 10     char ch;bool flag=0;int res;
 11     while(!isdigit(ch=getc()))
 12     (ch=='-')&&(flag=true);
 13     for(res=num;isdigit(ch=getc());res=res*10+num);
 14     (flag)&&(res=-res);
 15     #undef num
 16     return res;
 17 }
 18 char obuf[1<<24],*o=obuf;
 19 inline void print(int x){
 20     if(x>9) print(x/10);
 21     *o++=x%10+48;
 22 }
 23 const int N=100005,M=N*20;
 24 int fa[N],f[N],ch[N][2],sz[N],son[N],dfn[N],rk[N];
 25 int dep[N],top[N],L[M],R[M],mx[M],lz[M],rs[N],mid[M];
 26 int head[N],Next[N<<1],ver[N<<1];
 27 int n,m,cnt,num,tot;
 28 inline void add(int u,int v){
 29     ver[++tot]=v,Next[tot]=head[u],head[u]=tot;
 30     ver[++tot]=u,Next[tot]=head[v],head[v]=tot;
 31 }
 32 void dfs1(int u){
 33     sz[u]=1,dep[u]=dep[f[u]]+1;
 34     dfn[u]=++num,rk[num]=u;
 35     for(int i=head[u];i;i=Next[i]){
 36         int v=ver[i];
 37         if(v==f[u]) continue;
 38         fa[v]=f[v]=u;
 39         dfs1(v);
 40         sz[u]+=sz[v];
 41         if(!son[u]||sz[v]>sz[son[u]]) son[u]=v;
 42     }
 43     rs[u]=num;
 44 }
 45 void dfs2(int u){
 46     if(!top[u]) top[u]=u;
 47     if(!son[u]) return;
 48     top[son[u]]=top[u],dfs2(son[u]);
 49     for(int i=head[u];i;i=Next[i]){
 50         int v=ver[i];
 51         if(v!=f[u]&&v!=son[u]) dfs2(v);
 52     }
 53 }
 54 inline int LCA(int u,int v){
 55     while(top[u]!=top[v])
 56     dep[top[u]]>dep[top[v]]?u=f[top[u]]:v=f[top[v]];
 57     return dep[u]<dep[v]?u:v;
 58 }
 59 inline void build(int p,int l,int r){
 60     L[p]=l,R[p]=r,mid[p]=(l+r)>>1;
 61     if(l==r)return (void)(mx[p]=dep[rk[l]]);
 62     build(p<<1,l,mid[p]),build(p<<1|1,mid[p]+1,r);
 63     mx[p]=max(mx[p<<1],mx[p<<1|1]);
 64 }
 65 #define pushdown if(lz[p]) update(p<<1,L[p],mid[p],lz[p]),update(p<<1|1,mid[p]+1,R[p],lz[p]),lz[p]=0
 66 void update(int p,int l,int r,int v){
 67     if(L[p]==l&&R[p]==r){mx[p]+=v,lz[p]+=v;return;}
 68     pushdown;
 69     if(r<=mid[p]) update(p<<1,l,r,v);
 70     else if(l>mid[p]) update(p<<1|1,l,r,v);
 71     else update(p<<1,l,mid[p],v),update(p<<1|1,mid[p]+1,r,v);
 72     mx[p]=max(mx[p<<1],mx[p<<1|1]);
 73 }
 74 int get(int v){
 75     int p=1;
 76     while(L[p]!=R[p]){
 77         pushdown;p=(p<<1)+(v>mid[p]);
 78         /*pushdown后面逗号竟然死循环了……*/
 79     }
 80     return mx[p];
 81 }
 82 int ask(int p,int l,int r){
 83     if(L[p]==l&&R[p]==r) return mx[p];
 84     pushdown;
 85     if(r<=mid[p]) return ask(p<<1,l,r);
 86     if(l>mid[p]) return ask(p<<1|1,l,r);
 87     return max(ask(p<<1,l,mid[p]),ask(p<<1|1,mid[p]+1,r));
 88 }
 89 #undef pushdown
 90 bool isroot(int x){
 91     return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;
 92 }
 93 void rotate(int x){
 94     int y=fa[x],z=fa[y],d=ch[y][1]==x;
 95     if(!isroot(y)) ch[z][ch[z][1]==y]=x;
 96     fa[x]=z,fa[y]=x,fa[ch[x][d^1]]=y,ch[y][d]=ch[x][d^1],ch[x][d^1]=y;
 97 }
 98 void splay(int x){
 99     for(int y=fa[x];!isroot(x);y=fa[x]){
100         if(!isroot(y))
101         rotate(x);
102         rotate(x);
103     }
104 }
105 int findroot(int x){
106     while(ch[x][0]) x=ch[x][0];
107     return x;
108 }
109 void access(int x){
110     for(int w,y=0;x;x=fa[y=x]){
111         splay(x);
112         if(ch[x][1]) w=findroot(ch[x][1]),update(1,dfn[w],rs[w],1);
113         if((ch[x][1]=y)) w=findroot(y),update(1,dfn[w],rs[w],-1);
114         /*把原来的子树变为虚的,整个子树的答案+1
115         然后新的子树答案-1*/
116     }
117 }
118 int main(){
119     //freopen("testdata.in","r",stdin);
120     int n=read(),m=read();
121     for(int i=1;i<n;++i){
122         int u=read(),v=read();
123         add(u,v);
124     }
125     dfs1(1),dfs2(1),build(1,1,n);
126     while(m--){
127         int opt=read(),x=read();
128         switch(opt){
129             case 1:{
130                 access(x);
131                 break;
132             }
133             case 2:{
134                 int y=read();
135                 print(get(dfn[x])+get(dfn[y])-get(dfn[LCA(x,y)])*2+1),*o++='\n';
136                 break;
137             }
138             case 3:{
139                 print(ask(1,dfn[x],rs[x])),*o++='\n';
140                 break;
141             }
142         }
143     }
144     fwrite(obuf,o-obuf,1,stdout);
145     return 0;
146 }

转载于:https://www.cnblogs.com/bztMinamoto/p/9420600.html

相关文章:

ls -l |wc -l命令多统计一行

#ls -l |wc -l注意&#xff1a;总用量也占用1行&#xff0c;所以统计出来的是14而不是13其他网友提醒 #ls -l |wc -l 就统计实际的行&#xff0c;放大就看出效果1和l不同

驱动数字经济加速,摩尔线程发布全新元计算架构MUSA和GPU产品

2022年3月30日&#xff0c;北京——摩尔线程今天举行主题为“元动力 创无限”的春季发布会。摩尔线程创始人兼CEO张建中解读了“元计算”这一产业趋势&#xff0c;并发布全新架构及系列重磅新品&#xff0c;包括&#xff1a;MUSA&#xff08;Moore Threads Unified System Arch…

HDU 4869 Turn the pokers(思维+组合公式+高速幂)

Turn the pokers 大意&#xff1a;给出n次操作&#xff0c;给出m个扑克。然后给出n个操作的个数a[i]&#xff0c;每一个a[i]代表能够翻的扑克的个数&#xff0c;求最后可能出现的扑克的组合情况。Hint Sample Input&#xff1a; 3 3 3 2 3 For the this example: 0 express fac…

马云打响本地生活消费攻坚战,饿了么获手淘一级入口,美团危险了

8月2日&#xff0c;细心的网友可以发现&#xff0c;手机淘宝App首页已上线“饿了么外卖”&#xff0c;饿了么成为手机淘宝首页的10个默认入口之一。这也就意味着以后手机淘宝用户可以通过淘宝首页新入口进入外卖服务&#xff0c;在应用内直接完成由饿了么提供的订餐外卖服务。 …

Linux文件,文件描述符以及dup()和dup2()

一.Linux中文件 可以分为4种&#xff1a;普通文件、目录文件、链接文件和设备文件。1、普通文件是用户日常使用最多的文件&#xff0c;包括文本文件、shell脚本、二进制的可执行和各种类型的数据。ls -lh 来查看某个文件的属性&#xff0c;可以看到有类似 -rw-r--r-- &#xff…

摩尔线程推出首款数据中心级全栈功能GPU:MTT S2000

2022年3月30日&#xff0c;北京——摩尔线程正式推出首款基于其先进架构MUSA统一系统架构&#xff08;Moore Threads Unified System Architecture&#xff09;打造的数据中心级多功能GPU产品MTT S2000。摩尔线程MTT S2000基于其第一代MUSA架构GPU芯片苏堤研发制成&#xff0c;…

jquery 获取 outerHtml 包含当前节点本身的代码

在开发过程中&#xff0c;jQuery.html() 是获取当前节点下的html代码&#xff0c;并不包含当前节点本身的代码&#xff0c;然后我们有时候确需要&#xff0c;找遍jQuery api文档也没有任何方法可以拿到。 看到有的人通过parent().html()&#xff0c;如果当前元素没有兄弟元素还…

修改CentOS yum源

解决在CentOS yum源下载慢的办法最近在虚拟机下面安装了个CentOS 5.5&#xff0c;使用yum更新时发现下载速度异常慢。可以修改yum的配置文件&#xff0c;把其镜像指向国内的服务器即可。 方案一&#xff1a; # cd /etc/yum.repos.d/ # mv CentOS-Base.repo CentOS-Base.repo.b…

带monkey的测流量!

为什么80%的码农都做不了架构师&#xff1f;>>> //public static void flow(){ //String command1 "adb shell monkey -p com.netease.newsreader.activity -s 500 -v 2000"; //String command2 "adb shell ps"; //String str"com.nete…

实现AI技术自立自强,国产深度学习框架面临三大难题

作为推动AI应用大规模落地的关键力量&#xff0c;深度学习框架的重要性日益凸显。它不仅关系国计民生的行业和领域广泛的应用&#xff0c;同样也对信息系统的科技安全有着决定性的意义。 “深度学习框架在人工智能技术体系中&#xff0c;处于贯通上下的腰部位置&#xff0c;它下…

关于Android H5混合开发遇到的问题

2019独角兽企业重金招聘Python工程师标准>>> 添加WebChromeClient&#xff0c;复写onJsAlert、onJsConfirm、onJsPrompt方法后&#xff0c;弹框异常退出问题 项目经理说&#xff0c;Android没有处理弹框&#xff0c;点击按钮没有反应&#xff0c;iOS就可以。于是就复…

手动配置lnmp环境

做php开发的&#xff0c;想要进一步提升自己&#xff0c;手动搭建开发环境&#xff0c;我想是必须经历的一个坎。虽然说有很多第三方集成环境可供使用&#xff0c;但我想说的是在你没有自己搭建过一次环境的时候&#xff0c;你没有太多的资本去“偷懒”。虽然我自己也是个菜鸟&…

负载均衡,会话保持,session同步

一&#xff0c;什么负载均衡一个新网站是不要做负载均衡的&#xff0c;因为访问量不大&#xff0c;流量也不大&#xff0c;所以没有必要搞这些东西。但是随着网站访问量和流量的快速增长&#xff0c;单台服务器受自身硬件条件的限制&#xff0c;很难承受这么大的访问量。在这种…

终于“打造”出了一个可以随时随地编程的工具

作者 | 老表来源丨简说Python分享概要 系统&#xff1a;阿里云ECS共享型n4服务器 1核2g 存储50g&#xff08;双十一便宜买的&#xff0c;180元/3年&#xff09;环境&#xff1a;自带python3.6.8 方便演示&#xff0c;直接使用它开始动手动脑 首先我们需要连接上服务器&#xff…

JVM堆 栈 方法区详解

一、栈 每当启用一个线程时&#xff0c;JVM就为他分配一个JAVA栈&#xff0c;栈是以帧为单位保存当前线程的运行状态 栈是由栈帧组成&#xff0c;每当线程调用一个java方法时&#xff0c;JVM就会在该线程对应的栈中压入一个帧 只有在调用一个方法时&#xff0c;才为当前栈分配一…

ECSHOP学习笔记

帮助 http://help.ecshop.com/index.phpECSHOP各文件夹功能说明 1、根目录&#xff1a;前台程序文件2、admin&#xff1a;后台程序文件夹 --根目录&#xff1a;后台程序文件 *.php文件 --help\zh_cn&#xff1a;各功能的帮助文件 *.xml文件 --images&#xff1a;后台页面…

Redis主从复制配置

环境描述Redis Master&#xff1a;192.168.1.100 6379(Ubuntu系统)Redis Slave1&#xff1a;192.168.1.101 6380(Ubuntu系统)Redis Slave2&#xff1a;192.168.1.102 6381(Ubuntu系统) 安装redis分别在192.168.1.100、192.168.1.101、192.168.1.102三台机器上安装redis&#xf…

利用 Python 打造一个语音合成系统

作者 | thedaydreamer来源丨CSDN博客背景一直对语音合成系统比较感兴趣&#xff0c;总想能给自己合成一点内容&#xff0c;比如说合成小说&#xff0c;把我下载的电子书播报给我听等等。语音合成系统其实就是一个基于语音合成的工具&#xff0c;但是这个东西由于很多厂家都提供…

干货:排名前 16 的 Java 工具类!

2019独角兽企业重金招聘Python工程师标准>>> 干货&#xff1a;排名前 16 的 Java 工具类&#xff01; 在Java中&#xff0c;工具类定义了一组公共方法&#xff0c;这篇文章将介绍Java中使用最频繁及最通用的Java工具类。以下工具类、方法按使用流行度排名&#xf…

使用ecshop电子商务系统的100个小问题

总结100条关于操作ecshop电子商务系统的小问题。1:如何修改网站"欢迎光临本店"回答:languages\zh_cn\common.php文件中&#xff0c; $_LANG[welcome] 欢迎光临本店;将他修改成你需要的字样。2:如何修改首页"热门搜索关键字"回答:后台->系统设置->网…

MyCAT常用分片规则之分片枚举

MyCAT支持多种分片规则&#xff0c;下面测试的这种是分片枚举。适用场景&#xff0c;列值的个数是固定的&#xff0c;譬如省份&#xff0c;月份等。 在这里&#xff0c;需定义三个值&#xff0c;规则均是在rule.xml中定义。 1. tableRule 2. function 3. mapFile 首先&#xff…

手把手带你打造一款 签名设计 的GUI图形界面!

作者 | 黄伟呢来源丨数据分析与统计学之美1.概述 整体布局呢我们已经搭建起来&#xff0c;唯一没有实现的一个步骤就是&#xff0c;用户每输入一个名字&#xff0c;就会将个性签名一并显示在这个窗口界面中&#xff0c;今天我就带着大家一起完成这个需求。今天的文章可以看成是…

跨域资源共享 CORS

简介 CORS是一个W3C标准&#xff0c;全称是"跨域资源共享"&#xff08;Cross-origin resource sharing&#xff09;。它允许浏览器向跨源服务器&#xff0c;发出XMLHttpRequest请求&#xff0c;从而克服了AJAX只能同源使用的限制。 CORS需要浏览器和服务器同时支持。…

SMARTY核心

http://www.smarty.net/http://smarty.php.net/manual/en/1.配置define("ROOTPATH",dirname(__FILE__)."/../");require_once("smarty/Smarty.class.php");/*** Smarty Template Class Initializtion*/if( constant( "ENABLED_TPL" ) …

5G+XR:让视频增强技术在工业领域大有所为

据工业和信息化部统计显示&#xff0c;目前中国累计建成并开通5G基站142.5万个&#xff0c;基站总数今年有望突破200万个。自5G正式商用以来&#xff0c;凭借其高带宽、广连接、低延时等优势&#xff0c;5G应用的实践逐渐从最初的单一化业务触及至更广泛的行业应用场景中。其中…

IE的安全性设定增加“我的电脑”的安全性设定

HKEY_CURRE-NT_USER\Software\Microsoft\Windows\CurrentVersion\InternetSettings\Zones\0&#xff0c;在右边窗口中找到DWORD值“Flags”&#xff0c;默认键值为十六进制的21(十进制33)&#xff0c;双击“Flags”&#xff0c;在弹出的对话框中将它的键值改为“1”即可&#x…

F# 4.5提供Spans、Match!等特性

F# 4.5预览版现已发布&#xff0c;其中提供了一系列新特性&#xff0c;包括对.NET Core 2.1的新原生类型Span\u0026lt;T\u0026gt;的支持、新关键字Match!等。\\类型Span意在实现底层代码指针操作的安全性和可预测性&#xff0c;这可使得很多情况下不必再分配内存&#xff0c;进…

ecshop transport.js/run() error:undefined

在使用ECshop的AJAX(即&#xff1a;transport.js) IE有时候会出现&#xff1a;ReferenceError: process_request is not defined&#xff0c;FF则出现&#xff1a;transport.js/run() error:undefined&#xff0c;其实这完全和transport.js无关。那么问题出在哪里呢&#xff1f…

为什么你不应该自行更新 Drupal 网站?

&#xff08;译注&#xff1a;这篇文章主要还是针对于非专业人员及个人Drupal站长&#xff0c;对于专业的 Drupal 团队和公司而言 Drupal 的升级更新都有规范的操作流程&#xff0c;完全是家常便饭&#xff0c;不可能出现文中出现的这些情况。尽管如此&#xff0c;里面也还是有…

用友发布新一代企业智能商旅及费控服务平台

3月31日&#xff0c;“便捷商旅 智能费控—2022用友BIP|商旅及费控服务新品发布会”成功举行。作为新一代企业智能商旅及费控服务平台&#xff0c;用友BIP商旅及费控服务以“连接 高效 智能 合规”为核心价值理念&#xff0c;致力于让5000万报销人拥有极致的体验&#xff0c;让…