Shuffle Cards (STL rope平衡树库)

2-7课:见缝插针地摆放货物:内存中的链表 链表 虽然链表和数组是两种不同的数据结构,但它们都是被存储在连续的存储空间上的。 如果将两种数据结构中的数据比作“货物”,那么放置它们的“仓库”都是一样的,里面都有一排排标好了固定编号的货架(见下图)。 不过和数组那样一下预定一系列连续的货架,就算不放货物也要占着不给别人用的数据组织方式不同,链表是按需分配的——有货物要存储了,才临时申请正好放这些货物的货架,随时加减。 单向链表 最简单的一种链... 阅读详情

本题链接:登录—专业IT笔试面试备考平台_牛客网

题目:

样例1:

输入
5 1
2 3
输出
2 3 4 1 5

样例2:

输入
5 2
2 3
2 3
输出
3 4 1 2 5

样例3:

输入
5 3
2 3
1 4
2 4
输出
3 4 1 5 2

思路:

        这道题,其实就是个模拟题,根据题意。

        第一行输入,n 为排列数 1~n,初始为递增序列,m 为操作次数。

        随后 m 行,第一个数是 下标pos,第二个数是 长度 len。

        每次切割以下标 pos 做起点到长度len 的数组拿取出来,放到前面,,问操作后的最终序列。

根据这题意,尝试模拟一遍,截取长度数组方面,有一个办法是将它们当作string进行截取删除放置操作。

模拟代码如下:

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#define endl '\n'
#define int long long
#define YES puts("YES")
#define NO puts("NO")
#define umap unordered_map
#define All(x) x.begin(),x.end()
#pragma GCC optimize(3,"Ofast","inline")
#define IOS std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10;
inline void solve();

signed main()
{
//	freopen("a.txt", "r", stdin);
	IOS;
	int _t = 1;
	// cin >> _t;
	while (_t--)
	{
		solve();
	}
	return 0;
}
string s;
int n,m;

// 初始化序列
inline void Init()
{
	for(int i = 1;i <= n;++i)
	{
		s += char(i + '0');
	}
}

inline void Print_ans()
{
	for(int i = 0;i < s.size();++i)
	{
		if(i) cout << ' ';
		cout << s[i];
	}
}
inline void solve()
{
	cin >> n >> m;
	Init();
	while(m--)
	{
		int pos,len;
		cin >> pos >> len;
		
		pos -= 1;	// 我们的 s 下标是以 0 开始,所以这里 -1
		
		string tem = s.substr(pos,len);	// 拿取这个区间的序列
		
		s.erase(pos,len);	// 删除以 pos作为起点,长度为len的序列
		
		s = tem + s;
	}
	
	// 输出答案
	Print_ans();
}

提交后:

不出意料,超时了,这种明明是模拟题却出现超时的结果,这种情况就是需要一些特殊的数据结构了。

        而这种结构之一,我们可以使用平衡树写法,平衡树的操作大部分都是 O(log n) 时间复杂度,而我们上面的代码string的操作时间复杂度是 O(n),所以很容易出现超时的现象。

        那么根据平衡树,手写的话会很麻烦,其实,C++STL库中也内置了平衡树的操作,我们可以调用。具体操作如下:

rope平衡树具体操作:

#include<ext/rope>///头文件
using namespace __gnu_cxx;
rope <int> tree;
int main(){
	int x = 2;
    tree.push_back(x); //在末尾加x
    tree.insert(pos, x); //在pos位置加入x
    tree.erase(pos, len); //从pos位置删除len个元素
    tree.copy(pos, len, x); //从pos开始len个元素用x代替
    tree.replace(pos, x); //从pos开始全部换为x
    tree.substr(pos, len); //提取pos开始len个元素
    tree.at(i);tree[i]; //访问第x个元素
    return 0;
}

并且rope< int>相当于一个块状链表。可以用substr等函数实现区间处理。

如果是rope< char>,相当于一个重型string。可以cout;可以+=。

rope最大的特点是支持可持久化。rope可以o(1)继承上一个版本。(内部维护了平衡树的指针)

最后要注意引用rope的细节:

#include <ext/rope>
using namespace __gnu_cxx;

代码详解如下:

#include <iostream>
#include <ext/rope>
#define endl '\n'
#define int long long
#define All(x) x.begin(),x.end()
#pragma GCC optimize(3,"Ofast","inline")
#define IOS std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
using namespace __gnu_cxx;
const int N = 2e6 + 10;
inline void solve();

signed main()
{
//	freopen("a.txt", "r", stdin);
	IOS;
	int _t = 1;
	// cin >> _t;
	while (_t--)
	{
		solve();
	}
	return 0;
}

int n,m;
rope<int>tree;	// 平衡树存值
// 初始化序列
inline void Init()
{
	for(int i = 1;i <= n;++i) tree.push_back(i);
}

// 输出答案
inline void Print_ans()
{
	for(int i = 0;i < (int)tree.size();++i)
	{
		if(i) cout << ' ';
		cout << tree[i];
	}
}
inline void solve()
{
	cin >> n >> m;
	Init();
	while(m--)
	{
		int pos,len;
		cin >> pos >> len;
		pos -= 1;	// 下标是以 0 开始,所以这里需要 -1
		
		rope<int> tem = tree.substr(pos,len);	// 截取区间序列
		tree.erase(pos,len);	// 删除区间序列,缩进序列
		tree = tem + tree;	// 放置前面
	}
	// 输出答案
	Print_ans();
}

最后提交:

shuffle_cards_c 立即下载

相关推荐

FFT去除频率分量的完整流程与数学分析

重叠与窗口:确保块间无缝过渡,避免幅度跳变;实时缓冲:处理速度需快于数据输入速度,避免断流;DAC的平滑角色:通过数模转换和滤波,将离散样点还原为连续波形。通过这种分段处理+重叠拼接的方法,即使FFT本身处理的是离散数据块,最终DAC输出仍能保持信号的时间连续性。以下是完整的数学分析过程和代码逻辑,演示如何通过FFT去除特定频率成分,并通过去窗技术恢复信号。信号加窗。

林愿留的博客 1611

c++中STL的rope的使用

Rope其主要是结合了链表和数组各自的优点,链表中的节点指向每个数据 块,即数组,并且记录数据的个数,然后分块查找和插入。在g++头文件中,&amp;lt; ext / rope &amp;gt;中有成型的块状链表,在using namespace __gnu_cxx;空间中,其操作十分方便。   基本操作: rope test; test.push_back(x);//在末尾添加x test.in...

qq_36386435的博客 7706

用PyTorch手把手搭建液态神经网络(LNN):从微分方程到无人机避障实战

本文详细介绍了如何使用PyTorch搭建液态神经网络(LNN),从微分方程基础到无人机避障实战应用。LNN通过动态时序建模和微分方程实现高效计算,特别适合多传感器数据融合场景。文章包含完整的代码实现、训练技巧及性能优化方案,帮助开发者快速掌握这一前沿技术。

uber9的博客 439

stl Rope

stl::rope 基本操作与应用 Rope是类似块状链表的结构。把每个子字符串作为结点,串连为一个字符串,这样做,可以节省内存,避免了字符串构造时需要反复地构建:str = A+B+C, D= A+B, E= D+C, str= E。 String是“细线”,而Rope是“重绳”,用于解决巨型字符串的问题。 http://www.sgi.com/tech/stl/Rop

u011535421的博客 638

PLc S7-200 smart如何使用Modbus 485通讯传输接收数据

西门子在 STEP 7-Micro/WIN SMART 中正式推出 Modbus RTU 主站协议库(西门子标准库指令)。使用 Modbus RTU 主站指令库,可以读写 Modbus RTU 从站的数字量、模拟量 I/O 以及保持寄存器,从而实现PLC通过modbus方式控制其他器件。提示:以下是本篇文章正文内容,下面案例可供参考。

xjbsw0的博客 6万+

别再折腾环境了!Windows 11 + VSCode + CMake 3.31.4 + MinGW-w64 一键式配置指南(附常见报错解决)

本文提供Windows 11下VSCode、CMake 3.31.4和MinGW-w64的一键式配置指南,帮助开发者快速搭建高效C++开发环境。涵盖工具链选型、环境变量配置、项目初始化及常见报错解决方案,大幅提升开发效率。

weixin_28841265的博客 186

STL中的rope模板(可持久化平衡树)

首先这玩意需要的预编译指令和用的命名空间有点不一样 #include<ext/rope> using namespace __gnu_cxx; 支持的操作: rope list; list.insert(p,str) //在p的位置插入str list.erase(p,c) //删除list的从p开始的c个节点 list.substr(p,c) //提取list的p位置开始的c...

asdkjc的博客 601

如何使用AKShare作为OpenBB的数据源

`openbb_akshare`项目是 OpenBB 的数据源扩展。可以用于查询A股和港股数据

FinAnalyzer金融分析工具 3196

神仙级别的 STL 数据结构:rope

#include<bits/stdc++.h> #include<ext/rope> using namespace std; using namespace __gnu_cxx; rope test; test.push_back(x);//在末尾添加x test.insert(pos,x);//在pos插入x   test.erase(pos,x);//从pos开始删除x个 test.copy(pos,len,x);//从pos开始到pos+len为止用x代替 t.

m0_57094519的博客 1246

双向升压和降压的DC-DC转换器设计

c复制// 类型定义与常量MODE_FORWARD_BOOST, // 正向升压模式(输入700V→输出1200V)MODE_FORWARD_BUCK, // 正向降压模式(输入700V→输出<700V)MODE_REVERSE_BOOST, // 反向升压模式(输入1200V→输出700V)MODE_REVERSE_BUCK // 反向降压模式(输入<700V→输出700V)// 硬件参数float Vin;// 输入电压(0-1200V)

567

C# Socket通信从入门到精通(14)——多个异步UDP客户端C#代码实现(史上最全)

本文详细介绍了Socket通信中多个异步Udp客户端功能的实现、介绍如何使用多个客户端与多个服务器进行数据的交互,包含连接服务器、断开服务器、发送数据、读取数据、C#代码实现,由高级工程师多年经验总结而成,绝对干货!

qq_34059233的博客 1982

Shuffle Cards(Rope大法/平衡树)

 Eddy likes to play cards game since there are always lots of randomness in the game. For most of the cards game, the very first step in the game is shuffling the cards. And, mostly the randomness in ...

PleasantlY1的博客 490

网络变更:APIC 节点替换

Fabric Name,Controller ID,TEP Address Pool 等信息必须相同;如果故障设备是 APIC1 还需要重新配置管理密码。此过程可能需要 10 分钟左右,在此期间目标 APIC 可能在 Available/Unavailable 状态翻滚。APIC 获取 TEP 地址后,进入 fully-fit。通过 CLI 以及配置的密码登录目标 APIC。

m0_54931486的博客 321

2020牛客国庆集训派对day8 G-Shuffle Cards(扩展STL容器,rope可持久化平衡树)

2020牛客国庆集训派对day8 G-Shuffle Cards(扩展STL容器,rope可持久化平衡树) 题目 https://ac.nowcoder.com/acm/contest/7865/G 题意 给你n张牌,要你洗k次牌。 后面k行数据,p,s表示将第p张牌后的s张牌,放到牌顶。 让你求k次操作之后牌的顺序。 题解 这就很明显是个区间插入、删除的操作模拟,可是因为n,k都是1e5的,所以正常用vector写肯定TLE。在这里就需要用到神奇的东西——rope容器。 rope是什么? rope 不属于

zhz的博客 327

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

2018 牛客多校第3场 Shuffle Cards(STL rope)

题意:初始给一个 1,2,3……,n的序列,然后之后给q个操作             每一个操作给一组 l,s  要求把 从l个位置开始的s个数组拿出来拼到序列开头            比如 n=5,  进行一次 2 3操作            就把 1,2,3,4,5  变成了 2,3,4,1,5   解法:  比赛的时候写了个链表T了。。。。。。。。             ...

hjsss3的博客 349

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

(第三场) C Shuffle Cards 【STL_rope || splay】

题目链接:https://www.nowcoder.com/acm/contest/141/C 题目描述 Eddy likes to play cards game since there are always lots of randomness in the game. For most of the cards game, the very first step in the ga...

weixin_30786617的博客 111

牛客网暑期ACM多校训练营(第三场) C Shuffle Cards (Splay伸展树,rope 可持续化平衡树)

链接 链接:https://www.nowcoder.com/acm/contest/141/C 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K Special Judge, 64bit IO Format: %lld 题目描述 Eddy likes to play cards game since there ...

henuzxy 482

牛客网暑期ACM多校训练营(第三场)C Shuffle Cards (rope 函数的简单使用)

题目大意:给出n个元素的序列,a[1]...a[n]. 接下来有操作,将从第p个开始s个元素拿出来放到开头。问经过若干次操作之后的序列是? 比如序列1,2,3,4,5.经过一次操作p=2,s=2,之后,序列变为2,3,1,4,5. 题目思路:使用STL的rope函数。一个很神奇的东西,STL中可持久化平衡树,可以解决一些简单的额Splay问题。 简单介绍rope: 类似指针链表的操作,时...

qq_36782366的博客 314

牛客网多校第3场C-shuffle card 平衡树或stl(rope)

链接:https://www.nowcoder.com/acm/contest/141/C 来源:牛客网 题目描述 Eddy likes to play cards game since there are always lots of randomness in the game. For most of the cards game, the very first step i...

weixin_30820151的博客 180

牛客多校3 C-Shuffle Cards(rope大法解决数组分块)

Shuffle Cards 链接:https://www.nowcoder.com/acm/contest/141/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K Special Judge, 64bit IO Format: %lld 题目描述 Eddy likes to ...

weixin_30305735的博客 185

牛客网暑期ACM多校训练营(第三场) C Shuffle Cards

题目:点击打开链接 题意:M个操作,每个操作都是从p开始的s个数移动到开头,问你最后的序列是什么。 分析:treap(树堆)或者Splay(伸展树)或者SBT(节点大小平衡树)都能实现,最方便的是利用STL中的rope,rope的底层实现是可持久化平衡树,复杂度为O(M*sqrt(N))。 代码: #pragma comment(linker, "/STACK:102400000,1024...

常胜将军的博客 273

Shuffle Cards (splay)

题目大意:给定一个数组1 2 3 4 5… 有m次操作,每次给定一个p和s,然后将数组中[p,p+s-1]中的数放到数组最前方。最后输出操作完后的顺序 实际上这个操作转化成可以分成三次翻转 假设p=2,s=3, 1:翻转[1,p+s-1] 4 3 2 1 5 2:翻转[1,3] 2 3 4 1 5 3 翻转[4,4] 2 3 4 1 5 形式化来讲就是 int l = 1, r = p + s - 1; rev(l, r); // rev(l, s); rev(s + 1, r); 显然,这

fdxgcw的博客 258

stl之rope大法好及可持久化并查集用法

rope大法好 rope是c++的stl库中的一个叫做可持久化平衡树的结构,这个神奇的结构支持什么功能呢?看测试代码: #include #include #include using namespace std; using namespace __gnu_cxx;//使用rope要加这句 #define LL long long ropechar> tmp; char test[100

litble的成(tui)长(fei)史 1413

c++ STL rope小结

rope是stl封装好的可持久平衡树(不支持kth)。 基本操作(函数)比较少。 下标从0开始。 {1,2,5,4}.insert(1,10)=>{1,10,2,5,4} #include<ext/rope>///头文件 using namespace __gnu_cxx; rope <int> x; int main(){ x.push_back(x); //在末尾加x x.insert(pos, x); //在pos位置加入x x.erase(pos

sancpp的博客 2070

C++STL-------rope大法好

本文主要参考自:rope讲解 一、声明 1. 头文件  #include&lt;ext/rope&gt; 2.命名空间 using namespace __gnu_cxx; 二、定义  rope&lt;char&gt; str; 三、使用  #include&lt;ext/rope&gt;///头文件 using namespace __gnu_cxx; ro...

Destinymiao的博客 1363
上一篇: 独有病眼花,春风吹不落。 (二维坐标压缩成一个点,并查集)
下一篇: 小丑的身份证和复印件 (BFS + Floyd)
Angindem
博客等级 码龄5年 3052粉丝 211原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值