Highest Tower 18中南多校第一场H题
一、题意
给出N个方块,要求给出一个方案,使得
1、 所有方块都被使用到(题目数据保证这点)
2、所有方块垒成一个塔,且上面的方块宽度小于下面的方块
3、每个方块只能用一次,可以横着或者竖着。
n范围50w
二、题解
首先考虑表示一个正方形的方法:长度和宽度组成的无向图。
因为必然要把所有方块都堆好,所以仅考虑冲突情况:即一个边长出现了多次(如果仅仅出现了一次就无须考虑,直接无缝的塞进适应的位置即可)。
因而仅仅需要考虑连成片的图(联通块情况)。对于任意可行解,都有同一长度作为宽度不出现超过1次。
对于一个图,都会有如下设定:
1、每条边最多只能做一次“宽”,因而如果出现了多条边指向这个点的话,将会必然增加deg-1次高(因为每个边长作为宽度最多只能出现一次)
2、对于树状情况,若果有X个长宽组成一个联通块,则必然至少包括X-1个边,讨论上条定理,必然会有一个边应当作为高出现,因而建议选择最大的。
重新梳理下思路:
1、考虑不同联通块,由于不存在相同的宽度,因此可以仅单独讨论其对答案的贡献(因为互相穿插互不影响)
2、对于同一个联通块,应当认为仅仅存在两种情况——即树或者树多一条边:
考虑每个点都是一个边长,每条边都是一个矩形,
若有树则是,n个不同的点对应n-1个矩形,则认为有n-1个不同的长度分别担任“成为宽度”的重任;
若有多一条边,则认为n个点对应n个矩形,则有正好n个不同的长度分别担任“成为宽度”的重任;
在多一条边,则认为,n个不同的长度,要出n+1个矩形(考虑必然要有n+1个不同的长度担任“成为宽度”的重任,然额一共只有n,故不存在);
3、对于每个点,如果被多次指向,那么必然应当“最少有size-1次担任“成为高度”的任务“,换句话说,最多成为一次宽度。因此,对于任何一点,都必然为答案贡献(size-1)*val[now].
4、对于每个树,我们可以自由选择”哪个点为起始节点,即不被指向(换句话说,指定任意节点为根)将其点权值贡献给答案“
5、对于树+1条边,参见2,认为“没得选”
最后注意下数据太大,要首先离散化一下。
三、代码
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<string.h>
#include<queue> using namespace std; #define ll long long const ll MAXN=;
map<int,int> mapp;
ll n,val[MAXN],vis[MAXN];
vector<int>G[MAXN];
ll deg,maxx;
ll ans; void dfs(int now)
{
if(vis[now])return;
vis[now]=;
ans+=val[now]*(G[now].size()-);
maxx=max(maxx,val[now]);
deg+=G[now].size()-;
for(int i=;i<G[now].size();++i)
{
dfs(G[now][i]);
} } int main()
{
while(cin>>n)
{
mapp.clear();
int id=;
for(int i=;i<=MAXN;++i)G[i].clear();
for(int i=;i<=n;++i)
{
int a,b,aa,bb;
scanf("%d%d",&a,&b);
if(mapp.count(a))aa=mapp[a];
else aa=mapp[a]=id++;
if(mapp.count(b))bb=mapp[b];
else bb=mapp[b]=id++;
val[aa]=a;
val[bb]=b;
G[aa].push_back(bb);
G[bb].push_back(aa);
}
memset(vis,,sizeof(vis));
ans=;
for(int i=;i<id;++i)
{
if(!vis[i])
{
deg=;
maxx=;
dfs(i);
if(deg<)ans+=maxx;
} }
cout<<ans<<endl;
} return ;
}
Highest Tower 18中南多校第一场H题的更多相关文章
- Card Hand Sorting 18中南多校第一场C题
一.题意 随机给你一堆牌(标准扑克牌),之后让你按照: 第一优先规则:所有相同花色的在一起 第二优先规则:所有相同花色的必须按照升序或者降序排列 问,你最少要拿出多少张牌插入到其他的地方以维持这个状况 ...
- 2019年牛客多校第一场 H题XOR 线性基
题目链接 传送门 题意 求\(n\)个数中子集内所有数异或为\(0\)的子集大小之和. 思路 对于子集大小我们不好维护,因此我们可以转换思路变成求每个数的贡献. 首先我们将所有数的线性基的基底\(b\ ...
- 2019年牛客多校第一场B题Integration 数学
2019年牛客多校第一场B题 Integration 题意 给出一个公式,求值 思路 明显的化简公式题,公式是分母连乘形式,这个时候要想到拆分,那如何拆分母呢,自然是裂项,此时有很多项裂项,我们不妨从 ...
- 【2019多校第一场补题 / HDU6578】2019多校第一场A题1001Blank——dp
HDU6578链接 题意 有一串字符串,仅由 {0,1,2,3}\{0, 1, 2, 3\}{0,1,2,3} 组成,长度为 nnn,同时满足 mmm 个条件.每个条件由三个整数组成:l.r.xl.r ...
- Artwork 18年中南多校第一场A
一.题意 对于一个矩阵,若干道命令,每道命令将会把某一段格子涂黑,请问每次涂黑之后矩阵中未被涂黑的块的数量? 二.思路 保存每道命令,并且忠实的执行他,到最后一步开始搜索联通块的数量,并将其保存. 之 ...
- 2014多校第一场J题 || HDU 4870 Rating(DP || 高斯消元)
题目链接 题意 :小女孩注册了两个比赛的帐号,初始分值都为0,每做一次比赛如果排名在前两百名,rating涨50,否则降100,告诉你她每次比赛在前两百名的概率p,如果她每次做题都用两个账号中分数低的 ...
- 2014多校第一场 E 题 || HDU 4865 Peter's Hobby (DP)
题目链接 题意 : 给你两个表格,第一个表格是三种天气下出现四种湿度的可能性.第二个表格是,昨天出现的三种天气下,今天出现三种天气的可能性.然后给你这几天的湿度,告诉你第一天出现三种天气的可能性,让你 ...
- 2014多校第一场 I 题 || HDU 4869 Turn the pokers(费马小定理+快速幂模)
题目链接 题意 : m张牌,可以翻n次,每次翻xi张牌,问最后能得到多少种形态. 思路 :0定义为反面,1定义为正面,(一开始都是反), 对于每次翻牌操作,我们定义两个边界lb,rb,代表每次中1最少 ...
- 2014多校第一场D题 || HDU 4864 Task (贪心)
题目链接 题意 : 用N台机器,M个任务,每台机器都有一个最大工作时间和等级,每个任务有一个需要工作时间和一个等级.如果机器完成一个任务要求是:机器的工作时间要大于等于任务的时间,机器的等级要大于等于 ...
随机推荐
- BZOJ4260: Codechef REBXOR (01Tire树)
题意 题目链接 Sol 首先维护出前缀xor和后缀xor 对每个位置的元素插入到Trie树里面,每次找到和该前缀xor起来最大的元素 正反各做一遍,取最大. 记得要开log倍空间qwq.. #incl ...
- C++ Knowledge series 2
Programming language evolves always along with Compiler's evolvement The semantics of constructors O ...
- Android基础Activity篇——Intent返回数据给上一个活动
1.如果活动B要将数据返回给活动A,那么需要以下三步: 1.1在活动A中使用startActivityForResult()方法启动活动B. 1.2在活动B中使用setResult()方法传回Iten ...
- u-boot分析(十)----堆栈设置|代码拷贝|完成BL1阶段
u-boot分析(十) 上篇博文我们按照210的启动流程,分析到了初始化nand flash,由于接下来的关闭ABB比较简单所以跳过,所以我们今天按照u-boot的启动流程继续进行分析. 今天我们会用 ...
- SqlServer存储过程中常用函数及操作
1.case语句 用于选择语句 SELECT ProductNumber, Category = CASE ProductLine WHEN 'R' THEN 'Road' WHEN 'M' THEN ...
- Objectbox Box的getAll() 函数返回emptylist() 未判断导致崩溃
最近使用了Objectbox作为新项目的数据库后台,Greendao开发团队新力作,但是Objectbox算是比较新的一个东西,现在资料也不多. 今天跟大家分享一个关于Box类的getAll()函数的 ...
- MySQL安装和简单操作
MySQL数据库安装与配置详解 MySQL的安装请参考下面这篇博客,讲述的非常详细,各种截图也很清晰.http://www.cnblogs.com/sshoub/p/4321640.html MySQ ...
- MySQL 开机自启动
MySQL 开机自启动 chkconfig add mysqld 或者 echo "/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc ...
- SQL语句关于时间的查询小心得,希望大家给点意见
完全使用时间函数去搞定查询日期,之前写的可能有些问题,现在删了修正一下 本月记录: SELECT * FROM 表 WHERE datediff(month,[dateadd],getdate())= ...
- POJ - 3470 Walls
小鸟往四个方向飞都枚举一下,数据范围没给,离散以后按在其中一个轴线排序,在线段树上更新墙的id,然后就是点查询在在哪个墙上了. 这题有个trick,因为数据范围没给我老以为是inf设置小了,WA了很多 ...