【2020杭电多校】Total Eclipse 并查集+思维
题目链接:Total Eclipse
题意:
t组输入,给你一个由n个点,m条边构成的图,每一个点的权值是ai。你每一次可以选择一批联通的点,然后让他们的权值都减去1。问最后把所有点的权值都变成0需要多少次操作
题解:
最简单的思路就是每一次dfs找到图中联通的最长的链,然后让这条链减去链上所有点中那个最小的权值。之后这条链就断了。然后再去找链,,依次。。但是这样复杂度太高了,就会TLE
如果每一次找到的链上所有点的权值是有序的,那么我们就可以一次得到将这条链上的点的权值变成0的最小操作数,比如下面一条权值链
9->8->7->6->2->1,那么把这些点权值变成0只需要9次
那么我们可以从新构建一下这个图,我们可以按照这些点的权值从大到小排序,然后遍历它,先找到一个点,那么这个点就独自构成一个连通块,如果下一个点和之前点相连,那么这两个点就在一个连通块上,连通块数量不加1,否则连通块数量加1(如果这个点将多个连通块相连,那么连通块个数就不止减1了)。我们先说连通块数量减1情况,我们的答案要加上(a[2]-a[3])*ans (ans是连通块数量,a数组就是题目上的权值数组),他代表的意思就是a[2]点相对于a[3]点要多做几次操作,乘于ans是,有ans个连通块都需要多做a[2]-a[3]次操作。(在加入第一个点的时候也要进行这样的操作)
模拟过程可以看一下这篇博客:https://blog.csdn.net/yangzijiangac/article/details/107559199
代码:
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <set>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include <math.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
vector<ll>w[maxn];
ll n,m,v[maxn],vis[maxn];
struct shudui
{
ll pos,val;
}a[maxn];
bool mmp(shudui x,shudui y)
{
return x.val>y.val;
}
ll finds(ll x)
{
if(x!=v[x])
{
ll y=finds(v[x]);
v[x]=y;
return y;
}
return x;
}
int main()
{
ll t;
scanf("%lld",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;++i)
w[i].clear();
for(ll i=1;i<=n;++i)
{
v[i]=i;
scanf("%lld",&a[i].val);
a[i].pos=i;
}
sort(a+1,a+1+n,mmp);
a[n+1].val=0;
while(m--)
{
ll x,y;
scanf("%lld%lld",&x,&y);
w[x].push_back(y);
w[y].push_back(x);
}
ll sum=0,ans=0;
for(ll i=1;i<=n;++i)
{ ans++;
ll x=a[i].pos;vis[x]=1;
for(ll j=0;j<w[x].size();++j)
{ ll pos=w[x][j];
if(vis[pos])
{
ll fx=finds(x);
ll fy=finds(pos);
if(fx!=fy)
{
v[fx]=fy;ans--;
}
}
}
sum=sum+ans*(a[i].val-a[i+1].val);
}
printf("%lld\n",sum);
}
return 0;
}
【2020杭电多校】Total Eclipse 并查集+思维的更多相关文章
- 杭电OJ——1198 Farm Irrigation (并查集)
畅通工程 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可 ...
- 【杭电OJ3938】【离线+并查集】
http://acm.hdu.edu.cn/showproblem.php?pid=3938 Portal Time Limit: 2000/1000 MS (Java/Others) Memo ...
- 2020杭电多校 C / HDU 6879 - Mine Sweeper
题意: t组输入,每组输入一个s 你需要输出一个r行c列的阵列,这个阵列中'X'代表炸弹,'.'表示没有炸弹 对于'.'这些位置都会有一个数值,这个值取决于这个位置附近8个位置,这8个位置一共有几个炸 ...
- 【2020杭电多校】Distinct Sub-palindromes 找规律
题目链接:Distinct Sub-palindromes 题意: 给你一个长度n,你需要找出来一些串,这些串由A...Z和a...z构成.我们设长度为n的所有串中所包含回文子串最少的数量为ans.问 ...
- 【2020杭电多校】 Lead of Wisdom、The Oculus
题目链接:Lead of Wisdom 题意:有n个物品,这些物品有k种类型.每种物品有对应的类型ti,其他值ai,bi,ci,di 你可以选择一些物品,但是这些物品要保证它们任意两者之间类型不能相同 ...
- 2020杭电多校 10C / HDU 6879 - Mine Sweeper (构造)
HDU 6879 - Mine Sweeper 题意 定义<扫雷>游戏的地图中每个空白格子的值为其周围八个格子内地雷的数量(即游戏内临近地雷数量的提示) 则一张地图的值\(S\)为所有空白 ...
- 可持久化线段树的学习(区间第k大和查询历史版本的数据)(杭电多校赛第二场1011)
以前我们学习了线段树可以知道,线段树的每一个节点都储存的是一段区间,所以线段树可以做简单的区间查询,更改等简单的操作. 而后面再做有些题目,就可能会碰到一种回退的操作.这里的回退是指回到未做各种操作之 ...
- 2018 Multi-University Training Contest 1 杭电多校第一场
抱着可能杭电的多校1比牛客的多校1更恐怖的想法 看到三道签到题 幸福的都快哭出来了好吗 1001 Maximum Multiple(hdoj 6298) 链接:http://acm.hdu.edu. ...
- HDU 5793 A Boring Question (逆元+快速幂+费马小定理) ---2016杭电多校联合第六场
A Boring Question Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
随机推荐
- servlet+jsp完成简单登录
将用户在注册界面中的数据填充到数据库相对应的表格中.当用户再次登录时,从数据库中拿到相应的数据查询并与页面的数据做对比,判断是否登陆成功. 需要在HTML文件中将form表单上的action属性值设置 ...
- Python基础语法4-运算符
Python提供了一系列丰富的运算符,包括: Ø算术运算符 Ø赋值运算符 Ø关系运算符 Ø逻辑运算符 Ø位运算符 Ø三元运算符 Ø身份运算符 Ø成员运算符
- 设计一款兼容ST207和GD207的开发板
在MCU的学习中,大部分人都是学习别人的开发板,例如正点原子.野火等,优点是有可靠的教程和代码,缺点是容易让人有种自己全部都学会的了错觉,听了课程编写了代码,运行正常. 这个时候,可以尝试自已做一块属 ...
- 1V升5V芯片,1V升5V电路图规格书
如果需要1V输入的话,可以看到PW5100的最低低压输入0.7V,就可以达到要求了. 同时PW5100也具有较大的输入开关电流1.5A,可以满足输出的要求和功能. 对于1V的供电来说,由于电压太低,我 ...
- Mysql简要概述
Mysql学习笔记 Mysql简介: Mysql是一个轻量级关系型数据库管理系统,由瑞典Mysql AB公司开发,目前属于Oracle公司.目前Mysql被广泛地应用在Internet上的中小型网 ...
- JAVA获取当前文件路径this.getClass().getResource方法详细讲解
public class Test { public void run() { // TODO Auto-generated method stub System.out.println(" ...
- jackson学习之一:基本信息
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 设置一个两边固定中间自适应的css
1.两边浮动,中间自动宽度 给左右两个盒子设置左右浮动,中间的盒子不设置宽度,左右两边边距为左右盒子的宽度,中间盒子的位置必须写在右盒子下面,不然会把右盒子挤下去 如: <div class ...
- https://dev.mysql.com/doc/refman/8.0/en/savepoint.html
https://dev.mysql.com/doc/refman/8.0/en/savepoint.html
- The OAuth 2.0 Authorization Framework OAuth2.0的核心角色code 扫码登录
RFC 6749 - The OAuth 2.0 Authorization Framework https://tools.ietf.org/html/rfc6749 The OAuth 2.0 a ...