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个任务,每台机器都有一个最大工作时间和等级,每个任务有一个需要工作时间和一个等级.如果机器完成一个任务要求是:机器的工作时间要大于等于任务的时间,机器的等级要大于等于 ...
随机推荐
- Java方法命名之“由简入繁”原则
1.访问控制层(Controller 层)中的方法命名方向是简洁明了,向着自然化语言方向靠拢,比如“更新用户”,建议命名为“updateUser”,而非“updateUserById”,实际上我们更新 ...
- url长度
今天在测试Email Ticket的时候发现在进行Mark as Read/Unread操作时,请求是通过GET方式进行的.URL中列出了所有参与该操作的Ticket Id.于是,我想起GET请求是有 ...
- html和java的交互,利用jsBridge开源框架
html中,js注册监听和回调 function connectWebViewJavascriptBridge(callback) { if (window.WebViewJavascriptBrid ...
- Struts2_Action
具体视图的返回可以由用户自己定义的Action来决定:具体的手段是根据返回的字符串找到对应的配置项,来决定视图的内容:具体Action的实现可以是一个普通的java类,里面有public String ...
- Zamplus 晶赞天机
类型: 定制服务 软件包: car/vehicle integrated industry solution collateral tourism 联系服务商 产品详情 解决方案 概要 DMP:通常称 ...
- vue-表单绑定
表单数据绑定1.1你可以用 v-model 指令在表单控件元素上创建双向数据绑定.它会根据控件类型自动选取正确的方法来更新元素.尽管有些神奇,但 v-model 本质上不过是语法糖,它负责监听用户的输 ...
- Java I/O 工作机制(一) —— Java 的 I/O 类库的基本架构
Java 的 I/O 类库的基本架构 Java 的 I/O 操作类在包 java.io 下,有将近 80 个类. 按数据格式分类: 面向字节(Byte)操作的 I/O 接口:InputStream 和 ...
- js 关系运算符
1.大于 > (小于 效果一样) > //true > //false //false,如果有一个字符串,字符串转换成数值在比较 ' //true,如果两个都是字符串,则比较第 ...
- leetcode:回溯——permutation-sequence,
1. permutation-sequence 顺序排列第k个序列 The set[1,2,3,…,n]contains a total of n! unique permutations. By l ...
- STM32-开发环境搭建-STM32CubeMX-安装及配置
STM32CubeMX系列教程之1.流水灯 刚刚接触到STM32CubeMX软件,感觉挺有意思,动动鼠标使STM32开发变得简单,特写文与大家分享.但具体性能如何还需测试. 硬件开发中的流水灯相当于软 ...