Educational Codeforces Round 94 (Rated for Div. 2) 参与排名人数15221
[codeforces 1400D] Zigzags 数组元素间隔相等的乘法原理
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址https://codeforces.com/contest/1400/problem/D
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
D - Zigzags | GNU C++17 | Accepted | 46 ms | 3700 KB |
题目大意:在一个数组中,统计a[i]==a[k],a[j]==a[l],1<=i<j<k<l<=n,的数量。
基本思路:
样例模拟如下:
5
2 2 2 2 2
5
情况1:(2) <2> (2) <2> 2
情况2:(2) <2> (2) 2 <2>
情况3:(2) <2> 2 (2) <2>
情况4:(2) 2 <2> (2) <2>
情况5:2 (2) <2> (2) <2>
AC代码如下:
#include <stdio.h>
#define maxn 3010
#define LL long long
int a[maxn],cnt[maxn];
int main(){
int t,n,i,j,sum;
LL ans;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",&a[i]);
for(i=1;i<=n;i++)cnt[i]=0;
ans=0;
/*
以
情况2:|(2)区间一|<2> |(2) 2区间三|<2>
情况3:|(2)区间一|<2> |2 (2)区间三|<2>
为例,
cnt[i]统计区间一,i值元素数量
sum,统计区间一,区间三,雷同元素的组合数量。
如上述情况,cnt[2]=1,sum=2
*/
for(i=1;i<=n;i++){
sum=0;
for(j=i+1;j<=n;j++){
if(a[i]==a[j])ans+=sum;
sum+=cnt[a[j]];
}
cnt[a[i]]++;
}
printf("%lld\n",ans);
}
return 0;
}