首页 > 其他分享 >lanqiaoOJ 3333:肖恩的排序 ← 双指针+排序(从大到小)

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

时间:2025-01-17 10:32:21浏览次数:3  
标签:10 int 3333 数为 从大到 数组 排序

【题目来源】
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 pointer
        while(i<n && a[i]>b[j]) {
            cnt++,i++;
        }
        ans*=cnt; //Multiplication principle
        cnt--; //Used one, Minus it
        ans%=MOD;
    }
    cout<<ans<<endl;

    return 0;
}

/*
in:
5
2 3 5 6 8
1 2 3 4 5

out:
4
*/




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


 

标签:10,int,3333,数为,从大到,数组,排序
From: https://blog.csdn.net/hnjzsyjyj/article/details/145159640

相关文章

  • vue3 实现标签拖拽排序 + curd
    ......
  • 冒泡排序
    冒泡排序importjava.util.Arrays;publicclassbubbleSort{publicstaticvoidmain(String[]args){int[]a={2,1,5,6,3,2,9,19,11};bubbleSort(a);System.out.println(Arrays.toString(a));}publicstaticvoidbubbleSort(i......
  • 快速排序
    快速排序每次选择一个数为中间值,将数比该数小的数放在该数左边,比该数大的数放在该数右边,再重复对该数左右两边的数进行该操作,直到所有数都排列完毕。例:inta[10]={1,465,31,59,18,67,95,16,20,6};我们选定6为中间数第一次排序:1,6,31,59,18,67,95,16,20,465对6左边数进行排......
  • php根据权重自定义排序
    <?php//支付列表数组$paymentList=[['name'=>'支付宝','info'=>'支持多种支付场景','weight'=>3],['name'=>'微信支付','info'=>'便捷的移动支付','wei......
  • C/C++基础之sort排序
    sort(起始地址,结束地址的下一位,比较函数)注:比较函数可写可不写。默认sort函数是升序排序的。使用方法如下:#include<bits/stdc++.h>usingnamespacestd;intmain(){ inta[100]; intn;//数组的实际长度 ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);//取消同......
  • Codeforces 1536B Prinzessin der Verurteilung 题解 [ 紫 ] [ 后缀自动机 ] [ 动态规
    PrinzessinderVerurteilung:最短未出现字符串的板子。思路考虑在SAM上dp,定义\(dp_i\)表示从\(i\)节点走到NULL节点所花费的最少步数。显然我们建出反图,跑DAG上dp即可。转移如下:\[dp_i=1+\min_{j=1}^{|v_i|}dp_{v_{i,j}}\]输出方案的话记录下每个dp值的先驱,最......
  • 2025-1-15-十大经典排序算法 C++与python
    文章目录十大经典排序算法比较排序1.冒泡排序2.选择排序3.插入排序4.希尔排序5.归并排序6.快速排序7.堆排序非比较排序8.计数排序9.桶排序10.基数排序十大经典排序算法十大经典排序算法可以分为比较排序和非比较排序:前者包括冒泡排序、选择排序、插......
  • 排序数组中查找数组的第一个和最后一个位置
    leetcode34之前的博客里面有写到关于二分查找的实现方法,这次这个题目也需要使用到二分查找,关于二分查找的实现可以参考博客:二分查找思路由于题目中给出的数组是递增排序的,那么我们会优先考虑到使用二分查找法,数组中可能出现多个重复的target,我们要查找的就是第一个和最......
  • LeetCode:23.合并K个排序链表
    LeetCode:23.合并K个排序链表解题思路新链表的下一个节点一定是k个链表头中的最小节点。考虑选择使用最小堆。解题步骤构建一个最小堆,并依次把链表头插入堆中。弹出堆顶接到输出链表,并将堆顶所在链表的新链表头插入堆中。等堆元素全部弹出,合并工作就完成了。classMinHeap{......
  • C语言练习之姓名排序
     从今天开始,练习题的博客都会迎来一个升级,我们会注意更多细节,让这个程序尽可能的完善(尽可能想象到千奇百怪的输入,比如让输个数偏输入个字母的),尽量走向实际应用题干请设计一个程序,输入用户指定的数量的名字,然后根据名字长度排序,按长度由大到小进行输出思路名字长度排序(数组......