pb_ds简单运用-程序员宅基地

技术标签: c++  

pb_ds详细解释

在算法竞赛中,我们只需要知道pb_ds都有什么操作,每种操作是干什么的即可,不需要了解的太深入

例题

该题可以直接用pb_ds近乎暴力秒杀,以及运用到启发式合并的思想

AC代码

#include <bits/stdc++.h>
using namespace std;
using LL = long long;
#include <bits/extc++.h>
using namespace __gnu_pbds;
template <class T>
using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
Tree<pair<int, int> > a[200010][2];
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        a[0][0].insert(make_pair(x, i));//值,下标
        a[0][1].insert(make_pair(i, x));//下标,值
    }
    int q;
    cin >> q;
    for (int i = 1; i <= q; i++) {
        int t, s, x;
        cin >> t >> s >> x;
        if (t == 1) {
            int num = a[s][1].size();
            x = min(x, num);
            if (2 * x <= num) {
                while (x--) {
                    auto it = a[s][1].begin();
                    a[i][1].insert(*it);
                    a[i][0].insert(make_pair(it->second, it->first));
                    a[s][1].erase(make_pair(it->first, it->second));
                    a[s][0].erase(make_pair(it->second, it->first));
                }
                a[i][0].swap(a[s][0]);
                a[i][1].swap(a[s][1]);
            } else {
                x = num - x;
                while (x--) {
                    auto it = a[s][1].rbegin();
                    a[i][1].insert(*it);
                    a[i][0].insert(make_pair(it->second, it->first));
                    a[s][1].erase(make_pair(it->first, it->second));
                    a[s][0].erase(make_pair(it->second, it->first));
                }
            }
        } else {
            int num = a[s][0].size();
            x = a[s][0].order_of_key(make_pair(x, n + 1));
            if (2 * x <= num) {
                while (x--) {
                    auto it = a[s][0].begin();
                    a[i][0].insert(*it);
                    a[i][1].insert(make_pair(it->second, it->first));
                    a[s][0].erase(make_pair(it->first, it->second));
                    a[s][1].erase(make_pair(it->second, it->first));
                }
                a[i][0].swap(a[s][0]);
                a[i][1].swap(a[s][1]);
            } else {
                x = num - x;
                while (x--) {
                    auto it = a[s][0].rbegin();
                    a[i][0].insert(*it);
                    a[i][1].insert(make_pair(it->second, it->first));
                    a[s][0].erase(make_pair(it->first, it->second));
                    a[s][1].erase(make_pair(it->second, it->first));
                }
            }
        }
        cout << a[i][0].size() << '\n';
    }
    return 0;
}

定义pb_ds方式

//头文件必须包含
#include <bits/extc++.h>
using namespace __gnu_pbds;
//定义模板
template <class T>
using Tree = tree<T, null_type, less<T>, rb_tree_tag, 
             tree_order_statistics_node_update>;
Tree<pair<int, int> > a[200010][2];
//直接定义
tree<pair<int, int>, null_type, less<pair<int, int> >, rb_tree_tag,
tree_order_statistics_node_update> a[200010][2];

pb_ds可以直接当作set进行操作,其中insert和erase没有区别

其中最关键的是它的swap()的时间复杂度是常数

find_by_order(k)//找到下标从0开始的第k大(第0大,第1大....)
order_of_key(k)//返回严格小于k的数的数量

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

智能推荐

Git自学笔记(本地操作)_git status -uno-程序员宅基地

文章浏览阅读629次。简介Git,目前使用最为广泛的分布式版本控制系统,由Linux之父Linus Benedict Torvalds开发。所谓的分布式版本控制系统,其实是一种管理我们代码的软件。试想,在开发过程中,我们的代码可能会经过多次迭代,版本一多,自然混乱;对于一些用不上但又不敢直接删除的的早期代码,新建文件保存或打上注释标记又太麻烦……此外,在团队协作中每个人的改动、进度的同步也是难以处理的事情。而以..._git status -uno

【Qt】:常用控件(二:QWidget核心属性)-程序员宅基地

文章浏览阅读1.1k次,点赞11次,收藏11次。cursor,font,tooltip,focuspolicy,stylesheet的使用

C++编译链接的那些小事_/home/runner/temp/41256961.42894/main.cc: in funct-程序员宅基地

文章浏览阅读957次。本文转载,尊重原创!受益良多!点击打开链接最近,有同事向我多次问及C++关于编译链接方面的问题,包括如下:1:什么样的函数以及变量可以定义在头文件中2:extern "C"的作用3:防止重复包含的宏的作用4:函数之间是怎么链接起来的我认为,这些问题不难,书上基本上都有,但要是没有真正思考过,就凭死记硬背,也就是只能“嘴上说说”而已,遇到问题还真棘手,所以我觉得有_/home/runner/temp/41256961.42894/main.cc: in function ‘int main()’:

Seata-server启动闪退问题_seata-server.batshantui-程序员宅基地

文章浏览阅读8.1k次,点赞14次,收藏17次。第一步:查看错误日志打开cmd运行seata-server.bat查看错误信息Error: missing server' JVl at C:\ Program Files (x86)\ Javaljre1. 8. 0_221\ bin\ server \ jvn. d11Please instal1 or use the TRE or TDK that contains these missing components找到出错目录搜索jvm.dll在bin文件夹新_seata-server.batshantui

android 中的service 实现之 利用onStart方式_service的onstart方法-程序员宅基地

文章浏览阅读6.4k次。service的实现主要有两种方式,一种是onStart方式,另一种是onBoundd方式。两种方式的关于service的生命周期不一样。前者是和activity的生命周期一样的,后者则不是。activity结束了service可以继续运行。onStart 方法来调用service的话,调用者其实和service是没有关系的,调用者消亡了的话,service是依然可以继续运行的;onB_service的onstart方法

数智化转型人才“大考”,综合人才成为企业“基础设施”_数智化落地,需要专业能力-程序员宅基地

文章浏览阅读302次。数智化转型的目的和核心都是实现业务转型、创新和增长,而我们的基石就是数智化技术。企业做数智化转型,需要什么样的数智化人才?员工要具备哪些能力才能助力企业完成转型?这样的员工该如何培养......首先我们来看下都有哪些数智化人才,以及他们分别需要什么能力。第一类人才是数字化专业人才,他们的主要任务是发现企业业务上的问题、并利用科学技术创造性的解决问题。对于专业人才来说,他需要有技术能力、产品能力、运营能力以及项目管理能力,具体解释为:技术能力:系统或平台规划与设计、开发与建设等_数智化落地,需要专业能力

随便推点

操作系统实验五、进程互斥实验——理发店问题_设理发店的理发室中有 3 个理发椅子和 3 个理发师,有一个可容纳-程序员宅基地

文章浏览阅读5.3k次,点赞3次,收藏52次。问题描述理发店问题:假设理发店的理发室中有 3 个理发椅子和 3 个理发师,有一个可容纳4个顾客坐等理发的沙发。此外还有一间等候室,可容纳13位顾客等候进入理发室。顾客如果发现理发店中顾客已满(超过 20 人),就不进入理发店。在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。顾客理完发后,可向任何一位理发师付款。但理发店只有一本..._设理发店的理发室中有 3 个理发椅子和 3 个理发师,有一个可容纳

LDA主题模型进阶-程序员宅基地

文章浏览阅读553次。其实我在TF-IDF和gensim实现主题提取写过LDA关于LDA的理论相关知识以后有机会阐释import numpy as npfrom gensim import corpora,models,similaritiesfrom pprint import pprint #打印出来的更好看1.构建停用词列表def load_stopword(): f_stop=open('stopword.txt') sw=[line.strip() for line in f_stop]

ionic5+angular8混合移动开发(一)——环境搭建_ionic新建项目指定angular的版本-程序员宅基地

文章浏览阅读9.7k次。ionic5+agular8混合移动开发(一)——环境搭建1、首先安装nodejs,本次安装的是v10.16.02、解决国内连接下载npm包慢,可以配置淘宝镜像3、创建App并运行1、首先安装nodejs,本次安装的是v10.16.01.0 下载nodejs最新稳定版,下载地址如下:https://nodejs.org1.1 安装下载的node-v10.16.0-x64.msi1.2 ..._ionic新建项目指定angular的版本

3.搭建分类器-pytorch与自然语言处理_.join('%5s' % classes[predicted[j]是啥意思-程序员宅基地

文章浏览阅读1.5k次。​Python人工智能20个小时玩转NLP自然语言处理【黑马程序员】_哔哩哔哩_bilibili目的:对不同的输入图像进行识别并分类。采用CIFAR10数据集,进行单分类任务_.join('%5s' % classes[predicted[j]是啥意思

CCS编译问题之#1965 cannot open source file “DSP2833x_Device.h“_descriptionresourcepathlocationtype #1965 cannot o-程序员宅基地

文章浏览阅读3w次,点赞30次,收藏70次。#1965 cannot open source file "DSP2833x_Device.h"1. 现象2. 原因分析3. 解决措施1. 现象当使用CCS进行编译会出现如下错误。2. 原因分析因为.h文件所存放的地址与CCS中的默认位置不同引起。CCS编译器在其默认存放.h文件的地方寻找文件,但是没有找到,就会报错。源文件引用的.h文件确实不存在,当引用的头文件与意图引起的头文件..._descriptionresourcepathlocationtype #1965 cannot open source file "dsp28

dp与px转换_public class dporpxutils { public static int dip2p-程序员宅基地

文章浏览阅读1k次。/** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */public static int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpV_public class dporpxutils { public static int dip2px(context context, floa...

推荐文章

热门文章

相关标签