首页 > 其他分享 >递增三元组

递增三元组

时间:2023-01-11 18:57:52浏览次数:35  
标签:rep int res 递增 三元组 ++ 数组 scanf

给定三个整数数组

\(A=[A_1,A_2,…A_N],\)
\(B=[B_1,B_2,…B_N],\)
\(C=[C_1,C_2,…C_N],\)

请你统计有多少个三元组 (i,j,k) 满足:

\(1 ≤ i,j,k ≤ N\)
\(A_i < B_j < C_k\)
输入格式
第一行包含一个整数 N。

第二行包含 N 个整数 \(A_1,A_2,…A_N。\)

第三行包含 N 个整数 \(B_1,B_2,…B_N。\)

第四行包含 N 个整数 \(C_1,C_2,…C_N。\)

输出格式
一个整数表示答案。

数据范围
\(1 ≤ N ≤ 10^5,\)
\(0 ≤ A_i,B_i,C_i ≤ 10^5\)
输入样例:

3
1 1 1
2 2 2
3 3 3

输出样例:

27

方法1. 排序+二分:

将三个数组从小到大排序,枚举中间的数字也就是B[j], 在数组A中找到第一个大于等于B[j]的下标x, 在数组C中找到第一个大于B[j]的下标y,

这个时候需要求出A数组中小于B[j]的数量,C数组中大于B[j]的数量; 由于我们用二分求出了下标,求数量就很简单了,(这一步的求法取决于数组下标从0开始还是从1开始),我这里使用的是1base,所以数组A中小于B[j]的数量是(i-1) , 数组C中大于B[j]的数量是 (n-j+1), 运用乘法原理相乘累加进答案

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i = a;i < b;i++)
typedef long long ll;

const int N = 100010;
int a[N], b[N], c[N], n;
int main() {
    scanf("%d", &n);
    rep(i,1,n+1) scanf("%d", &a[i]);
    rep(i,1,n+1) scanf("%d", &b[i]);
    rep(i,1,n+1) scanf("%d", &c[i]);
    sort(a+1,a+1+n);sort(b+1,b+1+n);sort(c+1,c+1+n);
    ll res = 0;
    rep(_,1,n+1) {
        int x = b[_];
        int i = lower_bound(a+1,a+1+n,x) - a;
        int j =  upper_bound(c+1,c+1+n,x) - c;
        res += 1ll*(i-1)*(n-j+1);
        //printf("%d %d\n", i, j);
    }
    printf("%lld\n", res);
    return 0;
}

方法2. 前缀和

用前缀和来求一个数组中小于某个数的个数和大于某个数的个数(这种做法与数值范围有关) 空间换时间

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i = a;i < b;i++)
typedef long long ll;

const int N = 100010;
int a[N], b[N], c[N], n;
ll sa[N], sc[N];

int main() {
    scanf("%d", &n);
    rep(i,1,n+1) {
        scanf("%d", &a[i]), a[i]++;
        sa[a[i]]++;
    }
    rep(i,1,n+1) scanf("%d", &b[i]), b[i]++;
    rep(i,1,n+1) {
        scanf("%d", &c[i]), c[i]++;
        sc[c[i]]++;
    }
    rep(i,1,N) {
        sa[i] += sa[i-1];
        sc[i] += sc[i-1];
    }

    ll res = 0;
    rep(_,1,n+1) {
        int x = b[_];
        res += 1ll*(sa[x-1]*(n-sc[x]));
    }
    printf("%lld\n", res);
    return 0;
}

标签:rep,int,res,递增,三元组,++,数组,scanf
From: https://www.cnblogs.com/junlin623/p/17031547.html

相关文章

  • 算法—查找三数相加为零的三元组
    packagealgorithm;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;/***给定一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b......
  • 2042. 检查句子中的数字是否递增
    2042.检查句子中的数字是否递增classSolution{publicbooleanareNumbersAscending(Strings){char[]ch=s.toCharArray();intpre=-1;......
  • 递增序列——蓝桥(简单)
    题目描述对于一个字母矩阵,我们称矩阵中的一个递增序列是指在矩阵中找到两个字母,它们在同一行,同一列,或者在同一 4545 度的斜线上,这两个字母从左向右看、或者从上向下......
  • JavaScript 运算符-运算符,算数运算符,递增,递减,逻辑运算符,赋值运算符,运算符的优先级
    JavaScript运算符-运算符,算数运算符,递增,递减,逻辑运算符,赋值运算符,运算符的优先级目录JavaScript运算符-运算符,算数运算符,递增,递减,逻辑运算符,赋值运算符,运算符的优先级1......
  • 最长递增子序列
    目录题目思路,粗暴的递归动态规划解法做题时的全部思路,是一边做一边写的。代码俺的一些话题目给你一个整数数组nums,找到其中最长严格递增子序列的长度。子序列是由数......
  • excel 文本类型单元格下拉递增设置
    数字内容&文本类型的单元格在excel中下拉是不递增的,采用以下方法下拉递增生效:   ......
  • 【NOIP2017提高A组集训10.28】三元组
    Description有X+Y+Z个三元组(x[i],y[i],z[i]),请你从每个三元组中挑数,并满足以下条件:1、每个三元组中可以且仅可以选择一个数(即x[i],y[i],z[i]中的一个)2、选择x[i]的三元......
  • 非递减or非递增数列
    https://zhuanlan.zhihu.com/p/93486020给定一个长度为n的整数数组,你的任务是判断在最多改变1个元素的情况下,该数组能否变成一个非递减数列。我们是这样定义一个非递......
  • 学会CAD文字递增标注、批量查找替换,就能事半功倍!
    CAD制图时,经常会遇到需要使用CAD文字、标注等命令完善图纸参数信息内容的情况。尤其是在标注连续性数字信息、或者批量修改相同文字内容时,传统做法是使用文字命令+复制命令......
  • 洛谷 P1020 导弹拦截(递增子串 DP )
    题目大意:有一个数列,我们要获取一组子串,这个子串必须单调不增。问:(1)最长我们可以获取多长的这种子串(2)这个数列中最多有多少种这种子串解题思路:其中问题一是很典型的DP问题,最......