bzoj 4886: [Lydsy2017年5月月赛]叠塔游戏 并查集
题意
小Q正在玩一个叠塔的游戏,游戏的目标是叠出尽可能高的塔。在游戏中,一共有n张矩形卡片,其中第i张卡片的长度为a_i,宽度为b_i。小Q需要把所有卡片按一定顺序叠成一座塔,要求对于任意一个矩形,它的长度要严格大于它上边的任意一个矩形的长度。塔的高度为所有矩形的宽度之和。在游戏中,小Q可以将卡片翻转90度来使用,而且必须用上全部n张卡片。请写一个程序,帮助计算小Q能叠出最高的塔的高度。
n<=250000,ai,bi<=10^9
分析
这种思路好巧妙啊。。。
对于一个矩形ai,bi,在ai和bi之间连一条边。由于题目保证有解,所以一个连通块要么是环,要么是环套树。
现在要给每条边定向,使得每个点的出度不超过1,每条边的贡献即为其指向的点的权值。
对于一个环套树,显然每个点的出度都恰好为1,所以其贡献就是每个点的权值*(每个点的度数-1)。
对于一棵树,有一个点的出度可以为0,那么肯定是选权值最大的点。
用并查集瞎维护一下就好了。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;typedef long long LL;const int N=500005;int n,a[N],b[N],w[N],f[N],mx[N],d[N];
bool tag[N];int read()
{int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}int find(int x)
{if (f[x]==x) return x;else return f[x]=find(f[x]);
}int main()
{n=read();for (int i=1;i<=n;i++) a[i]=read(),b[i]=read(),w[i*2-1]=a[i],w[i*2]=b[i];sort(w+1,w+n*2+1);int w1=unique(w+1,w+n*2+1)-w-1;for (int i=1;i<=w1;i++) f[i]=i,mx[i]=w[i];for (int i=1;i<=n;i++){a[i]=lower_bound(w+1,w+w1+1,a[i])-w;b[i]=lower_bound(w+1,w+w1+1,b[i])-w;int x=find(a[i]),y=find(b[i]);if (x==y) tag[x]=1;else f[x]=y,mx[y]=max(mx[y],mx[x]),tag[y]|=tag[x];d[a[i]]++;d[b[i]]++;}LL ans=0;for (int i=1;i<=w1;i++){ans+=(LL)w[i]*(d[i]-1);if (find(i)==i&&!tag[i]) ans+=mx[i];}cout<<ans;return 0;
}
bzoj 4886: [Lydsy2017年5月月赛]叠塔游戏 并查集相关推荐
- BZOJ 4884 [Lydsy2017年5月月赛]太空猫(单调DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4884 [题目大意] 太空猫(SpaceCat)是一款画面精致.玩法有趣的休闲游戏, 你 ...
- BZOJ 4883 [Lydsy2017年5月月赛]棋盘上的守卫(最小生成环套树森林)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4883 [题目大意] 在一个n*m的棋盘上要放置若干个守卫. 对于n行来说,每行必须恰好 ...
- BZOJ 2143 飞飞侠(线段树优化建边 / 并查集优化最短路)【BZOJ修复工程】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2143 是 hydro 的 BZOJ ...
- 【BZOJ 4832】 [Lydsy2017年4月月赛] 抵制克苏恩 期望概率dp
打记录的题打多了,忘了用开维记录信息了......我们用f[i][j][l][k]表示已经完成了i次攻击,随从3血剩j个,2血剩l个,1血剩k个,这样我们求出每个状态的概率,从而求出他们对答案的贡献并 ...
- 【bzoj4881】[Lydsy2017年5月月赛]线段游戏 树状数组+STL-set
题目描述 quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐标分别为(0,i)和(1,p_i),其中p_1,p_2,...,p_n构成 ...
- Lydsy2017年4月月赛 抵制克苏恩
Description 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩 炉石传说,不必担心,小Q同学会告诉你所有相关的细节.炉石传说是这样的一个游戏, 每个玩家拥有一个 ...
- [bzoj4881][Lydsy2017年5月月赛]线段游戏
来自FallDream的博客,未经允许,请勿转载,谢谢. quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐标分别为(0,i)和(1, ...
- BZOJ4832: [Lydsy2017年4月月赛]抵制克苏恩
传送门 题目大意: 攻击k次,每次可攻击随从或英雄. 随从数不大于7个,且1滴血的a个,2滴b个,3滴c个. 攻击一次血-1,如果随从没死可以生成3滴血随从一个 题解: 概率/期望dp f[i][j] ...
- BZOJ4883: [Lydsy2017年5月月赛]棋盘上的守卫
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4883 Description 在一个n*m的棋盘上要放置若干个守卫.对于n行来说,每行必须 ...
最新文章
- Python的零基础超详细讲解(第一天)-Python简介以及下载
- 图像降噪算法——低秩聚类:WNNM算法
- 幂等问题-概念上的通俗解释(未完待续)
- Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示...
- 关于JEECG 开源声明
- Elasticsearch学习系列-搜索技术基本知识
- linux进行硬盘分区挂载-了解系统,最更好的开发
- tcp协议和udp协议区别_TCP和UDP协议有什么区别?
- 常用的Mysql数据库操作语句大全
- hbiuder运行php_hbuilderx中运行php图文说明
- 大二计算机学期总结报告,大二计算机的实训总结.docx
- Python中sys模块
- Android资源,国内镜像站点,博客文章等
- MiniMap(小地图)插件
- 【C语言】打印一个爱心
- 郭东白:“系统是唐僧,我们是孙悟空”,阿里AliExpress演绎技术版西游记
- The Fun Of Algorithm - Day4 - 百钱百鸡问题
- 新人小白的第一次天池比赛感受
- 块存储、文件存储和对象存储三者的区别
- linux下磁盘查看和分区