首页 > 其他分享 >P3391 【模板】文艺平衡树

P3391 【模板】文艺平衡树

时间:2024-12-06 11:55:14浏览次数:3  
标签:le int 文艺 P3391 calc 模板

P3391 【模板】文艺平衡树

【模板】文艺平衡树

题目描述

您需要写一种数据结构(可参考题目标题),来维护一个有序数列。

其中需要提供以下操作:翻转一个区间。

输入格式

第一行两个正整数 \(n,m\),表示序列长度与操作个数。序列中第 \(i\) 项初始为 \(i\)。
接下来 \(m\) 行,每行两个正整数 \(l,r\),表示翻转的区间。

输出格式

输出一行 \(n\) 个正整数,表示原始序列经过 \(m\) 次变换后的结果。

【数据范围】
对于 \(100\%\) 的数据,$1 \le n, m \leq 100000 $,\(1 \le l \le r \le n\)。

感觉和模板平衡树很像,唯一的区别就是这题不用按点权分裂,而是直接按节点个数分裂

每次交换操作就直接给区间打tag,然后交换左右儿子
最后统计的时候直接中序dfs就好了

Code:

#include<bits/stdc++.h>
#include<ctime>
const int N=1e5+5;
using namespace std;
struct Tree{
	int val,tag,siz,pri,ls,rs;
}t[N<<2];
int n,m,cnt,rt;
int new_(int w=0)
{
	int x=++cnt;
	t[x].val=w,t[x].siz=1,t[x].pri=rand();
	return x;
}
void upd(int x)
{
	t[x].siz=t[t[x].ls].siz+t[t[x].rs].siz+1;
}
void pushdown(int x)
{
	if(!t[x].tag)return ;
	t[x].tag=0;
	t[t[x].ls].tag^=1;
	t[t[x].rs].tag^=1;
	swap(t[x].ls,t[x].rs);
	return ;
}
void split(int x,int k,int &a,int &b)
{
	if(!x){a=b=0;return;}
	pushdown(x);
	if(k<=t[t[x].ls].siz)
	{
		b=x;
		split(t[b].ls,k,a,t[b].ls);
		upd(b);
	}
	else
	{
		a=x;k-=(t[t[x].ls].siz+1);
		split(t[a].rs,k,t[a].rs,b);
		upd(a);
	}
}
int merge(int x,int y)
{
	if(!x||!y)return x+y;
	if(t[x].pri<t[y].pri)
	{
		pushdown(x);
		t[x].rs=merge(t[x].rs,y);
		upd(x);
		return x;
	}
	else
	{
		pushdown(y);
		t[y].ls=merge(x,t[y].ls);
		upd(y);
		return y;
	}
}
queue<int> Q;
void calc(int x)
{
	if(!x)return ;
	pushdown(x);
	calc(t[x].ls);
	Q.push(t[x].val);
	calc(t[x].rs);
}
void work()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		rt=merge(rt,new_(i));
	}
	for(int i=1,l,r;i<=m;i++)
	{
		scanf("%d%d",&l,&r);
		int a=0,b=0,c=0;
		split(rt,l-1,a,b);//a[1,l-1] : b[l,n]
		split(b,r-l+1,b,c);//b[l,r] : c[r+1,n]
		//cout<<"val:"<<t[a].val<<" "<<t[b].val<<" "<<t[c].val<<"\n";
		//cout<<"siz:"<<t[a].siz<<" "<<t[b].siz<<" "<<t[c].siz<<"\n";
		t[b].tag^=1;
		rt=merge(merge(a,b),c);
	}
	calc(rt);
	while(!Q.empty())
	{
		printf("%d ",Q.front());
		Q.pop();
	}
}
int main()
{
	//freopen("P3391.in","r",stdin);
	srand(clock());
	work();
}

标签:le,int,文艺,P3391,calc,模板
From: https://www.cnblogs.com/LG017/p/18590416

相关文章

  • P6192 【模板】最小斯坦纳树
    题目描述:题目给定一张图上的几个关键点,要求我们用最小的边权将这些点连起来不难发现,最后连出来的答案一定是一棵树:如果有环的话,将环优化掉一定更好我们考虑dp:对于一个节点x钦定它是这颗树的根。记dp[rt][s]表示以rt为根,关键点被链接的状态为s时的最小花费则在最短路中......
  • 组策略 计算机配置-管理模板-Windows组件-传递优化- 设置 注册表
    WindowsRegistryEditorVersion5.00;1.绝对最大缓存大小(以GB为单位)[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\DeliveryOptimization]"MaxCacheSize"="10";例如设置为10GB,按需调整;2.当设备通过VPN连接时启用对等缓存[HKEY_LOCAL_MACHINE\S......
  • [ABC287E] Karuta(字典树模板题 + 思维暴力两种做法)
    [ABC287E]Karuta题面翻译给定NNN个字符串Si......
  • AIGC项目中的【模板进程】方案的设计实践
    1项目介绍1.1项目背景简单一句话:模板进程是流程的子流程;往往用于比较复杂的aigc项目流程中。由于一个模板有多个流程,一个运营人员可以操作多个流程,也可创建多个流程。在模板推荐时,就会导致不知道是哪次流程。1.2项目目标为了区分模板中流程,就需要增加进程的概念(子流程),为了......
  • Android基础的ListView适配器SimpleAdapter的使用方法,附带可修改模板
            本代码使用的Android版本:android-studio-2024.2.1.11-windows目录一、适配器的五个主要参数二、效果图:三、功能实现的代码(模板):    1.Store主页面:2.item_commodity模板界面:四、结语        本文章还有使用自定义适配器来实现该功能......
  • 为什么在易优EyouCms中访问TAG首页时提示“模板文件不存在:./template/pc/index_tags.
    在易优EyouCms中,访问TAG首页时提示“模板文件不存在:./template/pc/index_tags.htm”的原因是系统未能找到指定的模板文件。这通常是由于以下几个原因导致的:模板文件缺失:最常见的原因是模板文件 index_tags.htm 不存在于指定的目录中。在易优EyouCms中,模板文件通常位于 te......
  • 你知道什么是后端套模板吗?他们是怎么操作的知道吗?
    我知道后端套模板,也叫做“服务器端渲染”(Server-SideRendering,SSR)或“模板引擎”。它指的是在服务器端动态生成HTML页面,而不是像传统的前端渲染那样,只提供静态的HTML文件,然后由浏览器端的JavaScript去操作DOM更新内容。后端套模板的操作流程大致如下:前端发送请......
  • C++ 标准模板库(STL)——bitset的使用
    目录一、问题二、定义和初始化三、访问元素四、修改元素五、成员函数1、count()函数2、size()函数3、test()函数4、any()函数5、none()函数6、all()函数7、to_string()函数8、to_ulong()和to_ullong()六、运算符七、总结一、问题std::bitset是C++标准......
  • HTML5期末考核大作业,个人网站—— 程序员个人简历模板下载HTML+CSS+JavaScript (2)
    ......
  • 软件设计:实验 24:模板方法模式
    实验24:模板方法模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解模板方法模式的动机,掌握该模式的结构;2、能够利用模板方法模式解决实际问题。 [实验任务一]:数据库连接对数据库的操作一般包括连接、打开、使用、关闭等步骤,在数据库操作模板类中我们定义......