Highest Tower 18中南多校第一场H题

一、题意

给出N个方块,要求给出一个方案,使得
1、 所有方块都被使用到(题目数据保证这点)

2、所有方块垒成一个塔,且上面的方块宽度小于下面的方块

3、每个方块只能用一次,可以横着或者竖着。

n范围50w

二、题解

  首先考虑表示一个正方形的方法:长度和宽度组成的无向图。

  因为必然要把所有方块都堆好,所以仅考虑冲突情况:即一个边长出现了多次(如果仅仅出现了一次就无须考虑,直接无缝的塞进适应的位置即可)。

  因而仅仅需要考虑连成片的图(联通块情况)

  对于一个图,都会有如下设定:

    1、每条边最多只能做一次“宽”,因而如果出现了多条边指向这个点的话,将会必然增加deg-1次高(因为每个边长作为宽度最多只能出现一次)

    2、对于树状情况,若果有X个长宽组成一个联通块,则必然至少包括X-1个边,讨论上条定理,必然会有一个边应当作为高出现,因而建议选择最大的。

三、代码

#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=500233;
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]=1;
    ans+=val[now]*(G[now].size()-1);
    maxx=max(maxx,val[now]);
    deg+=G[now].size()-2;
    for(int i=0;i<G[now].size();++i)
    {
        dfs(G[now][i]);
    }

}

int main()
{
    while(cin>>n)
    {
        mapp.clear();
        int id=0;
        for(int i=1;i<=MAXN;++i)G[i].clear();
        for(int i=1;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,0,sizeof(vis));
        ans=0;
        for(int i=0;i<id;++i)
        {
            if(!vis[i])
            {
                deg=0;
                maxx=0;
                dfs(i);
                if(deg<0)ans+=maxx;
            }

        }
        cout<<ans<<endl;
    }

    return 0;
}

原文地址:https://www.cnblogs.com/rikka/p/8727907.html

时间: 2024-10-10 07:12:44

Highest Tower 18中南多校第一场H题的相关文章

Card Hand Sorting 18中南多校第一场C题

一.题意 随机给你一堆牌(标准扑克牌),之后让你按照: 第一优先规则:所有相同花色的在一起 第二优先规则:所有相同花色的必须按照升序或者降序排列 问,你最少要拿出多少张牌插入到其他的地方以维持这个状况? 二.做法 考虑,4种花色,因而排列有A44(24种): 考虑升降续组合,为2^4=16种 因而所有合法最终状态共有24*16种状态,因而可以进行枚举. 对于变化次数有,n-LCS(i); 故,枚举取最大即可. 最大时间复杂度为:52*52+14*16*52*log52; (因为最大卡牌数量为52

2014多校第一场 I 题 || HDU 4869 Turn the pokers(费马小定理+快速幂模)

题目链接 题意 : m张牌,可以翻n次,每次翻xi张牌,问最后能得到多少种形态. 思路 :0定义为反面,1定义为正面,(一开始都是反), 对于每次翻牌操作,我们定义两个边界lb,rb,代表每次中1最少时最少的个数,rb代表1最多时的个数.一张牌翻两次和两张牌翻一次 得到的奇偶性相同,所以结果中lb和最多的rb的奇偶性相同.如果找到了lb和rb,那么,介于这两个数之间且与这两个数奇偶性相同的数均可取到,然后在这个区间内求组合数相加(若lb=3,rb=7,则3,5,7这些情况都能取到,也就是说最后的

2014多校第一场D题 || HDU 4864 Task (贪心)

题目链接 题意 : 用N台机器,M个任务,每台机器都有一个最大工作时间和等级,每个任务有一个需要工作时间和一个等级.如果机器完成一个任务要求是:机器的工作时间要大于等于任务的时间,机器的等级要大于等于任务的等级.一台机器只能完成一个任务,一个任务只能被一台机器完成.每个机器完成一个任务公司能够获得500*xi+2*yi (此处xy都是指被完成的任务的).输出所有机器能完成的最多任务数,和最大盈利. 思路 :贪心,自己做的时候想了各种排序都不对,没有考虑到500*xi+2*yi 这个公式的重要性.

2014多校第一场J题 || HDU 4870 Rating(DP || 高斯消元)

题目链接 题意 :小女孩注册了两个比赛的帐号,初始分值都为0,每做一次比赛如果排名在前两百名,rating涨50,否则降100,告诉你她每次比赛在前两百名的概率p,如果她每次做题都用两个账号中分数低的那个去做,问她最终有一个账号达到1000分需要做的比赛的次数的期望值. 思路 :可以直接用公式推出来用DP做,也可以列出210个方程组用高斯消元去做. (1)DP1:离散化.因为50,100,1000都是50的倍数,所以就看作1,2,20.这样做起来比较方便. 定义dp[i]为从 i 分数到达i+1

2014多校第一场 E 题 || HDU 4865 Peter&#39;s Hobby (DP)

题目链接 题意 : 给你两个表格,第一个表格是三种天气下出现四种湿度的可能性.第二个表格是,昨天出现的三种天气下,今天出现三种天气的可能性.然后给你这几天的湿度,告诉你第一天出现三种天气的可能性,让你求出最可能出现的天气序列 . 思路 : 定义第 i 天叶子湿度为hum[i].第 i 天,天气为 j 的最大概率为dp[i][j].wealea[i][j]表示天气为 i 叶子为j的概率,weawea[i][j]表示今天天气为 i 明天天气为j的概率,st[i]表示第一天天气为i的概率.pre[i]

2014多校第一场A题 || HDU 4861 Couple doubi

题目链接 题意 : 有K个球,给你一个数P,可以求出K个值,(i=1,2,...,k) : 1^i+2^i+...+(p-1)^i (mod p).然后女朋友先取,再xp取,都希望赢,如果女朋友能赢输出YES,否则输出NO 思路 :这个题,在纸上算算差不多就出来结果了,因为要赢,所以一开始必定拿大的,根据规律可以发现最后的那个取余结果不是0就是某个数,所以就看那个数有奇数个还是偶数个即可. 官方题解: 1 #include <stdio.h> 2 #include <string.h&g

HDU 5294 多校第一场1007题 最短路+最小割

Tricks Device Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1285    Accepted Submission(s): 302 Problem Description Innocent Wu follows Dumb Zhang into a ancient tomb. Innocent Wu’s at the ent

15年多校第一场七题hdu5294

要做这题,先要明白图的割,说白了就是 为了让原点无法到汇点要删几条边(之所以叫割,就是在图面上切一刀,减掉最小的边是原点和汇点成为两个集合),想到了割先放着一会用. 题中说只有沿最短路走才有可能追上,那么就意味着图中的最短路可能不止一条,沿着最短路走才能追上,那么其他的走法就没用了,所以只要求原点到汇点的最短路径图的最小割就可以知道最少断几条边可以堵住人了,再说第二问,既然最短路不止一条,那么只要边数量最小的一条最短路不被堵上,那个人就能追上炸弹张了,其他的边都可以赌上一点问题没有,这样就是总点

杭电多校第一场补题-1002 Balanced Sequence

1002: Balanced Sequence 题意:给定n个字符串,n的大小在1e5左右,字符串的长度也是1e5,字符串仅由'('或')'组成,合法串可以不是连续的,将这n个串按照一定的顺序排列起来,使得组合之后的字符串的合法串的长度最长.n*len的大小是1e6 思路:首先n*len的处理出来每一个字符串中合法的长度,处理的办法可以参考之前栈的想法,每遇见一个')',就判断前面'('的个数,只要不为0,此时就可以合成一个合法串,处理完之后可以得到剩下的')'和'('的个数,然后所有的n个串进