PAT (Basic Level) Practise 1045 快速排序(离散化+主席树区间内的区间求和)

1045. 快速排序(25)

时间限制
200 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CAO, Peng

著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。 给定划分后的N个互不相同的正整数的排列,请问有多少个元素可能是划分前选取的主元?

例如给定N = 5, 排列是1、3、2、4、5。则:

 

  • 1的左边没有元素,右边的元素都比它大,所以它可能是主元;
  • 尽管3的左边元素都比它小,但是它右边的2它小,所以它不能是主元;
  • 尽管2的右边元素都比它大,但其左边的3比它大,所以它不能是主元;
  • 类似原因,4和5都可能是主元。

     

    因此,有3个元素可能是主元。

    输入格式:

    输入在第1行中给出一个正整数N(<= 105); 第2行是空格分隔的N个不同的正整数,每个数不超过109

    输出格式:

    在第1行中输出有可能是主元的元素个数;在第2行中按递增顺序输出这些元素,其间以1个空格分隔,行末不得有多余空格。

    输入样例:
    5
    1 3 2 4 5
    
    输出样例:
    3
    1 4 5

 

 

题目链接:PAT 1045

最近刚刚数据结构学了快速排序,根据快速排序基本法,可以发现若一个数被选为主元,那么这一次用它划分之后它左边的数一定均小于它,右边的数均大于它,那就可以用主席树来做啦。

直接查询$A_{1}$~$A_{i-1}$范围内是否有大于key的数和$A_{i+1}$~$A_{n}$范围内是否有小于key的数即可,挺模版的一道题,当然主席树代码量比较大,用BIT求逆序数好像也行,反正大概意思理解了方法应该是多种的,记得查询的时候范围要特判一下免得无限递归,另外一个最大的坑点就是这题如果没有主元,也要有输出空行,期末快考完了,只能刷点水题了…………

代码:

#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
typedef pair<int, int> pii;
typedef long long LL;
const double PI = acos(-1.0);
const int N = 1e5 + 7;
struct seg
{int lson, rson;int cnt;inline void reset(){lson = rson = cnt = 0;}
};
seg T[N * 20];
int root[N], arr[N], tot;
vector<int>vec, ans;void init()
{CLR(root, 0);T[0].reset();vec.clear();ans.clear();tot = 0;
}
void update(int &cur, int ori, int l, int r, int pos)
{cur = ++tot;T[cur] = T[ori];++T[cur].cnt;if (l == r)return ;int mid = MID(l, r);if (pos <= mid)update(T[cur].lson, T[ori].lson, l, mid, pos);elseupdate(T[cur].rson, T[ori].rson, mid + 1, r, pos);
}
int query(int S, int E, int l, int r, int ql, int qr)
{int ret = 0;if (ql <= l && r <= qr)ret = T[E].cnt - T[S].cnt;else{int mid = MID(l, r);if (ql <= mid)ret += query(T[S].lson, T[E].lson, l, mid, ql, qr);if (qr > mid)ret += query(T[S].rson, T[E].rson, mid + 1, r, ql, qr);}return ret;
}
int main(void)
{int n, i;while (~scanf("%d", &n)){init();for (i = 1; i <= n; ++i){scanf("%d", &arr[i]);vec.push_back(arr[i]);}sort(vec.begin(), vec.end());vec.erase(unique(vec.begin(), vec.end()), vec.end());for (i = 1; i <= n; ++i)arr[i] = lower_bound(vec.begin(), vec.end(), arr[i]) - vec.begin() + 1;for (i = 1; i <= n; ++i)update(root[i], root[i - 1], 1, 100000, arr[i]);for (i = 1; i <= n; ++i){bool flag = true;if (i - 1 >= 0 && arr[i] + 1 <= 100000)flag &= (query(root[0], root[i - 1],  1, 100000, arr[i] + 1, 100000) == 0); //查询左边是否有大于key的数if (flag && arr[i] - 1 >= 1)flag &= (query(root[i], root[n], 1, 100000, 1, arr[i] - 1) == 0); //查询右边是否有小于key的数if (flag)ans.push_back(vec[arr[i] - 1]);}int sz = ans.size();printf("%d\n", sz);sort(ans.begin(), ans.end());for (i = 0; i < sz; ++i)printf("%d%s", ans[i], i == sz - 1 ? "\n" : " ");if (!sz)putchar('\n');}return 0;
}

转载于:https://www.cnblogs.com/Blackops/p/6244062.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧交通day03-车道线检测实现06:车道线定位及拟合+代码实现

学习目标 了解直方图确定车道线位置的思想我们根据前面检测出的车道线信息&#xff0c;利用直方图和滑动窗口的方法&#xff0c;精确定位车道线&#xff0c;并进行拟合。 1. 定位思想 下图是我们检测到的车道线结果&#xff1a; 沿x轴方向统计每一列中白色像素点的个数&…

USB驱动程序

1、USB驱动程序存在于不同的内核子系统(块设备、网络设备、字符设备等等)和USB主控制器之中。 2、USB核心为USB驱动程序提供了一个用于访问和控制USB硬件的接口,而不必考虑系统当前存在的各种不同类型的USB硬件控制器。 2.1 USB里的设备模型 Linux里一个很重要的概念是设备…

TemplateSyntaxError at XXXX或页面样式未生效

报错TemplateSyntaxError at或页面样式未生效 直观原因就是模板的语法有误&#xff0c;造成这一原因的根源是使用pycharm&#xff08;idea&#xff09;的自动注释&#xff0c;而pycharm没有装django配置&#xff0c;ctrl/时会将block中的内容用html注释<!—>包围内容 对…

智慧交通day03-车道线检测实现07:车道曲率和中心点偏离距离计算+代码实现

学习目标 知道车道曲率计算的方法知道计算中心点偏离距离的计算1.曲率的介绍 曲线的曲率就是针对曲线上某个点的切线方向角对弧长的转动率&#xff0c;通过微分来定义&#xff0c;表明曲线偏离直线的程度。数学上表明曲线在某一点的弯曲程度的数值。曲率越大&#xff0c;表示…

Tomcat崩溃

参考&#xff1a; http://bbs.csdn.net/topics/390391810?page1 自己遇到的&#xff1a; ------------------------------------------------------------------------------------------------------------------------------------------------------------------ ## A fata…

写给在深圳奋斗的我

在写这文章之前考虑了很久&#xff0c;打算以真实的情况来描写这段时间 我2012年毕业&#xff0c;以校招的身份进入了TCL&#xff0c;实属万分幸运&#xff0c;在那里认识了很多这辈子都值得深交的同学&#xff0c;朋友&#xff0c;战友&#xff0c;说到战友&#xff0c;那是因…

Django模板中如何将函数的变量作为字典key并获取对应的value

Django模板中如何将函数的变量作为字典key并获取对应的value 问题 现有一字典 mydict {abc: 123} key abc传入到模板后 在模板html中你可能像下面这样&#xff0c;来取出字典的值 {% block base %} ... {{ mydict[key] }} ... {% endblock %}但在模板中并不支持Python列表…

智慧交通day03-车道线检测实现08: 在离线视频(非实时)中检测车道线+代码实现

学习目标 了解在视频中检测车道线的方法在前面几节中一步步完成摄像机标定、图像畸变校正、透视变换、提取车道线、检测车道线、计算曲率和偏离距离后&#xff0c;在图像上实现了复杂环境下的车道线检测算法。现在我们将视频转化为图片&#xff0c;然后一帧帧地对视频数据进行处…

gets函数

#include "stdio.h" /**/ void main() {char a[100];while(gets(a)!NULL){printf("Owen.wei%s\n",a);} // char *str1NULL;printf("hello w23232323orld2!\n"); }

智慧交通day03-车道线检测实现09:车道线检测代码汇总(Python3.8)

import cv2 import numpy as np import matplotlib.pyplot as plt #遍历文件夹 import glob from moviepy.editor import VideoFileClip"""参数设置""" nx 9 ny 6 #获取棋盘格数据 file_paths glob.glob("./camera_cal/calibration*.jpg…

Django 模板实现(动态)图片/头像展示到页面

Django 模板实现&#xff08;动态&#xff09;图片作头像展示到页面 在网上搜了加载图片到前端的解决方法&#xff0c;大多都比较复杂&#xff0c;要引用PIL&#xff0c;下载Cropper插件&#xff08;可以用于裁图&#xff09;之类的&#xff0c;下面是一个简单易懂的方法实现&…

CSDN编程挑战(交换字符)

如果字符串str3能够由str1和str2中的字符按顺序交替形成&#xff0c;那么称str3为str1和str2的交替字符串。例如str1"abc"&#xff0c;str2"def"&#xff0c;那么"adbecf", "abcdef", "abdecf", "abcdef", "…

Unknown encoder ‘libx264‘的解决方法

1、问题描述&#xff1a; 运行程序的时候出现了这个错误,Unknown encoder ‘libx264’,和ffmpeg库有关. MoviePy error: FFMPEG encountered the following error while writing file run1output_video.mp4: b”Unrecognized option ‘preset’.\nError splitting the argumen…

Django之验证码的实现,简单快捷的方法

Django之验证码的实现&#xff0c;简单快捷的方法 实现验证码随网页变动即时刷新&#xff0c;实现有期限时间 请确保安装好pillow 直接show code&#xff1a; 0、路由urs.py from django.urls import path, re_path from . import views urlpatterns [re_path(r^test/$, vie…

5 Django系列之通过list_display展示多对多与外键内容在admin-web界面下

list_display展示多对多关系的内容 表结构关系 表一 class Server(models.Model):asset models.OneToOneField(Asset)created_by_choices ((auto,Auto),(manual,Manual),)created_by models.CharField(choicescreated_by_choices,max_length32,defaultauto) #auto: auto cre…

智慧交通day04-特定目标车辆追踪01:总览概述

项目介绍&#xff1a; 运动目标跟踪一直以来都是一项具有挑战性的工作, 也是研究的热点方向. 现阶段, 随着硬件设施 的不断完善和人工智能技术的快速发展, 运动目标跟踪技术越来越重要. 目标跟踪在现实生活中有很 多应用, 包括交通视频监控、运动员比赛分析、智能人机交互 、跟…

Python3之字典生成器结合lambda实现按key/value排序

Python3之字典生成器结合lambda实现按key/value排序 1、先介绍不常见的字典按value排序&#xff1a; dict1 {"g": 2, "f": 1, "a": 6} print(dict1.values()) d1 sorted(dict1.items(), keylambda d: d[1], reverseTrue) # 按字典values倒…

XCode8 App上传AppStore更新

1.在这个网站中https://itunesconnect.apple.com 点击“我的APP” 选取需要更新的app 2.点击加号 版本或平台&#xff0c;填写对应的更新版本 3.配置Xcode项目 1 》注意 上图的 套装ID 就是项目中的 Bundle Identity 必须要一模一样 并且不能修改 》配置相同的Bundle Identity…

智慧交通day04-特定目标车辆追踪02:Siamese网络+单样本学习

1.Siamese网络 Siamese network就是“连体的神经网络”&#xff0c;神经网络的“连体”是通过共享权值来实现的&#xff0c;如下图所示。共享权值意味着两边的网络权重矩阵一模一样&#xff0c;甚至可以是同一个网络。 如果左右两边不共享权值&#xff0c;而是两个不同的神经网…

学习网站(不断更新)

一个师兄给我的在线可编译的网站: http://www.fenby.com/user/me Linux最新内核代码: http://www.kernel.org/如果是拿来学习研究的 Linux早期版本内核代码(简单易学): http://www.oldlinux.org/index_cn.html LDD3例子这个家伙写得非常不错 http://blog.csdn.net/liuhaoy…