1236. 递增三元组
数据范围10^5, 所以考虑O(nlogn)或者O(n)的复杂度,所以最多枚举一个数组。
到底是枚举数组a,还是b还是c
要求满足ai < bi < ci
如果枚举a,那么由于b和c之间存在限制,即对b和c的选择不独立,所以不可以用乘法原理
而枚举b的话,a和c是独立的, 可以用乘法原理。
前缀和O(n)
#include<iostream>
#include<cstring>
#define LL long long
using namespace std;
const int N = 100010;
int a[N], b[N], c[N];
int as[N], cs[N];
int n, cnt[N];
int main(){
scanf("%d", &n);
for(int i = 0; i < n; i ++) scanf("%d", &a[i]), a[i] ++;
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 ++) as[i] = as[i - 1] + cnt[i];
memset(cnt, 0, sizeof cnt);
LL res = 0;
for(int i = 0; i < n; i ++) cnt[c[i]] ++;
for(int i = 1; i <= N; i ++) cs[i] = cs[i - 1] + cnt[i];
for(int i = 0; i < n; i ++) res += (LL) as[b[i] - 1] * (n - cs[b[i]]);
cout << res;
return 0;
}
排序+二分O(nlogn)
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int N = 100010;
int a[N], b[N], c[N];
int as[N], cs[N];
int n, cnt[N];
int findl(int x){
int l = 0, r = n - 1;
while(l < r){
int mid = l + r + 1 >> 1;
if(a[mid] < x) l = mid;
else r = mid - 1;
}
if(a[l] < x) return l;
return -1;
}
int findr(int x){
int l = 0, r = n - 1;
while(l < r){
int mid = l + r >> 1;
if(c[mid] > x) r = mid;
else l = mid + 1;
}
if(c[l] > x) return l;
return n;
}
int main(){
scanf("%d", &n);
for(int i = 0; i < n; i ++) scanf("%d", &a[i]);
for(int i = 0; i < n; i ++) scanf("%d", &b[i]);
for(int i = 0; i < n; i ++) scanf("%d", &c[i]);
sort(a, a + n);
sort(b, b + n);
sort(c, c + n);
LL res = 0;
for(int i = 0; i < n; i ++){
int l = findl(b[i]), r = findr(b[i]);
res += (LL) (l + 1) * (n - r);
}
cout << res;
return 0;
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步