【bzoj2157】旅游 LCT_【bzoj2157】旅游 lct-程序员宅基地

技术标签: LCT  bzoj  

AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2157

【题解】

很模板的题目。

首先还是把边建成点(这是一种套路),然后上LCT维护就行了。

这题还有一个启示:在打标记时要直接下传一次,否则会出现查询时还没有下传标记的情况。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
using namespace std;
#define FILE "read"
#define MAXN 40010
#define INF 1000000000
#define up(i,j,n) for(int i=j;i<=n;++i)
#define dn(i,j,n) for(int i=j;i>=n;--i)
#define cmax(a,b) a=max(a,b)
#define cmin(a,b) a=min(a,b)
inline int read(){
	int x=0,f=1;  char ch=getchar();
	while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getchar();}
	while(isdigit(ch))  {x=x*10+ch-'0';  ch=getchar();}
	return x*f;
}
int n,m,cnt,id[MAXN];
namespace Link_Cut_Tree{
	int f[MAXN],vis[MAXN],stack[MAXN],tag[MAXN],v[MAXN],sum[MAXN],maxx[MAXN],minn[MAXN],son[MAXN][2];
	bool get(int x){return son[f[x]][1]==x;}
	bool isroot(int x){return son[f[x]][0]!=x&&son[f[x]][1]!=x;}
	void updata(int x){
		sum[x]=sum[son[x][0]]+sum[son[x][1]]+v[x];
		maxx[x]=max(maxx[son[x][0]],maxx[son[x][1]]);
		minn[x]=min(minn[son[x][0]],minn[son[x][1]]);
		if(x>n)cmax(maxx[x],v[x]),cmin(minn[x],v[x]);
	}
	void rever(int x){
		sum[x]=-sum[x];v[x]=-v[x];
		swap(minn[x],maxx[x]);
		minn[x]=-minn[x];maxx[x]=-maxx[x];
		tag[x]^=1;
	}
	void pushdown(int x){
		if(vis[x]){
			swap(son[x][0],son[x][1]);
			vis[son[x][0]]^=1; vis[son[x][1]]^=1; vis[x]=0;
		}
		if(tag[x]){
			tag[x]=0;
			if(son[x][0]) rever(son[x][0]);
			if(son[x][1]) rever(son[x][1]);
		}
	}
	void rotate(int x){
		int y=f[x],z=f[y],which=get(x);
		if(!isroot(y))  son[z][son[z][1]==y]=x;
		son[y][which]=son[x][which^1]; f[son[y][which]]=y;
		son[x][which^1]=y;  f[y]=x;  f[x]=z;
		updata(y);  updata(x);
	}
	void splay(int x){
		int top(0);  stack[++top]=x;
		for(int i=x;!isroot(i);i=f[i])  stack[++top]=f[i];
		dn(i,top,1)  pushdown(stack[i]);
		for(int y=f[x];!isroot(x);rotate(x),y=f[x])
			if(!isroot(y))  rotate(get(x)==get(y)?y:x);
	}
	void access(int x){for(int t(0);x;t=x,x=f[x])splay(x),son[x][1]=t,updata(x);}
	void reverse(int x){access(x);splay(x);vis[x]^=1;}
	void linkk(int x,int y){reverse(x);f[x]=y;}
	void split(int x,int y){reverse(x);access(y);splay(y);}
}
int main(){
	freopen(FILE".in","r",stdin);
	freopen(FILE".out","w",stdout);
	using namespace Link_Cut_Tree;
	n=read();  cnt=n;
	up(i,0,n) maxx[i]=-INF,minn[i]=INF;
	up(i,1,n-1){
		int x=read()+1,y=read()+1,z=read();
		id[i]=++cnt;  linkk(x,cnt);  linkk(y,cnt);
		v[cnt]=maxx[cnt]=minn[cnt]=sum[cnt]=z;  
	}
	m=read();
	up(i,1,m){
		char ch[5];  scanf("%s",ch);  int x=read(),y=read();
		if(ch[0]=='C'){splay(id[x]);v[id[x]]=y;updata(id[x]);}
		else if(ch[0]=='N'){split(x+1,y+1);rever(y+1);}
		else if(ch[0]=='S'){split(x+1,y+1);printf("%d\n",sum[y+1]);}
		else if(ch[1]=='A'){split(x+1,y+1);printf("%d\n",maxx[y+1]);}
		else {split(x+1,y+1);printf("%d\n",minn[y+1]);}
	}
	return 0;
}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chty2018/article/details/55517812

智能推荐

KONGSBERG RMP201-8数字量输入模块-程序员宅基地

文章浏览阅读295次。总的来说,KONGSBERG RMP201-8数字量输入模块是一款性能卓越、功能丰富的产品。除了信号处理功能外,该模块还配备了通信接口,如以太网、串行通信等,这使得它能够与其他设备或控制系统进行数据交换和控制。KONGSBERG RMP201-8数字量输入模块是一款功能强大的模块,专为接收和处理数字信号而设计。RMP201-8模块的核心功能是接收数字信号,如高低电平、脉冲信号等,并将这些信号转换为控制系统可以识别和处理的格式。通道的数量通常根据具体的应用需求进行配置,从而为用户提供了极大的灵活性和扩展性。

异常数据检测 | Python基于Hampel的离群点检测_python 离群点检测-程序员宅基地

文章浏览阅读823次。异常数据检测 | Python基于Hampel的离群点检测_python 离群点检测

中点Bresenham画圆-程序员宅基地

文章浏览阅读117次。这里不仔细讲原理,只是把我写的算法发出来,跟大家分享下,如果有错误的话,还请大家告诉我,如果写的不好,也请指出来,一起讨论进步。算法步骤:(1) 输入圆的半径R。(2) 计算初始值d = 1 - R, x = 0; y = R。(3) 绘制点(x, y), 及其在八分圆中的另外7个对称点。(4) 判断d的符号,若d < 0, 则先将d更新为d+2*x+3,再将(x,y)..._设圆半径r=10,初始点(0,10),利用中点bresenham画圆法绘制八分之一圆弧

idl结果显示窗口如何缩小_IDL入门教程二(上)(简单图形显示II)-程序员宅基地

文章浏览阅读141次。第二章简单的图形显示本章概述科学分析最基本的能力就是以简单的线画图、等值线图和曲面图来显示所研究的数据。在这一章中,将知道用这些方式来显示数据是多么容易。也将学会用系统变量和关键字来定位和标注简单的图形显示。将学会如下几点:1.如何用Plot命令将数据显示为线画图。2.如何用Surface和Shade_Surf命令将数据显示为曲面图。3.如何用Contour命令将数据显示为等值线图。4.如何在显示..._idl中画图时怎样让横坐标的讲变窄

Python 网络爬虫与数据采集(二)_python数据采集与网络爬虫报告-程序员宅基地

文章浏览阅读1.6k次,点赞9次,收藏46次。第二部分 初章 网络爬虫初识4. 网络爬虫请求篇_python数据采集与网络爬虫报告

相机的标定之手机相机的标定_相机标定的相机可以是手机吗-程序员宅基地

文章浏览阅读4.3k次,点赞3次,收藏26次。相机的标定是 SLAM 最开始的部分,由于设备原因,这个星期只做了手机相机的标定。这篇文章主要就是介绍一下相机标定的原理以及用OpenCV中现有的函数或是Matlab做相机标定的过程。_相机标定的相机可以是手机吗

随便推点

程序加载是什么_ctf加载程序有什么用吗-程序员宅基地

文章浏览阅读2.4k次。程序加载是什么?解答:http://www.yayihouse.com/yayishuwu/chapter/1175_ctf加载程序有什么用吗

Python 求回归方程及显著性分析_linearregression方法怎么计算显著性python-程序员宅基地

文章浏览阅读806次,点赞15次,收藏5次。此外,stats.f.sf`的使用非常方便,可以通过调用`scipy.stats.f.sf(f_value, dfn, dfd)`来计算,其中f_value`是F统计量的值,`dfn`是分子自由度,`dfd`是分母自由度。stats.f.sf`是用于计算F分布生存函数的函数,它在假设检验中用于评估F统计量对应的p值,可以帮助判断数据中的方差是否具有统计学上的显著性差异。- **进行双侧检验**:如果是双侧检验,通常需要将`stats.f.sf`计算出的值乘以2,或者使用其他方法来计算双尾概率。_linearregression方法怎么计算显著性python

HCIE-Cloud Computing LAB备考第二步:模拟测试--第四题:升级FA/VRM_hcie云计算实验-程序员宅基地

文章浏览阅读183次。使用需要把文件放在固定目录(C:\packages)里;【使用chrome浏览器升级】,否则会报错“软件包不存在”把VRM升级包放到如下路径中但是还是报错“SHA256校验文件不存在”换成IE浏览器就都可以了。_hcie云计算实验

git命令之git tag 给当前分支打标签_git基于某个分支打tag-程序员宅基地

文章浏览阅读1.9w次,点赞2次,收藏20次。标签可以针对某一时间点的版本做标记,常用于版本发布。列出标签$ git tag # 在控制台打印出当前仓库的所有标签打标签git标签分为两种类型:轻量标签和附注标签。轻量标签是指向提交对象的引用,附注标签则是仓库中的一个独立对象。建议使用附注标签。# 创建轻量标签$ git tag v0.1.2-light# 创建附注标签_git基于某个分支打tag

软件设计师考试---数据库规范化和关系代数运算_软考数据库关系运算-程序员宅基地

文章浏览阅读1k次,点赞7次,收藏18次。这篇文章对数据库规范化和关系代数运算进行讲解。_软考数据库关系运算

这42个Python小例子,太走心了 !-程序员宅基地

文章浏览阅读2.3k次。告别枯燥,60秒学会一个Python小例子。收录整理了42个例子一次性送给大家,希望对大家有所帮助!总有一款适合你~~一、基本操作1 链式比较i=3print(1<i&..._python实例

推荐文章

热门文章

相关标签