CF1400D 题解
2025-10-18 14:30:15
发布于:广东
找这道题是因为这是学校模拟赛的题。
题目连接:Go
题目标签:
题目大意:
给出 个数 ,计算满足条件 并且 的四元组 的个数。
题目解析:
如果直接暴力枚举每个数,,超时。
注意到 ,那我们考虑前缀和,定义 ,即前 个数中 的数的个数。
接下来我们要考虑枚举哪两个数。
i,j
这样无法确定 的前后关系
i,k
还需要用 维护颜色,否则是 ,较麻烦。
i,l
无法确定 的前后关系
j,k
此时可能的 为 ,可能的 为 ,根据乘法原理,答案应增加 。
答案记得开 long long
#include<bits/stdc++.h>
using namespace std;
int n;
int a[5009],s[5009][5009];
long long ans;
int main(){
int t;
cin>>t;
while(t--){
ans = 0;
cin>>n;
for(int i = 1;i<=n;++i){
cin>>a[i];
s[i][a[i]] = s[i-1][a[i]]+1;
for(int j = 1;j<=n;++j){
if(s[i][j] == 0){
s[i][j] = s[i-1][j];
}
}
}
for(int j = 2;j<=n-2;++j){
for(int k = j+1;k<=n-1;++k){
ans+=s[j-1][a[k]]*(s[n][a[j]]-s[k][a[j]]);
}
}
cout<<ans<<'\n';
for(int i = 1;i<=n;++i){
a[i] = 0;
for(int j = 1;j<=n;++j){
s[i][j] = 0;
}
}
}
}
时间复杂度:
全部评论 5
你是真牛啊,还敢用memset
6天前 来自 广东
0改了
4天前 来自 广东
0
memset?
6天前 来自 广东
0?memset怎么了
5天前 来自 广东
0不会是外星人AK IOI
5天前 来自 广东
0不用memset我用什么初始化
5天前 来自 广东
0
有意思。
6天前 来自 广东
0%
6天前 来自 上海
0d
6天前 来自 广东
0
有帮助,赞一个