题意

小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月月赛]叠塔游戏 并查集相关推荐

  1. BZOJ 4884 [Lydsy2017年5月月赛]太空猫(单调DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4884 [题目大意] 太空猫(SpaceCat)是一款画面精致.玩法有趣的休闲游戏, 你 ...

  2. BZOJ 4883 [Lydsy2017年5月月赛]棋盘上的守卫(最小生成环套树森林)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4883 [题目大意] 在一个n*m的棋盘上要放置若干个守卫. 对于n行来说,每行必须恰好 ...

  3. BZOJ 2143 飞飞侠(线段树优化建边 / 并查集优化最短路)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2143 是 hydro 的 BZOJ ...

  4. 【BZOJ 4832】 [Lydsy2017年4月月赛] 抵制克苏恩 期望概率dp

    打记录的题打多了,忘了用开维记录信息了......我们用f[i][j][l][k]表示已经完成了i次攻击,随从3血剩j个,2血剩l个,1血剩k个,这样我们求出每个状态的概率,从而求出他们对答案的贡献并 ...

  5. 【bzoj4881】[Lydsy2017年5月月赛]线段游戏 树状数组+STL-set

    题目描述 quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐标分别为(0,i)和(1,p_i),其中p_1,p_2,...,p_n构成 ...

  6. Lydsy2017年4月月赛 抵制克苏恩

    Description 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩 炉石传说,不必担心,小Q同学会告诉你所有相关的细节.炉石传说是这样的一个游戏, 每个玩家拥有一个 ...

  7. [bzoj4881][Lydsy2017年5月月赛]线段游戏

    来自FallDream的博客,未经允许,请勿转载,谢谢. quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐标分别为(0,i)和(1, ...

  8. BZOJ4832: [Lydsy2017年4月月赛]抵制克苏恩

    传送门 题目大意: 攻击k次,每次可攻击随从或英雄. 随从数不大于7个,且1滴血的a个,2滴b个,3滴c个. 攻击一次血-1,如果随从没死可以生成3滴血随从一个 题解: 概率/期望dp f[i][j] ...

  9. BZOJ4883: [Lydsy2017年5月月赛]棋盘上的守卫

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4883 Description 在一个n*m的棋盘上要放置若干个守卫.对于n行来说,每行必须 ...

最新文章

  1. Python的零基础超详细讲解(第一天)-Python简介以及下载
  2. 图像降噪算法——低秩聚类:WNNM算法
  3. 幂等问题-概念上的通俗解释(未完待续)
  4. Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示...
  5. 关于JEECG 开源声明
  6. Elasticsearch学习系列-搜索技术基本知识
  7. linux进行硬盘分区挂载-了解系统,最更好的开发
  8. tcp协议和udp协议区别_TCP和UDP协议有什么区别?
  9. 常用的Mysql数据库操作语句大全
  10. hbiuder运行php_hbuilderx中运行php图文说明
  11. 大二计算机学期总结报告,大二计算机的实训总结.docx
  12. Python中sys模块
  13. Android资源,国内镜像站点,博客文章等
  14. MiniMap(小地图)插件
  15. 【C语言】打印一个爱心
  16. 郭东白:“系统是唐僧,我们是孙悟空”,阿里AliExpress演绎技术版西游记
  17. The Fun Of Algorithm - Day4 - 百钱百鸡问题
  18. 新人小白的第一次天池比赛感受
  19. 块存储、文件存储和对象存储三者的区别
  20. linux下磁盘查看和分区

热门文章

  1. 新手坐高铁怎么找车厢_第一次做高铁怎么找车厢和做位,谢谢大家
  2. 3G门户Android面试题(2013年)
  3. host映射主机名和端口
  4. 信息安全技术——(三)标识与认证技术
  5. 如何正确接触天使投资人?
  6. Cognos 8.3 IE 兼容性问题
  7. TWaver自动化设计平台Legolas —— 交互事件响应动作
  8. php安全新闻早八点-高级持续渗透-第一季关于后门
  9. 如何准确的向工程师传达动效设计?
  10. docker-anpine镜像介绍