(枚举)(模拟)(前缀和)(数组模拟哈希)(可二分)1236. 递增三元组

简介: (枚举)(模拟)(前缀和)(数组模拟哈希)(可二分)1236. 递增三元组

题目链接

1236. 递增三元组 - AcWing题库

一些话

int f[N];

memset(f,0,sizeof f)影响不到f[N]

所以尽量不要对f[N]赋值,不要用f[N]操作

流程

//由三重暴力i,j,k因为三重暴力底下是分别用i和j,j和k作比较,想到可以拆成i~j,j ~k 再乘起来,

// 但 n < 1e5,双循环复杂度也还是太高,不过还有更优的方法,

// 即枚举b中元素,求b的第k个元素大于a中元素的个数,和b的第k个元素小于c中元素的个数,然后相乘。可以通过前缀和+哈希或二分来实现

// 前缀和+哈希要先统计a和c的元素个数,然后通过前缀和来得到a和c中小于等于某值的元素个数的数组,

// 然后求b的第k个元素大于a中元素的个数就是这个a中小于等于b[k] -1 的元素个数,即s[b[k] - 1]

//b的第k个元素小于c中元素的个数就是c中元素的个数减去c中小于等于b的第k个元素的个数,即s[N-1] - s[b[i]];

套路

统计数组中小于等于多个某值的元素个数:

       先哈希统计元素个数,然后前缀和

1. for(int i = 0;i < n;i++) cnt[a[i]]++;
2. for(int i = 1;i < N;i++) s[i] += s[i-1] + cnt[i];

ac代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 1e5 + 10;
int a[N],b[N],c[N],cc[N],ca[N],cnt[N],s[N];
int main(){
    int n;
    cin >> n;
    for(int i = 0;i < n;i++) cin >> a[i] , a[i]++;
    for(int i = 0;i < n;i++) cin >> b[i] , b[i]++;
    for(int i = 0;i < n;i++) cin >> c[i] , c[i]++;
    for(int i = 0;i < n;i++) cnt[a[i]]++;
    for(int i = 1;i < N;i++) s[i] += s[i-1] + cnt[i];
    for(int i = 0;i < n;i++) ca[i] = s[b[i]-1];
    memset(s,0,sizeof s);
    memset(cnt,0,sizeof cnt);
    for(int i = 0;i < n;i++) cnt[c[i]]++;
    for(int i = 1;i < N;i++) s[i] += s[i-1] + cnt[i];
    for(int i = 0;i < n;i++) cc[i] = s[N-1] - s[b[i]];
    long long ans = 0;
    for(int i = 0;i < n;i++){
        ans += ca[i] * (long long) cc[i];
    }
    cout << ans << endl;
    return 0;
}
目录
相关文章
|
6月前
|
C语言
C语言----随机输入10个数,从小到大依次排列
C语言----随机输入10个数,从小到大依次排列
|
6月前
|
移动开发 C++
【洛谷 P1157】组合的输出 题解(深度优先搜索+枚举子集)
该问题要求编程输出从1到n中选择r个元素的所有组合,组合按字典序排列。输入包含两自然数n和r(1&lt;n&lt;21, 0≤r≤n)。输出每个组合时,每个数字占据3个字符宽度。提供的AC代码使用C++,通过递归搜索方法枚举子集。样例输入为5 3,输出显示所有3个元素的组合。
57 0
|
7月前
|
存储 算法 测试技术
位运算、状态压缩、枚举子集汇总
位运算、状态压缩、枚举子集汇总
|
7月前
|
人工智能 测试技术
【位运算 状态压缩 枚举子集】1178. 猜字谜
【位运算 状态压缩 枚举子集】1178. 猜字谜
|
7月前
|
算法
算法题 — 整数转二进制,查找其中1的数量
算法题 — 整数转二进制,查找其中1的数量
54 0
|
7月前
|
存储 Python
处理随机元素来创建数列是一个涉及随机数生成和数列构造的过程
处理随机元素来创建数列是一个涉及随机数生成和数列构造的过程
70 0
|
算法 测试技术 C#
C++前缀和算法的应用:得到连续 K 个 1 的最少相邻交换次数 原理源码测试用例
C++前缀和算法的应用:得到连续 K 个 1 的最少相邻交换次数 原理源码测试用例
|
7月前
|
机器学习/深度学习
【每日一题Day128】LC2357使数组中所有元素都等于零 | 排序+模拟 哈希表
【每日一题Day128】LC2357使数组中所有元素都等于零 | 排序+模拟 哈希表
35 0
|
7月前
【每日一题Day234】LC1171从链表中删去总和值为零的连续节点 | 链表模拟 哈希表+前缀和
【每日一题Day234】LC1171从链表中删去总和值为零的连续节点 | 链表模拟 哈希表+前缀和
43 0
|
存储 算法 JavaScript
设计并实现一个函数, 功能为给定一个存储为随机整数的数组,从中删除所有值为i的整数
设计并实现一个函数, 功能为给定一个存储为随机整数的数组,从中删除所有值为i的整数