首先我们假设两个点(i,j),(i,k)向中间移动一格,且k>j+1,那么我们可以获得的价值为k-j,这样,我们定义每个点的每个星的能量为a[(i,j)]=i*i+j*j,这样这两个点开始的能量为i*i+j*j+i*i+k*k,移动之后,两个点变为(i,j+1),(i,k-1),这时的能量为i*i+(j+1)*(j+1)+i*i+(k-1),这时的能量差为2*k-2*j,为获得价值的2倍,因为对于所有的价值获得都可以采用这样的方法,所以我们可以算出开始局面的能量和,结束局面的能量和,相减>>1就是答案。

  反思:显然没有发现这个优美的性质。

/**************************************************************
    Problem: 2321
    User: BLADEVIL
    Language: C++
    Result: Accepted
    Time:56 ms
    Memory:804 kb
****************************************************************/
 
//By BLADEVIL
#include <cstdio>
#define LL long long
using namespace std;
int n,m;
int main()
{
    LL ans=0,x;
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
        for (int  j=1;j<=m;j++)
            scanf("%lld",&x),ans+=x*(i*i+j*j);
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
            scanf("%lld",&x),ans-=x*(i*i+j*j);
    printf("%lld\n",ans>>1);
    return 0;
}

 

相关文章:

  • 2022-03-07
  • 2021-07-09
  • 2021-07-25
  • 2021-06-26
  • 2021-06-20
  • 2019-08-17
  • 2022-12-23
  • 2022-01-05
猜你喜欢
  • 2022-01-17
  • 2021-06-12
  • 2021-11-16
  • 2022-02-03
  • 2021-10-12
  • 2021-10-13
  • 2022-01-02
相关资源
相似解决方案