1 条题解

  • 2
    @ 2024-7-16 20:16:28

    这题恶心程度有一种蓝桥杯的美

    由题目中的 ajai=jia_j-a_i=j-i 可以得出 aii=ajja_i-i=a_j-j,那么我们可以在输入 aia_i 时让其减去 ii,并用桶进行存储,并且运用排列组合的知识点即可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
上传者