1 条题解
-
2
这题恶心程度有一种蓝桥杯的美由题目中的 可以得出 ,那么我们可以在输入 时让其减去 ,并用桶进行存储,并且运用排列组合的知识点即可AC,部分不结合代码不好说清楚的点我直接写注释里了
#include<bits/stdc++.h> using namespace std; long long a[200005],tong[500005]; int main(){ int t; cin>>t; for(int i=1;i<=t;i++){ long long n,minn=2e6,maxx=-1; long long ans=0; cin>>n; for(int j=0;j<=n*2;j++) tong[j]=0; for(int j=1;j<=n;j++){ cin>>a[j]; a[j]-=j; tong[a[j]+n]++; //a[j]-j最小是1-n,所以要+n来将其变为正数 maxx=max(maxx,a[j]+n); minn=min(minn,a[j]+n); } //用maxx和minn是因为怕炸,不用应该也没问题,吧? for(int j=minn;j<=maxx;j++) ans+=tong[j]*(tong[j]-1)/2;//在所有相等的tong[j]个数字里,一定能按照下标进行排序,最小的能与其他n-1个匹配,第二小的能配n-2个,以此类推,可以推出此式 cout<<ans<<endl; } }
懂了的建议看 L114514,也是推结论的题
- 1
信息
- ID
- 755
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 107
- 已通过
- 15
- 上传者