AcWing 1236. 递增三元组
原题链接
中等
作者:
无双飞怪
,
2024-04-17 10:41:56
,
所有人可见
,
阅读 1
思路:就是以b[i]为核心 去看在a[i]中比b[i]小的数有多少个 在c[i]中比b[i]大的数有多少个
做法:先哈希 存储a,c中每个数出现了多少次
然后统计1~N中每个数之前(包含这个数本身)有多少个在a中或在c中的数,这一步用前缀和算
最后用as去存a数组中有多少个比b[i]小的 以当前的下标i表示小于b[i]的数有多少个(在a中)
同理c也是
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],b[N],c[N];
int as[N],cs[N];
int cnt[N];
int s[N];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++) scanf("%d",&a[i]),a[i]++;//小细节 因为全局默认初始化为0 而数组中正儿八经的数有0 为了在下一步计算前缀和时cnt[0]不被多余计算 这里把所有正儿八经的数都+1
for(int i=0;i<n;i++) scanf("%d",&b[i]),b[i]++;
for(int i=0;i<n;i++) scanf("%d",&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];//存的是i之前有多少数
for(int i=0;i<n;i++) as[i]=s[b[i]-1];
memset(cnt,0,sizeof cnt);
memset(s,0,sizeof s);
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++) cs[i]=s[N-1]-s[b[i]];
long long res=0;
for(int i=0;i<n;i++) res+=(long long ) as[i]*cs[i];
cout<<res;
return 0;
}