bzoj 2321: [BeiJing2011集训]星器 乱搞

来源:互联网 发布:plc网络名称 编辑:程序博客网 时间:2024/06/16 14:33

题意

给定一个矩阵,定义一个操作:
选择两个同一行或同一列不相邻的点,将这两个点上各一个星向中间移动一位,产生魔力为两点间距离-1,求始态到终态的产生魔力
n,m<=200,Ai,j<=1000

分析

真佩服能想出这道题的人。。。

我们定义一个点(i,j)的势能为i*i+j*j。
假设现在操作选了两个点(i,j)和(i,k)且j+2<=k
操作前的势能为ii+jj+ii+kk
操作后的势能为ii+(j+1)(j+1)+ii+(k1)(k1)
前-后得2k2j2=2(kj1)
所以答案就是初始状态的势能减去结束状态的势能/2.
这。。。

代码

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;int n,m;int main(){    scanf("%d%d",&n,&m);    LL ans=0;    for (int i=1;i<=n;i++)        for (int j=1;j<=m;j++)        {            int x;            scanf("%d",&x);            ans+=x*(i*i+j*j);        }    for (int i=1;i<=n;i++)        for (int j=1;j<=m;j++)        {            int x;            scanf("%d",&x);            ans-=x*(i*i+j*j);        }    printf("%lld",ans/2);    return 0;}