题意:nnn个点mmm条边的无向图,每个点有一个正点权,每次选择一个连通子图,将里面的权值都减111。求所有点权为000的最小步数。

T≤10,n≤105,m≤2×105T\leq 10,n\leq 10^5,m\leq2\times10^5T≤10,n≤105,m≤2×105

考虑一个贪心:每次一定选择一个极大的连通块。

感性理解很容易,还是证明一下:

假设一个极大连通块SSS,我偏不选,选择它的子连通块来覆盖整个SSS,答案严格更优。考虑两个连在一起的连通块T1,T2T_1,T_2T1​,T2​,选择T1∪T2,T1∩T2T_1\cup T_2,T_1\cap T_2T1​∪T2​,T1​∩T2​一定不比选T1,T2T_1,T_2T1​,T2​劣。因为选择的连通块覆盖了整个SSS,所以可以一步步合并出SSS(即任选一个与当前集合相邻的点,将覆盖它的集合与当前集合合并),答案不会更劣,矛盾。

对于一个连通块来说,一定是点按照权值从小到大被删。把操作顺序倒过来,就是把大的结点减小成和小的结点相同,然后一起删掉。

形式化地讲,就是把权值从大到小排序依次加入,并把全场的权值都减到当前权值。用并查集维护连通块个数即可。

复杂度O(nlog⁡n)O(n\log n)O(nlogn)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <vector>
#define MAXN 100005
using namespace std;
typedef long long ll;
vector<int> e[MAXN];
int fa[MAXN];
inline int find(const int& x){return fa[x]==x? x:fa[x]=find(fa[x]);}
int a[MAXN],p[MAXN],vis[MAXN];
inline bool cmp(const int& x,const int& y){return a[x]>a[y];}
int main()
{int T;scanf("%d",&T);while (T--){int n,m;scanf("%d%d",&n,&m);for (int i=1;i<=n;i++) e[i].clear(),fa[i]=p[i]=i,vis[i]=0,scanf("%d",&a[i]);for (int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);e[u].push_back(v),e[v].push_back(u);}sort(p+1,p+n+1,cmp);int cur=1;ll ans=0;vis[p[1]]=1;for (int i=2;i<=n;i++){ans+=(ll)cur*(a[p[i-1]]-a[p[i]]);++cur;for (vector<int>::iterator it=e[p[i]].begin();it!=e[p[i]].end();++it){int u=p[i],v=*it;if (!vis[v]) continue;u=find(u),v=find(v);if (u!=v) fa[u]=v,--cur;}vis[p[i]]=1;}ans+=(ll)cur*a[p[n]];printf("%lld\n",ans);}return 0;
}

【杭电多校2020】Total Eclipse【贪心】【并查集】相关推荐

  1. HDU多校2 - 6763 Total Eclipse(贪心+并查集)

    题目链接:点击查看 题目大意:给出一张 n 个点和 m 条边组成的无向图,现在每个点都有一个点权,对于每次操作,可以选择一个点以及其周围能够连接的所有点,令其点权减一,当某个点的点权减到 0 时,就相 ...

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

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

  3. 【杭电多校2020】Go Running【几何】【最小点覆盖】

    题意:有一个数轴,若干人在某个时刻开始从某个点朝某个方向按111的速度走若干时间.已知nnn个条件,形如tit_iti​时刻xix_ixi​的位置有人,求最少可能的人数. ∑n≤5×105\sum n ...

  4. 【杭电多校2020】Lead of Wisdom【搜索】【复杂度证明】

    题意:nnn件物品,每种物品有一个种类tit_iti​,四个属性ai,bi,ci,dia_i,b_i,c_i,d_iai​,bi​,ci​,di​,每个种类最多选一件物品,求 (100+∑ai)(10 ...

  5. 【杭电多校2020】Fibonacci Sum【斐波拉契通项】【推式子】

    题意:设FiF_iFi​为斐波拉契数列,求 ∑i=0N(FiC)k\sum_{i=0}^N(F_{iC})^ki=0∑N​(FiC​)k 模109+910^9+9109+9 N,C≤1018,k≤10 ...

  6. 【杭电多校2020】Minimum Index【Lyndon Word】

    题意:给定字符串,求所有前缀的最小后缀. n≤2×107n\leq 2\times10^7n≤2×107 最小后缀就是Lyndon分解的最后一段.而Duval本质上是可以重复修改的增量算法,所以是可以 ...

  7. 【杭电多校2020】Distinct Sub-palindromes【结论】【构造】

    题意:长度为nnn的 本质不同的回文子串个数最少 的小写字母组成的字符串 的个数. n≤109n\leq 10^9n≤109 回文子串个数至少为不同字母的数量 显然 最少回文子串个数为min⁡(n,3 ...

  8. 杭电多校2020 第十场 C - Mine Sweeper HDU - 6879

    题目大意:(来源) t组输入,每组输入一个s 你需要输出一个r行c列的阵列,这个阵列中'X'代表炸弹,'.'表示没有炸弹 对于'.'这些位置都会有一个数值,这个值取决于这个位置附近8个位置,这8个位置 ...

  9. 【杭电多校2020】第八场1003.Clockwise or Counterclockwise

    题目链接 思路: 如果输出结果是顺时针则叉积方向向内,当结果是逆时针时叉积方向向外. 代码: #include<bits/stdc++.h> #define int long long # ...

最新文章

  1. Django博客系统(写博客页面展示分类)
  2. python树的实现_Python实现简单字典树的方法
  3. 在ubuntu中使用MYBASE
  4. RestFull架构
  5. 模型评价(一) AUC大法 混淆矩阵
  6. 2000年一元钱牡丹图案现在值钱吗?
  7. fedora16 解码方案
  8. Sprin boot 加载位置顺序
  9. 垃圾代码评析——关于《C程序设计伴侣》9.4——链表(一)
  10. linux怎么加块硬盘,如何给linux添加一块硬盘
  11. RIP路由六大防环机制
  12. 【转】90后还过五四吗?这些“脸熟”的过来人送给青年10句忠告
  13. 谷歌地图动画_Google地图上的动画路线
  14. 【刷题】BZOJ 1487 [HNOI2009]无归岛
  15. poj 3070 Fibonacci(矩阵快速幂求Fibonacci数列)
  16. 科技视界杂志科技视界杂志社科技视界编辑部2022年第21期目录
  17. 163邮箱如何登录,在哪可以登录邮箱?
  18. 导致MySQL的查询语句效率低下的可能原因
  19. SQL之HAVING
  20. 实验07 PHP互动网页

热门文章

  1. php文件锁解锁是删除对应的文件_软件 | 文件解锁强制删除工具 Wise Force Deleter v1.49...
  2. 又一大波机械动图来了,工作原理都能看明白!
  3. 专为小机械迷而造,培养STEM思维,千万别错过!物理机械力学知识边玩边学,5岁以上请入手...
  4. 每天6亿人在看《延禧攻略》?大数据告诉你哪家视频网站VIP值得买(附代码)
  5. java中string 和stringbuffer的区别_Java中的String,StringBuilder,StringBuffer三者的区别...
  6. 网站logo放在服务器,自己建网站如何设计网站LOGO
  7. oracle数据库查看size,[oracle] 查看oracle数据库表空间使用率,定位数据size较大对象...
  8. spring的钩子_spring提供的钩子,你知道哪些
  9. leetcode347. 前 K 个高频元素
  10. 763. 划分字母区间009(贪心算法+思路+详解+图示)