ABC166 E-esta mensagem se autodestruirá em 5s (derivação de fórmula simples)

Título:

Insira a descrição da imagem aqui

solução:

题目要求的数对需要满足:下标差=权值和,
设i<j,数对(i,j)满足条件,那么有:
j-i=a[i]+a[j],
j-a[j]=a[i]+i.

枚举j,判断有多少个a[i]+i=j-a[j]即可,可以用map维护a[i]+i的数量.

código:

#include<bits/stdc++.h>
#define int long long
#define PI pair<int,int>
using namespace std;
const int maxm=2e6+5;
int a[maxm];
int n;
void solve(){
    
    
    cin>>n;
    for(int i=1;i<=n;i++){
    
    
        cin>>a[i];
    }
    map<int,int>mp;
    int ans=0;
    for(int i=1;i<=n;i++){
    
    
        ans+=mp[i-a[i]];
        mp[a[i]+i]++;
    }
    cout<<ans<<endl;
}
signed main(){
    
    
    solve();
    return 0;
}

Acho que você gosta

Origin blog.csdn.net/weixin_44178736/article/details/115185582
Recomendado
Clasificación