bzoj 4573: [Zjoi2016]大森林

Description

小Y家里有一个大森林,里面有n棵树,编号从1到n。一开始这些树都只是树苗,只有一个节点,标号为1。这些树
都有一个特殊的节点,我们称之为生长节点,这些节点有生长出子节点的能力。小Y掌握了一种魔法,能让第l棵树
到第r棵树的生长节点长出一个子节点。同时她还能修改第l棵树到第r棵树的生长节点。她告诉了你她使用魔法的
记录,你能不能管理她家的森林,并且回答她的询问呢?

Solution

有点神仙,看了题解的做法
首先显然要离线,否则空间都是错的,这样维护一棵树就好了
然后发现都是区间修改,扫描线维护一下节点就好了
但是还有删除节点这样的操作,复杂度保证不了

不如先把树的形态都建出来,对于 \(1\)\(n\) 的公共部分我们一起考虑,不同的部分就直接新建节点
考虑维护添加,删除操作的复杂度
我们每产生一个新的生长节点就新建一个虚点,然后把新长出来的都接上去
如果按加入时间考虑的话,有很多连续的节点都是同一个父亲,所以我们用一个虚点暂时代替它们的父亲
然后对于 \(1\)\(n\) 的不同的树,它们的父亲是不一样的,因为建立了这个虚点,所以只需要把虚点的父亲变一下,就可以达到把所有的点的父亲都改变的效果了

具体的也说不清楚,看代码比较直观.....

#include<bits/stdc++.h>
using namespace std;
template<class T>void gi(T &x){int f;char c;for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
}
const int N=4e5+10;
int n,m,ch[N][2],fa[N],a[N],w[N];
inline void upd(int x){w[x]=w[ch[x][0]]+w[ch[x][1]]+a[x];}
inline bool isrt(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
inline void rotate(int x){int y=fa[x];bool t=ch[y][1]==x;ch[y][t]=ch[x][!t];fa[ch[y][t]]=y;ch[x][!t]=y;fa[x]=fa[y];if(!isrt(y))ch[fa[y]][ch[fa[y]][1]==y]=x;fa[y]=x;upd(y);upd(x);
}
inline void splay(int x){while(!isrt(x)){int y=fa[x],p=fa[y];if(isrt(y))rotate(x);else if((ch[p][0]==y)==(ch[y][0]==x))rotate(y),rotate(x);else rotate(x),rotate(x);}
}
inline int access(int x){int y=0;while(x)splay(x),ch[x][1]=y,upd(x),x=fa[y=x];return y;
}
inline void link(int x,int y){access(x);splay(x);fa[x]=y;
}
inline void cut(int x){access(x);splay(x);fa[ch[x][0]]=0;ch[x][0]=0;upd(x);
}
inline int query(int x,int y){int ret=0,t;access(x);splay(x);ret+=w[x];t=access(y);splay(y);ret+=w[y];access(t);splay(t);ret-=w[t]<<1;return ret;
}
int L[N],R[N],id[N],cnt=2,ans[N],top=0;
struct data{int ty,p,x,y;inline bool operator <(const data &t)const{if(p!=t.p)return p<t.p;return ty<t.ty;}
}q[N];
int main(){freopen("pp.in","r",stdin);freopen("pp.out","w",stdout);cin>>n>>m;int op,l,r,x,y=2,tp=0,ID=1;L[1]=1;R[1]=n;id[1]=1;w[1]=a[1]=1;L[2]=1;R[2]=n;w[2]=a[2]=0;link(2,1);for(int i=1;i<=m;i++){gi(op);gi(l);gi(r);if(op==0){a[++cnt]=1;w[cnt]=1;L[++ID]=l;R[ID]=r;id[ID]=cnt;link(cnt,y);}else if(op==1){gi(x);a[++cnt]=0;w[cnt]=0;l=max(l,L[x]);r=min(r,R[x]);if(l<=r){link(cnt,y);q[++top]=(data){-1,l,cnt,id[x]};q[++top]=(data){-1,r+1,cnt,y};y=cnt;}}else gi(x),q[++top]=(data){++tp,l,id[r],id[x]};}sort(q+1,q+top+1);for(int i=1,j=1;i<=n;i++){while(j<=top && q[j].p==i){if(q[j].ty==-1)cut(q[j].x),link(q[j].x,q[j].y);else ans[q[j].ty]=query(q[j].x,q[j].y);j++;}}for(int i=1;i<=tp;i++)printf("%d\n",ans[i]);return 0;
}

转载于:https://www.cnblogs.com/Yuzao/p/8968717.html

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

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

相关文章

Unity3D在C#编程中的一些命名空间的引用及说明

System包含用于定义常用值和引用数据类型、事件和事件处理程序、接口、属性和处理异常的基础类和基类。其他类提供支持下列操作的服务&#xff1a;数据类型转换&#xff0c;方法参数操作&#xff0c;数学计算&#xff0c;远程和本地程序调用&#xff0c;应用程序环境管理以及对…

docker入门简介

简介docker(容器技术)是实现虚拟化技术的一种方案,通过利用linux中命名空间,控制组和联合文件系统这个三个主要技术,来实现应用程序空间的隔离.通过对应用程序运行环境的封装来生成镜像并部署来实现跨平台,一定程度上加快了服务交付的整体流程.这篇文章主要介绍docker的一些基本…

Highcharts 配置选项详细说明

http://www.runoob.com/highcharts/highcharts-setting-detail.html 转载于:https://www.cnblogs.com/mengfangui/p/8969121.html

linux下的启停脚本

linux下的根据项目名称&#xff0c;进行进程的启停脚本 #!/bin/bashJAVA/usr/bin/java APP_HOME/opt/program/qa/wechat APP_NAMEprogramname.jar APP_PARAM"--spring.config.location${APP_HOME}/application.properties --logging.path${APP_HOME}"case $1 in star…

python 网页爬取数据生成文字云图

1. 需要的三个包&#xff1a; from wordcloud import WordCloud #词云库 import matplotlib.pyplot as plt #数学绘图库 import jieba; 2. 定义变量&#xff08;将对于的变量到一个全局的文件中&#xff09;&#xff1a; import re; pdurl_firsthttps://movie.do…

python---重点(设计模式)

前戏&#xff1a;设计模式简介 设计模式是面向对象设计的解决方案&#xff0c;是复用性程序设计的经验总结。&#xff08;与语言无关&#xff0c;任何语言都可以实现设计模式&#xff09; 设计模式根据使用目的的不同而分为创建型模式&#xff08;Creational Pattern&#xff0…

洛谷 题解 P2010 【回文日期】

因为有8个字符&#xff0c;所以可得出每一年只有一个回文日期。 因此只要判断每一年就行了。 做法&#xff1a; 我们先把年倒过来&#xff0c;例如2018年就倒为8102&#xff0c;就得出8102就是回文日期的后四个字符&#xff0c;我们只要判断一下有没有这个月份和这个日期。 具体…

线程相关

1、启动线程1.11 new Handler()形式new Handler(mContext.getMainLooper()).post(newOnekeyBindFrameActivity.NetworkThread());1.12new Handler().postDelayed(new StatusCheckLoginBindFrameThread(), IoTCultivatePlantConfig.START_ACTIVITY_POST_DELAYED);1.2 new Thread…

验证Oracle收集统计信息参数granularity数据分析的力度

最近在学习Oracle的统计信息这一块&#xff0c;收集统计信息的方法如下&#xff1a; DBMS_STATS.GATHER_TABLE_STATS (ownname VARCHAR2, ---所有者名字tabname VARCHAR2, ---表名partname VARCHAR2 DEFAULT NULL, ---要分析的分区名estimate_percent NUMBER DEFAULT NULL, …

Python之NumPy(axis=0 与axis=1)区分

Python之NumPy&#xff08;axis0 与axis1&#xff09;区分 转载于:https://www.cnblogs.com/greatljg/p/10802392.html

Python Web开发:开发wsgi中间件

本文参考了&#xff1a; github.com/alanctkc/ws…Youtube : Creating WSGI Middleware上篇文章简要提到&#xff1a;wsgi 规范中的 app 是一个可调用对象&#xff0c;可以通过嵌套调用的方式实现中间件的功能。这篇文章就来亲自动手实现一下。 此文的重点在于 app 端&#xff…

20165320 第九周学习总结

主要内容&#xff1a; 1.URL类 URL类是java.net包中的一个重要的类&#xff0c;使用URL创建对象的应用程序称为客户端程序。URL 的构造方法&#xff1a;try { URL url new URL ("http://www.google.com"); } catch (MalformedURLException e) {System.out.println(&…

Python 函数的执行流程-函数递归-匿名函数-生成器

1 函数的执行流程函数的执行需要对函数进行压栈的&#xff0c;什么是压栈呢&#xff0c;简而言之就是在函数执行时在栈中创建栈帧存放需要变量以及指针的意思。具体涉及的知识非常多&#xff0c;这里就已一个Python脚本简单进行分析。当我们运行上面代码时&#xff0c;它的执行…

python 课堂笔记-for语句

for i in range(10):print("----------",i)for j in range(10):print("world",j)if j> 5:break 转载于:https://www.cnblogs.com/leon-zyl/p/7542466.html

【2】信息的表示和处理

1.现代计算机存储和处理的信息都以二值信号表示。 2.机器为什么要使用二进制进行存储和处理&#xff1f; 答&#xff1a;二值信号能够很容易的被表示、存储、传输。例如&#xff1a; 可以表示为穿孔卡片上有洞和无洞、导线上的高压和低压&#xff0c;顺逆时针的磁场。 3.大多数…

java版b2b2c社交电商spring cloud分布式微服务(二) 服务消费者(rest+ribbon)

一、ribbon简介 Ribbon is a client side load balancer which gives you a lot of control over the behaviour of HTTP and TCP clients. Feign already uses Ribbon, so if you are using FeignClient then this section also applies. —–摘自官网 ribbon是一个负载均衡客…

[学习笔记]支配树

被支配树支配的恐惧 定义 显然&#xff0c;这个支配关系是一个树&#xff08;或者如果有的点不能从r到达&#xff0c;就是一个树一堆点&#xff09;。 首先不会成环&#xff0c;其次也不会是DAG 即如果A支配C&#xff0c;B支配C&#xff0c;那么A和B之间必然有支配关系 解法 首…

RBAC 权限设计(转载)

来源 &#xff1a;https://blog.csdn.net/rocher88/article/details/43190743 这是我在网上找的一些设计比较好的RBAC权限管理不知道&#xff0c;像新浪、搜狐、网易、百度、阿里巴巴、淘宝网的RBAC用户权限这一块&#xff0c;都是这种细颗粒的RBAC设计开发&#xff0c;还是把他…

54.get set

当程序查询对象属性时调用get方法,如果只有get方法那么他是一个只读属性&#xff0c;//程序对对象属性进行赋值操作时调用set方法&#xff0c;如果只有set方法那么他是是一个只读属性 <script type"text/javascript">var p {x:1.0,y:1.0,//当程序查询对象属性…

Codeforces Round #554 Div.2 E - Neko and Flashback

欧拉路径 神题啊神题&#xff01;这道题的突破口就是后两个数组每个元素是一一对应的。 也就是说&#xff0c;对于一个p的排列&#xff0c;b和c取得每一个元素的下标在p中都是一样的。 根据b和c数组的性质可以得出&#xff0c;b[i] < c[i]。 这也是我们输出-1的一个判断方法…