lanqiaoOJ 3333:肖恩的排序 ← 双指针+排序(从大到小)

server/2025/1/16 9:02:20/

【题目来源】
https://www.lanqiao.cn/problems/3333/learning/

【题目描述】
肖恩提出了一种新的排序方法。
该排序方法需要一个标准数组 B 和一个待排序数组 A。在确保对于所有位置 i 都有
A[i]>B[i] 的前提下,肖恩可以自由选择 A 数组的排序结果。请计算按照这种排序方法,待排序数组 A 可能的结果有多少种。
对于任意一个位置 i,如果两次排序后 A[i] 不是同一个数字,那么这两种排序方式就被称为是不同的。结果可能很大,你需要将结果对 10^9+7 取余。

【输入格式】
第一行输入一个数字 n,为两个数组的长度。
第二行输入 n 个数字,表示待排序数组 A 中的所有元素。
第三行输入 n 个数字,表示标准数组 B 中的所有元素。
数据保证 1≤n≤10^5,1≤A[i]≤10^9,1≤B[i]≤10^9。

【输出格式】
输出一个数字,表示所有的排列数
对 10^9+7 取余后的结果。

【输入样例】
5
2 3 5 6 8
1 2 3 4 5

【输出样例】
4

【说明】
一共有以下四种符合条件的排序后的A数组:
2,3,5,6,8,
2,3,6,5,8,
2,3,8,5,6,
2,3,5,8,6。

【算法分析】
● 对一维数组元素从大到小进行排序的方法:
(1)利用
sort(a,a+n,greater<int>());对数组 a 的 n 个元素从大到小排序:https://blog.csdn.net/hnjzsyjyj/article/details/144239572
(2)自定义比较函数 down 作为 sort 函数的参数实现数组元素从大到小排序:https://blog.csdn.net/hnjzsyjyj/article/details/144329247
本题之所以使用从大到小排序,主要是可以大大降低计算量。

● 样例分析
对数组 A 从大到小排序后是 8 6 5 3 2,对数组 B 从大到小排序后是 5 4 3 2 1。易知:
B[0]=5,数组 A 中比 5 大的数为 8,6,故有 2 种选择;
B[1]=4,数组 A 中比 4 大的数为 8,6,5,但上一个位置使用了 1 个,故有 2 种选择;
B[2]=3,数组 A 中比 3 大的数为 8,6,5,但前两个位置使用了 2 个,故有 1 种选择;
B[3]=2,数组 A 中比 2 大的数为 8,6,5,3,
但前三个位置使用了 3 个,故有 1 种选择;
B[4]=1,数组 A 中比 1 大的数为 8,6,5,3,2,但前四个位置使用了 4 个,故有 1 种选择
依据
乘法原理,A 数组符合要求的排序结果有 2×2×1×1×1=4 种。

【算法代码】

#include<bits/stdc++.h>
using namespace std;typedef long long LL;
const int MOD=1e9+7;
const int maxn=1e5+5;
LL a[maxn],b[maxn];
int n;bool down(int u,int v) {return u>v;
}int main() {cin>>n;for(int i=0; i<n; i++) cin>>a[i];for(int i=0; i<n; i++) cin>>b[i];sort(a,a+n,down);sort(b,b+n,down);LL cnt=0,ans=1;for(int i=0,j=0; j<n; j++) { //double pointerwhile(i<n && a[i]>b[j]) {cnt++,i++;}ans*=cnt; //Multiplication principlecnt--; //Used one, Minus itans%=MOD;}cout<<ans<<endl;return 0;
}/*
in:
5
2 3 5 6 8
1 2 3 4 5out:
4
*/




【参考文献】
https://www.lanqiao.cn/problems/3333/learning/


 


http://www.ppmy.cn/server/158782.html

相关文章

1.3 k8s-上部署第一个应用程序

本节重点总结&#xff1a; 部署nginx Deploymentkubectl 基础命令 apply对资源进行配置get 查看资源describe 查看资源详细信息logs 查看pod中的日志exec 在pod中的容器环境内执行命令 Deployment 基本概念 Deployment 译名为 部署。在k8s中&#xff0c;通过发布 Deployment…

excel仅复制可见单元格,仅复制筛选后内容

背景 我们经常需要将内容分给不同的人&#xff0c;做完后需要合并 遇到情况如下 那是因为直接选择了整列&#xff0c;当然不可以了。 下面提供几种方法&#xff0c;应该都可以 直接选中要复制区域然后复制&#xff0c;不要选中最上面的列alt;选中可见单元格正常复制&#xff…

MATLAB学习笔记目录

MATLAB学习笔记-生成纯音并保存-CSDN博客 MATLAB学习笔记-各种格式之间的转换 - 知乎 MATLAB学习笔记-胞组&#xff08;cell array&#xff09;转换为矩阵&#xff0c;cell2mat_matlab如何把元胞数组改为矩阵-CSDN博客MATLAB学习笔记-判断数组、结构体、数值、字符串是否相同…

NLP自然语言处理分词模块PaddleNLP

自然语言处理(NLP)是人工智能的重要组成部分,主要用于处理和分析自然语言数据。在中文的自然语言处理中,分词是关键的一环。分词是指将一段连续的文字切分成一个个单独的词语或短语,以便于进一步的分析和处理。 PaddleNLP 是基于飞桨(PaddlePaddle)深度学习框架的自然语…

【React】脚手架进阶

目录 暴露webpack配置package.json的变化修改webpack.config.js配置less修改域名、端口号浏览器兼容处理处理跨域 暴露webpack配置 react-scripts对脚手架中的打包命令进行封装&#xff0c;如何暴露这些打包配置呢&#xff1f;上篇写到在package.json中的scripts配置项中有eje…

通过将模型权重的矩阵表示为低秩矩阵,可以减少需要调整的参数数量,通俗易懂的解释,不懂你爬网线打我

通过将模型权重矩阵表示为低秩矩阵&#xff0c;可以减少需要调整的参数数量&#xff0c;原因在于低秩矩阵的结构本身就比高秩矩阵更“紧凑”&#xff0c;即它们需要的独立参数更少。具体来说&#xff0c;低秩矩阵的结构可以通过减少模型的自由度&#xff08;独立参数的数量&…

Codeforces Round 976 (Div. 2) and Divide By Zero 9.0(A-E)

链接&#xff1a;Dashboard - Codeforces Round 976 (Div. 2) and Divide By Zero 9.0 - Codeforces A. Find Minimum Operations 思路 可以观察发现这里有个进制的思想&#xff0c;转换为k进制把每位数相加即可 代码 void solve(){int n,k;cin>>n>>k;if(k1){…

vue2制作长方形容器,正方形网格散点图,并且等比缩放拖动

需求&#xff1a;有个长方形的容器&#xff0c;但是需要正方形的网格线&#xff0c;网格线是等比缩放的并且可以无线拖动的&#xff0c;并且添加自适应缩放和动态切换&#xff0c;工具是plotly.js,已完成功能如下 1.正方形网格 2.散点分组 3.自定义悬浮框的数据 4.根据窗口大小…