1003.Ink on paper

题目传送门

题目大意:

第iii滴墨水的起始位置是(xi,yi)(x_i,y_i)(xi​,yi​)以每秒0.5厘米的速度向外圆形扩散,问所有墨滴联通要多久,输出时间的平方。

思路:

跑一遍最小生成树,然后记录max边权。
因为是完全图,边很多,所以跑Prim准没错。
一开始跑了Kruskal导致出错了一发,要牢记!!

  • 复杂度:Kruskal (mlogm)
  • 复杂度:Prim (n^2 +m)

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>using namespace std;
typedef long long ll;
const int maxn = 2e3 + 9;
const ll INF = 0x3f3f3f3f3f3f3f3f;
ll e[maxn][maxn], cal[maxn], x[maxn], y[maxn];
int vis[maxn];
int n;void init() {for (int i = 1; i <= n; i++) e[i][i] = 0;
}ll dist(int i, int j) {return (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]);
}void Prim() {memset(vis, 0, sizeof(vis));for (int i = 1; i <= n; i++) cal[i] = e[1][i];vis[1] = 1;ll mind, ans = 0;int u, v;for (int i = 1; i <= n - 1; i++) {mind = INF;u = -1;for (int j = 1; j <= n; j++) {if (!vis[j] && mind > cal[j]) {mind = cal[j];u = j;}}if (u == -1) break;ans = max(ans, cal[u]);vis[u] = 1;for (v = 1; v <= n; v++) {if (!vis[v] || e[u][v] < INF) {if (cal[v] > e[u][v])cal[v] = e[u][v];}}}printf("%lld\n", ans);
}int main() {int t;scanf("%d", &t);while (t--) {scanf("%d", &n);for (int i = 1; i <= n; i++)scanf("%lld %lld", &x[i], &y[i]);init();for (int i = 1; i <= n; i++)for (int j = i + 1; j <= n; j++)e[i][j] = e[j][i] = dist(i, j);Prim();}return 0;
}

后来发现Kruskal也也不是不能跑。
简单说把完全图边权从小到大排列,然后一个个Union并查集维护,不重复连同一点,同时保证刚好所有点都连接上了就跳出,此时一定最优。

#include<bits/stdc++.h>using namespace std;
typedef long long ll;
const int N = 5e3 + 10;
int fa[N] ;
int sum = 0;int find(int x) {if (fa[x] != x) fa[x] = find(fa[x]);return fa[x];
}void Union(int x, int y) {int fx = find(x), fy = find(y);if (fx != fy) fa[fy] = fx, sum++;
}int T, n;
ll x[N], y[N];struct node {int x, y;ll dis;bool operator<(const node &b) const {return dis < b.dis;}
} Node[N * N];int main() {scanf("%d", &T);while (T--) {scanf("%d", &n);int cnt = 0;for (int i = 1; i <= n; i++) scanf("%lld%lld", &x[i], &y[i]);for (int i = 1; i <= n; i++) {for (int j = i + 1; j <= n; j++)Node[++cnt] = {i, j, (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j])};}for (int i = 0; i <= n; i++) fa[i] = i;sort(Node + 1, Node + cnt + 1);sum = 0;for (int i = 1; i <= cnt; i++) {Union(Node[i].x, Node[i].y);if (sum == n - 1) {printf("%lld\n", Node[i].dis);break;}}}
}

#2021暑假杭电多校8_1003.Ink on paper相关推荐

  1. HDU-6578 Blank(DP)2019暑假杭电多校第一场

    题意:一行有n个空格编号1~n; 每一个空格中填入0,1,2,3中的一个数字.且满足m个限制l,r,x:满足在区间[l,r]正好有x种不同的数字. 有多少种方法可以填充空格以满足所有条件? 思路:dp ...

  2. 2019暑假杭电多校第6场签到题-1008-TDL

    题目传送门 思路: 估计出n的范围,暴力就完事. 异或就是不进位的加法 (f(n,m) - n)^n == k, f(n,m)-n==k^n; 因为灯饰右边估计不会超过1e3,所以k^n<=1e ...

  3. 2021杭电多校补题——第一场

    2021杭电多校补题--第一场 文章目录 Mod, Or and Everything Rocket land(待补) Puzzle loop(待补) Another thief in a Shop( ...

  4. 杭电多校联赛2017年总结

    杭电多校联赛2017年总结   时间确实过得挺快,一个月很快结束,说实在的,一个月了,每次比赛都是混两道签到题,然后就开始挂机了,确实很不甘心,看着联赛的排名,确实感觉,和强校之前的差距还是很大的,P ...

  5. 杭电多校第六场个人补题6 7 9 10 12

    杭电多校第六场个人补题6 7 9 10 12 6 题意 给定一棵有n结点的树,点权为1~n,求对所有结点子树的mex操作和的最大值 思路 其实就是从最底部开始网上找,由于0是唯一的一个,所欲最好给在最 ...

  6. 2019年杭电多校第一场 1001题blank(DP)HDU6578

    2019年杭电多校第一场 1001题blank(DP)HDU6578 解决思路,开一个DP数组来存储0 1 2 3四个字符最后出现的位置,并且在DP中已经==排好序==. DP开四维,DP[i][j] ...

  7. 2022杭电多校赛第八场

    2022杭电多校赛第八场 文章目录 2022杭电多校赛第八场 1004.Quel'Thalas 1001.Theramore 1011.Stormwind 1008.Orgrimmar 1005.Ir ...

  8. 2022杭电多校第八场题解

    2022杭电多校第八场 Theramore(思维) 题意 给定一个01字符串,每次可以将一个奇数长度的区间翻转,求操作后字典序最小的字符串. 分析 翻转奇数长度的区间,元素位置的奇偶性不变,统计奇数位 ...

  9. 2022杭电多校八 1011-Stormwind(贪心)

    题目链接:杭电多校8 - Virtual Judge 题意:一个n*m的长方形,可以沿水平或竖直方向画若干条线,每条线的两端点都在长方形边界上,且线要与长方形的某一边平行且端点位于格点上.要求这些线划 ...

最新文章

  1. java netfox_SpringFox集成原理
  2. 【PAT乙级】1054 求平均值 (20 分)
  3. 有小数点的补码怎么算_写给投资小白,指数基金,在哪买?怎么买?
  4. 积极参加各类竞赛——大学生竞赛
  5. linux兴趣小组2017面试题浅析
  6. 进程间通信————无名管道
  7. 【孤儿进程】孤儿进程组、守护进程
  8. 解决RabbitMQ service is already present - only up...
  9. Linear Color Space 渲染时几点注意
  10. java第七章jdbc课后简答题_Java进阶之JDBC面试题(7)
  11. 我想加入阿里,我该怎么做?
  12. 佳能mf4400打印机无线服务器,佳能Canon imageCLASS MF4400 驱动
  13. msdia80.dll文件出现在磁盘根目录下的解决方案
  14. Excel--认识Excel
  15. php中访问控制_php访问控制
  16. Linux 下 JbossEAP 6.2安装与实例部署
  17. CFileDialog的使用(MFC-C++)
  18. 层次分析法(正课1)
  19. Java保留两位小数方法
  20. From .1:从屏保到Win平台开发 - 一个可运行的C#屏保程序

热门文章

  1. 协同过滤算法的简单理解《推荐系统实践》
  2. java照片水印怎么做的_java图片加水印_百度经验
  3. 教你快速去除照片上的水印?操作简单,小白一学就会!
  4. oracle连续月份列表,Oracle实现查询2个日期所跨过的月份列表/日期列表的方法分析...
  5. 海思SDK学习(7)海思媒体处理软件平台MMP(6)视频编码VENC
  6. github的博客搭建以及标签的自动化
  7. cPanel里的 Addon Domain/Subdomains/Parked domain 区别
  8. Java异常学习小结
  9. 关于ios包破解激活码(一机一码)以及添加激活码(一机一码)大神进!!
  10. 产品定位的步骤,如何探寻市场机会、挖掘市场细分并选择目标市场