P1861 星之器

题目传送门

神仙题

第一次感受势能函数的优雅。首先要发现答案只和初末状态有关,和操作方式无关,于是考虑对每个点设一个势能函数 f(x,y) 表示位于 (x,y) 的一颗星的势能,使得每次答案的增加量等于势能的减少量

容易发现,势能就是每颗星势能的加和,x 维度和 y 维度的势能相互独立且等价

于是我们可以只考虑一个维度的情况。考虑两个点 (x1,y),(x2,y)(x1<x2),那么根据势能函数的定义则有:

f(x1)+f(x2)f(x1+1)f(x21)=x2x11

化简一下得:

f(x1+1)f(x1)(x1+1)=f(x2)f(x21)x2

因此只需保证 f(x)f(x1)x 为定值即可

f(x)f(x1)x=0,则容易得出 f(x)=i=1xi

所以 f(x,y)=i=1xi+i=1yi

最后输出初始势能减去结束势能即可

#include<bits/stdc++.h>
#define LL long long
using namespace std;

int n,m;
LL ans;

int S(int x)
{
	return (1+x)*x/2;
}

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++)
	{
		for(int j=1; j<=m; j++)
		{
			int v;
			scanf("%d",&v);
			ans+=1LL*v*(S(i)+S(j));
		}
	}
	for(int i=1; i<=n; i++)
	{
		for(int j=1; j<=m; j++)
		{
			int v;
			scanf("%d",&v);
			ans-=1LL*v*(S(i)+S(j));
		}
	}
	
	printf("%lld",ans);
	
	return 0;
}
posted @   xishanmeigao  阅读(6)  评论(0编辑  收藏  举报
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示