CF903 D.Almost Difference

来源:互联网 发布:nginx 优化加速 编辑:程序博客网 时间:2024/05/22 02:20

题目:http://codeforces.com/contest/903/problem/D
分析:
一开始做的好麻烦(离散化+前缀和+map),后来看了别人的代码简化了一下(前缀和+map)。
先说下思路,对第i个数,不考虑距离在1之内的情况,对答案的贡献是(i-1)*a[i]-sum,sum是1..i-1的前缀和;
注意: 要用longdouble!若输出用%.0Lf,需要用c++14,当然也可以用 cout << fixed << setprecision(0) << ans 这个输出。
代码:
离散化+前缀和+map

#include <bits/stdc++.h>using namespace std;const int Tmax=200005;int n,p;long double sum[Tmax],data[Tmax],what[Tmax],tmp[Tmax],num[Tmax],ans;map<double,int> lisan;bool equal(double x,double y){    return fabs(x-y)<=0.0000001;}void work(){    int i;    num[lisan[data[1]]]++;    for(i=2;i<=n;i++)    {        ans+=data[i]*(i-1)-sum[i-1];        if(equal(what[lisan[data[i]]-1],data[i]-1)==true)//if(what[lisan[data[i]]-1]==data[i]-1)        {            ans-=1.0*num[lisan[data[i]]-1];        }        if(equal(what[lisan[data[i]]+1],data[i]+1)==true)//if(what[lisan[data[i]]+1]==data[i]+1)        {            ans+=1.0*num[lisan[data[i]]+1];        }        num[lisan[data[i]]]+=1.0;        //printf("%d ",ans);    }    //printf("\n");    return;}int main(){    int i;    scanf("%d",&n);    for(i=1;i<=n;i++)    {        scanf("%Lf",&data[i]);        tmp[i]=data[i];    }    sort(tmp+1,tmp+1+n);    tmp[0]=-10;    for(i=1;i<=n;i++)    {        if(equal(tmp[i],tmp[i-1])==false)        {            lisan[tmp[i]]=++p;            what[p]=tmp[i];        }    }    //for(i=1;i<=n;i++) printf("%d ",what[i]);    ///printf("\n");    for(i=1;i<=n;i++)    {        sum[i]=sum[i-1]+data[i];        //printf("%d ",sum[i]);    }    //printf("\n");    work();    cout<<fixed<<setprecision(0)<<ans;//printf("%.0Lf",ans);    return 0;}

前缀和+map

#include <bits/stdc++.h>using namespace std;const int Tmax=200005;int n,p;long long int sum,tmp;map<long long int,int> MM;long double ans;int main(){    int i;    scanf("%d",&n);    for(i=1;i<=n;i++)    {        scanf("%I64d",&tmp);        ans+=(i-1)*tmp-sum+MM[tmp+1]-MM[tmp-1];        sum+=tmp;        MM[tmp]++;    }    cout << fixed << setprecision(0) << ans;    //printf("%.0Lf",ans);    return 0;}
原创粉丝点击