题目链接: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 并查集+思维的更多相关文章

  1. 杭电OJ——1198 Farm Irrigation (并查集)

    畅通工程 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可 ...

  2. 【杭电OJ3938】【离线+并查集】

    http://acm.hdu.edu.cn/showproblem.php?pid=3938 Portal Time Limit: 2000/1000 MS (Java/Others)    Memo ...

  3. 2020杭电多校 C / HDU 6879 - Mine Sweeper

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

  4. 【2020杭电多校】Distinct Sub-palindromes 找规律

    题目链接:Distinct Sub-palindromes 题意: 给你一个长度n,你需要找出来一些串,这些串由A...Z和a...z构成.我们设长度为n的所有串中所包含回文子串最少的数量为ans.问 ...

  5. 【2020杭电多校】 Lead of Wisdom、The Oculus

    题目链接:Lead of Wisdom 题意:有n个物品,这些物品有k种类型.每种物品有对应的类型ti,其他值ai,bi,ci,di 你可以选择一些物品,但是这些物品要保证它们任意两者之间类型不能相同 ...

  6. 2020杭电多校 10C / HDU 6879 - Mine Sweeper (构造)

    HDU 6879 - Mine Sweeper 题意 定义<扫雷>游戏的地图中每个空白格子的值为其周围八个格子内地雷的数量(即游戏内临近地雷数量的提示) 则一张地图的值\(S\)为所有空白 ...

  7. 可持久化线段树的学习(区间第k大和查询历史版本的数据)(杭电多校赛第二场1011)

    以前我们学习了线段树可以知道,线段树的每一个节点都储存的是一段区间,所以线段树可以做简单的区间查询,更改等简单的操作. 而后面再做有些题目,就可能会碰到一种回退的操作.这里的回退是指回到未做各种操作之 ...

  8. 2018 Multi-University Training Contest 1 杭电多校第一场

    抱着可能杭电的多校1比牛客的多校1更恐怖的想法 看到三道签到题 幸福的都快哭出来了好吗 1001  Maximum Multiple(hdoj 6298) 链接:http://acm.hdu.edu. ...

  9. HDU 5793 A Boring Question (逆元+快速幂+费马小定理) ---2016杭电多校联合第六场

    A Boring Question Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

随机推荐

  1. 剑指offer 面试题9.1:用两个队列实现栈

    题目描述 使用队列实现栈的下列操作:push(x) -- 元素 x 入栈:pop() -- 移除栈顶元素:top() -- 获取栈顶元素:empty() -- 返回栈是否为空: 编程思想 利用双队列实 ...

  2. Neo4j 图数据库查询

    Cypher 介绍 Cypher 介绍:作为Neo4j的查询语言,"Cypher"是一个描述性的图形查询语言,允许不必编写图形结构的遍历代码对图形存储有表现力和效率的查询.Cyph ...

  3. docker logs 查看容器日志操作

    查看日志 官方文档:https://docs.docker.com/engine/reference/commandline/logs/ # 查看指定数量的实时日志 # docker logs -tf ...

  4. 【EXP/IMP】问题总结

    为了使测试与生产数据保持一致,只需要导出数据的时候,可以将测试库的表truncate,保留其它如索引,trigger,constraints,grants等不用再重新导. exp时候rows=y,其它 ...

  5. 【译】Async/Await(三)——Aysnc/Await模式

    原文标题:Async/Await 原文链接:https://os.phil-opp.com/async-await/#multitasking 公众号: Rust 碎碎念 翻译 by: Praying ...

  6. 让 Mongoose 不再重复链接数据库(如何正确连接以解决升级后的报错)

    升级了 Mongoose 后,发现项目打不开了.报错: MongooseError: You can not `mongoose.connect()` multiple times while con ...

  7. [Usaco2007 Feb]Cow Party

    题目描述 农场有N(1≤N≤1000)个牛棚,每个牛棚都有1只奶牛要参加在X牛棚举行的奶牛派对.共有M(1≤M≤100000)条单向路连接着牛棚,第i条踣需要Ti的时间来通过.牛们都很懒,所以不管是前 ...

  8. [Usaco2007 Jan]Balanced Lineup 飞盘比赛

    题目描述 每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连续的牛来进行 ...

  9. 配接Cisco设备

  10. vue-cli快速创建项目,可视化创建

    之前学习了交互式创建,发现过程无聊,而且不方便,后面又学习了图形可视化创建,下面进行分享 1.打开cmd 2.输入vue ui,输入后会出现如下 C:\Users\12235>vue ui St ...