首页 > 其他分享 >扶苏的问题

扶苏的问题

时间:2024-10-04 16:23:16浏览次数:1  
标签:ch int 扶苏 问题 fa add maxn change

  • 利用Splay进行序列操作时,将数组坐标整体平移1,给0留出空间,并在操作过程中始终保持0号节点的特性
  • 用#define语句和struct的构造函数简化编程复杂度
  • 对名字空间(namespace)有了更深刻的理解
  • Splay的常数较大,难以通过1e6规模的数据
  • 在建树时,根据Splay的特性,直接建出一条只有右儿子的链即可,时间复杂度仍然是正确的。
点击查看代码
#include <bits/stdc++.h>
#define l(x) ch[x][0]
#define r(x) ch[x][1] 
using namespace std;
struct t1
{
	long long va,maxn;
	long long add;
	int change;
	t1()
	{
		va=maxn=LLONG_MIN;
		add=0;
		change=INT_MAX;
	}
}t[1000005];
int fa[1000005],ch[1000005][2];
void pushdown(int x)
{
	if(t[x].change!=INT_MAX)
	{
		if(l(x))
		{
			t[l(x)].va=t[x].change;
			t[l(x)].maxn=t[x].change;
			t[l(x)].change=t[x].change;
			t[l(x)].add=0;
		}
		if(r(x))
		{
			t[r(x)].va=t[x].change;
			t[r(x)].maxn=t[x].change;
			t[r(x)].change=t[x].change;
			t[r(x)].add=0;
		}
		t[x].change=INT_MAX;
	}
	if(t[x].add)
	{
		if(l(x))
		{
			t[l(x)].va+=t[x].add;
			t[l(x)].maxn+=t[x].add;
			t[l(x)].add+=t[x].add;
		}
		if(r(x))
		{
			t[r(x)].va+=t[x].add;
			t[r(x)].maxn+=t[x].add;
			t[r(x)].add+=t[x].add;
		}
		t[x].add=0;
	}
}
int get(int x)
{
	return ch[fa[x]][1]==x;
}
void maintain(int x)
{
	t[x].maxn=max(t[x].va,max(t[l(x)].maxn,t[r(x)].maxn));
}
void rotate(int x)
{
	int y=fa[x],z=fa[y],opt=get(x);
	ch[y][opt]=ch[x][opt^1];
	if(ch[x][opt^1])
	{
		fa[ch[x][opt^1]]=y;
	}
	fa[y]=x;
	ch[x][opt^1]=y;
	fa[x]=z;
	if(z)
	{
		ch[z][y==ch[z][1]]=x;
	}
	maintain(y);
	maintain(x);
}
void update(int x,int k)
{
	if(fa[x]!=k)
	{
		update(fa[x],k);
	}
	pushdown(x);
}
void Splay(int x,int k)
{
	update(x,k);
	while(fa[x]!=k)
	{
		int y=fa[x],z=fa[y];
		if(z==k)
		{
			rotate(x);
			break;
		}
		if(get(x)==get(y))
		{
			rotate(y);
			rotate(x);
		}
		else
		{
			rotate(x);
			rotate(x);
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n,q;
	cin>>n>>q;
	ch[1][1]=2;
	for(int i=2;i<=n+1;i++)
	{
		cin>>t[i].va;
		ch[i][1]=i+1;
		fa[i]=i-1;
	}
	fa[n+2]=n+1;
	t[n+1].maxn=t[n+1].va;
	for(int i=n;i>=2;i--)
	{
		t[i].maxn=max(t[i+1].maxn,t[i].va);
	}
	for(int i=1;i<=q;i++)
	{
		int opt,l,r,x;
		cin>>opt>>l>>r;
		Splay(l,0);
		Splay(r+2,l);
		int id=ch[r+2][0];
		if(opt==1)
		{
			cin>>x;
			pushdown(id);
			t[id].change=x;
			t[id].va=t[id].maxn=x;
		}
		else if(opt==2)
		{
			cin>>x;
			pushdown(id);
			t[id].add=x;
			t[id].va+=x;
			t[id].maxn+=x;
		}
		else
		{
			cout<<t[id].maxn<<"\n";
		}
	}
	return 0;
}

标签:ch,int,扶苏,问题,fa,add,maxn,change
From: https://www.cnblogs.com/watersail/p/18446741

相关文章

  • windows系统配置nginx环境运行pbootcms访问首页直接404的问题
    在PbootCMS安装过程中遇到访问首页和其他页面返回404错误的问题,特别是在Windows+Nginx+PHP的环境下,确实需要仔细排查。根据你的描述,填写授权码后问题得到了解决,但仍然需要了解具体原因和解决方案。问题分析伪静态规则未生效:伪静态规则未正确生效可能导致访问首页和其他......
  • 关于AT32A403A烧录程序时不启动的问题
    具体描述:第1块板是一边写代码一边烧录测试,一直没什么异常,整片擦除,再烧录,功能一切正常。之后就又焊了两块板,把程序烧录进去之后芯片没反应。进入仿真模式会卡在startup_at32f403a_407.s的151行LDRR0,=SystemInit后面发现一个奇怪的解决办法,就把程序大部分代码注释掉......
  • 卸载时报错:‘’系统找不到指定的驱动器‘’问题处理
    操作系统:win11问题描述:wegame,英雄联盟我早就卸载过了,今天在设置/应用/安装的应用这里又看见了,在此处点击卸载,报如下错误:解决办法:查了一下网上的做法,大多数是删除注册表,我也试了几个,结果还是没有用。最后灵机一动,记得控制面板那边也有卸载应用的位置。控制面板/程序/卸载......
  • wsl重装Ubuntu遇到的一些问题( WslRegisterDistribution failed with error: 0x800410
        不知道什么原因,VSCode连接WSLUbuntu总是失败,遂决定重装Ubuntu。    但是卸载原来的Ubuntu后,安装新的Ubuntu报错:WslRegisterDistributionfailedwitherror:0x80041002Error:0x80041002(null),查了比较多的帖子,使用了以下方法最终解决:1.关闭"适用于l......
  • PicGo无法删除云端图片问题
    在使用PicGo一段时间后,遇到了一个麻烦的问题:上传后无法在相册内同步删除云端,一旦不小心上传错图片或者想更换图片就很麻烦。经过一段时间的寻找,赫萝大佬基于PicGo做出的PicList完美实现了在相册内同步删除云端文件的同时可以兼容PicGo的插件下载地址:PicListgitee地址:https://gi......
  • 【STC15】实现printf()重定向的相关问题
    本文前提:读者已经知道如何用STC15实现串口重定向的基础知识(大体思路和代码大意)。如果不知道,请移步:《STC15单片机-串口打印》:https://blog.csdn.net/weixin_46251230/article/details/126679956问题1:uint8_t 数字增长显示错误/*Privatevariables-------------------------......
  • 解决wsl 安装出现Installing, this may take a few minutes… 时间长。且重新打开进入
    1.现象在安装wsl出现Installing,thismaytakeafewminutes…等待时间过长,无法启动,或报错。且如果你重新打开终端,出现图二情况(直接进入root用户)。很显然,你的系统已经正确安装,但是你却跳过了创建用户的步骤,因此,只需要创建一个新用户,并将其设定为默认启动的用户就可以解决问......
  • Windows11系统Microsoft.Build.Engine.dll文件丢失问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个Microsoft.Build.Engine.dll文件(挑选合适的......
  • Windows11系统mgtdyn.dll文件丢失问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个mgtdyn.dll文件(挑选合适的版本文件)把它放......
  • 从2023济南K学习滑动窗口中位数问题
    板子对顶堆template<classT>structDualHeap{Heap<T,std::greater<T>>small;//小根堆,里面存放大的值Heap<T,std::less<T>>big;//大根堆,里面存放前k小的值//中位数就是big.top()DualHeap(){}voidupdate(){if(b......