首页 > 其他分享 >P2266 爱的供养题解

P2266 爱的供养题解

时间:2024-05-30 21:35:07浏览次数:34  
标签:供养 题解 t2 P2266 t1 int maxn include Size

题目大意

给你一个矩阵 $ w $,大小为 $ n \times m $,然后你每次都从一个宝藏点开始去走旁边 $ T - 1 $ 个点施法,施法过的点就不用再走了,施法不需要耗费体力但是每一次从一个点走到另一个点需要耗费的权值为这两个点的高度差,你每次可以走的方向是上下左右。求最小需要耗费的体力。

思路

首先我们要明白一个东西就是周的定义:对于一个点 $ a $ 它可以走一步走到点 $ b $ 那么 $ b $ 就在 $ a $ 的周围,对于点 $ b $ 他可以走一步走到点 $ c $ 且 $ c \neq a $ 那么 $ c $ 在 $ b $ 的周围 $ c $ 也在 $ a $ 的周围但是要使 $ c $ 在 $ a $ 的周围必须走过 $ c $ 周围的点。

在长久的思考过后我觉得我们可以把用最小生成树 Kruskal 算法来解决这一道题,因为题目要求求与这个点连接 $ T - 1 $ 条边需要的最小体力,边得权值就设为点 $ u $ 到点 $ v $ 需要耗费的体力就行了。

对于联通块的维护我们可以用到并查集,合并并查集时如果它们的边数 $ \ge T - 1 $ 时说明他对答案可能有贡献所以我们就判断。在加体力的时候我们用当前边的权值乘上当前联通块的宝藏数量就行了当然当前联通块的边的数量需要 $ \le T - 1 $,我们的思路就完事了,代码量中偏短所以建议自己先写一下。

Code:

#include <algorithm>
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <queue>
#define sc(ppt) scanf("%lld" , &ppt)
#define ll long long
#define int long long
#define prt printf
using namespace std;

const int maxm = 8e5 + 1 , maxn = 6e2 + 1;
const int dx[] = {0 , 0 , 0 , 1 , -1};
const int dy[] = {0 , 1 , -1 , 0 , 0};
int n , m , T , a[maxn][maxn] , vis[maxn][maxn] , oe[maxn * maxn] , anc[maxn * maxn] , Size[maxn * maxn] , sign;
int h[maxn] , cnt = 0 ;
struct edge{
	int next , to , val;
}e[maxm << 1]; // 前向心 

inline void add(int u , int v , int w){
	++ cnt;
	e[cnt].next = u ; e[cnt].to = v; e[cnt].val = w;
//	h[u] = cnt;
}

bool cmp(const edge &x , const edge &y){
	return x.val < y.val;
} // 找最小权值的边 

int get_father(int u){ // 并查集 
	if(anc[u] == u) return u;
	else return anc[u] = get_father(anc[u]); // 记忆化 
}

void Kruskal(){
	int res = 0;
	for(int i=1 ; i<=cnt ; i++){
		int u = e[i].next , v = e[i].to;
		int t1 = get_father(u) , t2 = get_father(v);
		if(t1 != t2){
			if(Size[t1] + Size[t2] >= T){
				if(Size[t1] < T) res += e[i].val * oe[t1];
				if(Size[t2] < T) res += e[i].val * oe[t2];
			}
			if(Size[t1] > Size[t2]) swap(t1 , t2);
			anc[t1] = t2;
			Size[t2] += Size[t1];
			oe[t2] += oe[t1];
			++ sign;
			if(sign == n * m - 1){
				prt("%lld" , res);
				exit(0);
			}
		}	
	}
}

signed main(){
	sc(n) ; sc(m) ; sc(T) ;
	for(int i=1 ; i<=n * m ; i++) {anc[i] = i ; Size[i] = 1;}
	for(int i=1 ; i<=n ; i++) for(int j=1 ; j<=m ; j++) sc(a[i][j]);
	for(int i=1 ; i<=n ; i++){
		for(int j=1 ; j<=m ; j++){
			sc(vis[i][j]);
			oe[(i - 1) * m + j] = vis[i][j];
		}
	} // 预处理宝藏位置 
	for(int x=1 ; x<=n ; x++){
		for(int y=1 ; y<=m ; y++){
			for(int i=1 ; i<=4 ; i++){
				int xx = x + dx[i] , yy = y + dy[i];
				if(xx > n || xx < 1 || yy > m || yy < 1) continue;
				add((x - 1) * m + y , (xx - 1) * m + yy , abs(a[x][y] - a[xx][yy]));
			}
		}
	}
	sort(e + 1 , e + cnt + 1 , cmp);
	Kruskal();
	return 0;
}

标签:供养,题解,t2,P2266,t1,int,maxn,include,Size
From: https://www.cnblogs.com/CaoSheng-blog/p/18223264

相关文章

  • P10526 [XJTUPC2024] 命令行题解
    题目大意对于一个字符串$s$在输入的最后一行读入的字符,如个字符不为$E\(,\)T\(,\)B$那么这一个字符就添加至字符串$s$的末尾。对于操作$B$那么执行删除字符串$s$的最后一个字符,如果$s$为空那么跳过这个操作。对于操作$T$找到一个以字符串......
  • P10530 [XJTUPC2024] 生命游戏 题解
    题目大意一棵树一共$n$个点如果有$k$个点与某一个点相连那么这一轮的结尾这个点就会死。思路这道题有几个坑!并没有说哪一个节点是根节点。双向边记得开双倍数组。等这一轮的点消除完了才能再次判断哪一些点可以消除。首先我们创建一个数组$Size_{n}$来......
  • CF/505/D 题解
    思路这道题的思路其实是根据样例图片来的。首先第一张:这张图片可以得知$n$个点没有环的时候最少需要$n-1$个点。再看第二张:这个图确实很难思考,但稍微思考一下如果我们把含有一个强连通分量的图变成一整个强连通图。这个图的边数不就变成$n$了吗?来推一下......
  • P6342 [CCO2017] Vera 与道路建设 题解
    题目大意对于一个图w一共有v个点点的编号为1,2,...,v,对于点a与点b如果满足$a\tob$且$b\toa$使得每一条道路都只走过一次,那么我们称$a,b$为完美点对,当一个联通图只有$k$个完美点对时,称这个联通图为美丽公路网,要求求出一个美丽公路网......
  • Nikita and LCM题解
    题目大意给你一个数组$a$,令$t$为$a$的子序列且$t$中所有数的最小公倍数$\notina$求$t$数组中最多有多少个数。思路非常明显这是一道数学题,对于数组$a$我们首先从小到大拍一个序,然后我们可以求出$a$中所有数的最大公倍数,如果这个公倍数$\not=......
  • MITIT 2024 Spring Invitational Qualification 简要题解
    这个比赛没有找到题解,有点难绷,所以来写篇。(实际上是无聊时写的就是了)题面:https://codeforces.com/gym/105125/。目测难度是绿绿黄紫紫。A有点诈骗。其实策略是只保留\(\le3\)个数,然后就随便维护一下。\(O(n\logn)\)。Code#include<bits/stdc++.h>usingnamespaces......
  • Gym-100520A Andrew Stankevich Contest 45 A 题解
    AnalogousSetsGym-100520ASol1.集合生成函数将可重集合\(M\)映射为生成函数:\[F(M)=\sum_{m\inM}(\#m)\cdotx^m\]如果\(M\)的元素在\(\mathbbN\)上取值,那么,\(F(M)\)是多项式。2.\(\theta\)算子\[\theta(F)=x\cdotF'\]其中\(F'=\frac{dF}{dx}\)......
  • Springboot报class path resource [xxxxx.json] cannot be resolved to URL because i
    当Springboot解析resources文件下的json文件时,在本地环境好用,部署到服务器上找不到文件内容报错classpathresource[xxxxx.json]cannotberesolvedtoURLbecauseitdosenotexist问题排查(1)pom.xml文件配置<build><resources><resource><d......
  • 洛谷 P8725 [蓝桥杯 2020 省 AB3] 画中漂流 的题解
    题目大意传送门思路考虑使用时空复杂度为O(tm)O(tm)......
  • 洛谷 P8614 [蓝桥杯 2014 省 A] 波动数列 的题解
    题目大意求满足和为sss且ti=......