篱笆题目出处(3075)
这道题是我们编程社考试中第三次的第二题,当时都有一些思路,但是时间紧,没打出来
读了题之后,第一思路是暴力,然后是最小生成树,最后是才想到贪心
首先,暴搜肯定会超时
然后,用最小生成树在小数据时加点优化可以勉强卡过
但是贪心才是正解
先来讲一讲最小生成树做法
在m和n都小于2000时可以卡过
大致思路:
以所有篱笆的交点作为节点,以篱笆的长度作为边权
然后就是求一个最小生成树
但是2000*2000=4000000,nlogn的算法会超时
这时,我们便要优化一下
因为在每一列或者每一行的篱笆的长度都是相同的
所以我们只需要从每一段抽出一个样本来排序就可以了
下面是同校机房大佬的一个最小生成树做法:
PS:勉强可以卡过,但数据大了会RE
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN 2001
int n,m,a[MAXN+10],b[MAXN+10],fa[MAXN*MAXN+10];
long long ans;
void read()//读入部分
{
int A,B;
scanf("%d%d%d%d",&A,&B,&n,&m);
for(int i=1;i<