CF 976D Degree Set

2023-05-16

          • 传送门
          • 题目大意
          • 思路
          • 参考代码
          • 总结

传送门
题目大意

  给你一个长度为 n n 的正整数序列 d1,d2,,dn d1<d2<<dn d 1 < d 2 < ⋯ < d n )。要求你构造一个满足以下条件的无向图:

  1. 有恰好 dn+1 d n + 1 个点;
  2. 没有自环;
  3. 没有重边;
  4. 总边数不超过 106 10 6
  5. 它的度数集合等于 d d

  点从 1 标号至 dn+1 d n + 1

  图的度数序列是一个长度与图的点数相同的数组 a a ,其中 ai 是第 i i 个顶点的度数(与其相邻的顶点数)。

  图的度数集合是度数序列排序后去重的结果。

  保证有解,要求输出符合条件的图。

思路

  唉,我太弱了,这么傻逼的构造题,硬是做了两节课都没做出来,还是看了题解才做出来的,唉,太弱啦!

  显然至少有一个点是连接了其它所有点的,那至多有多少个点连接了其它所有点呢?显然是 d1 个点。这样,就不存在度数为 d1 d 1 dn d n 的点了,并且 d2n1 d 2 ∼ n − 1 的所有值都要减去 d1 d 1 。我们强制让还有度数的点的数量为 dn1+1 d n − 1 + 1 ,构造方法为:令度数为 d1 d 1 的点的个数为 dndn1 d n − d n − 1 (显然至少为 1 1 ),将度数为 dn 的点连向其它所有点,那么点数将会减少 d1+(dndn1) d 1 + ( d n − d n − 1 ) 。这时,以前度数为 dn1 d n − 1 的点度数变成了 dn1d1 d n − 1 − d 1 ,因为有 dn1d1+1=dn+1(d1+(dndn1)) d n − 1 − d 1 + 1 = d n + 1 − ( d 1 + ( d n − d n − 1 ) ) ,所以原问题变成了一个子问题,递归求解即可。

参考代码
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <cassert>
#include <cctype>
#include <climits>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <bitset>
#include <list>
#include <functional>
typedef long long LL;
typedef unsigned long long ULL;
using std::cin;
using std::cout;
using std::endl;
typedef int INT_PUT;
INT_PUT readIn()
{
    INT_PUT a = 0; bool positive = true;
    char ch = getchar();
    while (!(ch == '-' || std::isdigit(ch))) ch = getchar();
    if (ch == '-') { positive = false; ch = getchar(); }
    while (std::isdigit(ch)) { a = a * 10 - (ch - '0'); ch = getchar(); }
    return positive ? -a : a;
}
void printOut(INT_PUT x)
{
    char buffer[20]; int length = 0;
    if (x < 0) putchar('-'); else x = -x;
    do buffer[length++] = -(x % 10) + '0'; while (x /= 10);
    do putchar(buffer[--length]); while (length);
}

const int maxn = 1005;
const int maxm = 305;
int n, m;
int a[maxn];

std::vector<std::pair<int, int> > G;

void run()
{
    m = readIn();
    for (int i = 1; i <= m; i++)
        a[i] = readIn();
    n = a[m] + 1;
    int l = 1;
    int start = 1;
    int accum = 0;
    int r = m;
    for (int i = 1; i <= r; i++)
    {
        for (int j = 1; j <= a[i]; j++)
        {
            for (int k = start + 1; k <= accum + a[r] + 1; k++)
            {
                G.push_back(std::make_pair(start, k));
            }
            start++;
        }
        r--;

        accum += a[i];
        for (int j = i + 1; j <= m; j++)
            a[j] -= a[i];
    }

    printOut(G.size());
    for (int i = 0; i < G.size(); i++)
    {
        putchar('\n');
        printOut(G[i].first);
        putchar(' ');
        printOut(G[i].second);
    }
}

int main()
{
    run();
    return 0;
}
总结

  最关键的是如何想到度数为 d1 d 1 的点数为多少。这里为了构造,很显然我们要往子问题那里去靠。如果满足子问题结构,设度数为 d1 d 1 的点数为 k k ,那么有:

dn1d1+1=dnd1+1k

  显然有 k=dndn1 k = d n − d n − 1 ,相当于是我们先用度数为 dn+1 d n + 1 的把所有度数为 d1 d 1 的消掉,并且把自己的度数变成 dn1 d n − 1

  需要注意的是,我们是令点数为 dn1+1 d n − 1 + 1 ,但是度数都减去了 d1 d 1 ,递归求解时 dn1 d n − 1 发生了改变。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CF 976D Degree Set 的相关文章

  • .NET C# 中的设置操作

    我现在正在研究与粗糙集相关的东西 该项目使用了大量的集合操作和操作 我一直使用字符串操作作为集合操作的权宜之计 它一直工作得很好 直到我们需要通过算法处理一些大量的数据 500 000 条记录 每条记录大约 40 多列 我知道 net 2
  • 如何在Python中将集合转换为列表?

    我正在尝试将 Python 2 6 中的集合转换为列表 我正在使用这个语法 first list 1 2 3 4 my set set first list my list list my set 但是 我得到以下堆栈跟踪 Tracebac
  • 同构弦

    给定两个字符串 s 和 t 确定它们是否同构 如果 s 中的字符可以替换得到 t 则两个字符串是同构的 所有出现的字符都必须替换为另一个字符 同时保留字符的顺序 任何两个字符都不能映射到同一个字符 但一个字符可以映射到其自身 例如 给定 e
  • Scala:将数组放入集合或映射中的轻量级方法

    Since 不适用于数组 我无法有效地创建一组数组 或带有数组键的映射 我宁愿不承受将数组转换为向量或列表或其他东西的性能损失 是否有一种轻量级的方法来定义数组上的自然比较和哈希码 以便我可以将它们放在集合中 Use WrappedArra
  • 从 Set 中检索“规范值”,其中 T 具有自定义 equals()

    我有一个class Foo这会覆盖equals and hashCode 适当地 我想也想使用HashSet
  • hashMap、List 和 Set 的数据结构

    任何人都可以指导我深入了解所使用的数据结构以及它是如何在 Util Collection 页面的列表 集合和映射中实现的 在面试中 大多数问题都是关于算法的 但我从未在任何地方看到过实现细节 有人可以分享一下信息吗 要了解 Java 如何实
  • Python-从另一个列表中删除一组列表

    array1 1 2 3 4 5 6 7 8 9 array2 1 2 2 2 5 6 6 6 9 temp set array2 array1 remove temp Traceback most recent call last Fil
  • 检查 C++ 中的映射是否包含另一个映射中的所有键

    我计划在 C 中使用两个类型的映射 std map
  • 如何在C#中获得一组枚举值?

    假设我有一个枚举 http msdn microsoft com en us library system windows forms dialogresult aspx namespace System Windows Forms pub
  • Python:如何获取仅出现在一组列表中的一组中的项目?

    我想创建一个函数 它接受一个或多个集合的列表 并查找列表中所有集合的对称差异 即结果应该是一组值 每个值仅包含在其中一个值中套 如果我对对称差异的理解是错误的 请纠正我 例如 gt gt gt s1 set 1 2 3 gt gt gt s
  • C++ std::set 更新很乏味:我无法就地更改元素

    我发现更新操作std set乏味 因为没有这样的 API参考参数 http en cppreference com w cpp container set 所以我目前所做的是这样的 find element in set by iterat
  • 如何在不更改 equals 和 hashcode 的情况下插入集合

    我正在寻找建议 我有一个Person具有字符串firstName和字符串lastName的类 当我试图插入具有相同字符串的列表值时 例如 set add new Person firstName lastName set add new P
  • Java中如何设置背景图片?

    我正在使用 Java 使用 BlueJ 作为 IDE 开发一个简单的平台游戏 现在 我在游戏中使用多边形和简单形状绘制了玩家 敌人精灵 平台和其他物品 最终我希望用实际图像替换它们 现在我想知道将图像 URL 或来自本地源 设置为游戏窗口
  • 在 pandas 系列上成对应用函数

    我有一个 pandas 系列 其元素构成 freezesets data 0 frozenset apple banana 1 frozenset apple orange 2 frozenset banana 3 frozenset ku
  • android 将自定义字体设置为油漆

    我想在油漆上绘制文字 如何用自定义字体绘制它 前 Helvetica 并且还粗体 我更愿意使用系统字体而不是从资源创建它 谢谢 如果 自定义字体 是指作为资源提供的字体 则以下代码应该有效 Typeface plain Typeface c
  • 获得列表并集的最快方法 - Python

    有一个 C 比较可以从列表列表中获取列表的并集 找到集合并集的最快方法 https stackoverflow com questions 11362002 the fastest way to find union of sets 还有其
  • 如何实现 __eq__ 进行集合包含测试?

    我遇到了一个问题 我将一个实例添加到一个集合中 然后进行测试以查看该对象是否存在于该集合中 我已经覆盖了 eq 但在包含测试期间不会调用它 我必须覆盖吗 hash 反而 如果是这样 我将如何实施 hash 鉴于我需要对元组 列表和字典进行哈
  • 在另一个向量中定位子向量

    我有一个vector
  • 以下代码使用 std::set “合法”吗?

    我有这个代码 set
  • 如何将具有唯一字段的对象添加到 Set 中

    如何用具有唯一字段的对象填充集合 例如我有一堂课Person其中有一个独特的领域称为name因此 如果我添加到 Set 一个具有重复名称的对象 则不应添加它 public class Test public static void main

随机推荐

  • 补录:2018 和 2019 New Year‘s Resolution

    前言 xff1a 吉光片羽 xff0c 以飨读者 2018 New Year 39 s Resolution One year and a half ago I felt that life in 2020 would be quite d
  • 原博文地址

    由于账号问题 xff0c 现更改为这个账号 xff0c 以下为原博文地址 使用WH MOUSE LL钩子来判断按键是否是mouse event模拟的 http blog csdn net qq 26140973 article detail
  • [NOI 2003] 文本编辑器 Splay 维护序列 / 块状链表

    传送门 xff08 JZOJ xff09 xff08 第一道全国决赛题 xff09 解法 1 xff1a 使用 Splay 维护 不管怎么说 xff0c 总和刚刚学过的迎合上了 这道题可以直接上 Splay 维护线性序列 xff0c 光标位
  • 一次macOS的升级填坑(macOS Catalina - macOS Monterey)

    目录 小序一 升级前操作二 升级中三 问题填坑1 像我一样长时间卡在一个进度条怎么办2 在更新途中重启过电脑 xff08 完整流程填坑 xff09 3 安装之后不能开机 xff0c 如何紧急拷贝资料4 安装不成功 xff0c 如何重新安装系
  • CF 713C Sonya and Problem Wihtout a Legend

    文章目录 传送门题目大意正解通过维护关键点来维护信息参考代码 传送门 题目大意 给定一个长度为 n n 3000
  • Luogu 3642 [APIO 2016] 烟火表演

    传送门引例 xff08 上一道题 xff09 凸函数一开始的思路正解参考代码总结 传送门 引例 xff08 上一道题 xff09 凸函数 回忆我们上一道题是怎么做的 我们维护的东西的实质是一个 xff08 下 xff09 凸函数 由于我们的
  • Luogu 3631 [APIO 2011] 方格染色

    传送门思路参考代码细节 传送门 思路 很不错的一道题 xff0c 用到的东西不深 xff0c 但是要想到确实需要一定思维 一开始我想的是动态规划 xff0c 发现如果要设状态需要知道一个格子左边 xff0c 上边和左上边三个格子的状态 然后
  • Luogu 3632 [APIO 2011] 寻路

    传送门正解参考代码 传送门 正解 暴力连边跑最短路就好了 xff0c 只不过代码太长太难写啦 xff01 参考代码 span class hljs preprocessor include lt cstdio gt span span cl
  • Luogu 3634 [APIO 2012] 守卫

    传送门思路正解参考代码 传送门 思路 感觉自己越来越笨了 首先 xff0c 很明显这道题需要把没有看到忍者的区间给删去 xff0c 可以用前缀和 O n O n 处理 xff0c 然后对没有删去的地方重新标号 重新标号时 xff0c 需要对
  • Luogu 1552 [APIO 2012] 派遣

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 题读错了两次 xff0c 一开始读成了一个一般的背包 xff0c 然后读成了一个价值和花费相同的背包 xff0c 最后才发现原来是一个价值为 1
  • 贪玩 CF 之旅

    文章目录 CF 7D Palindrome Degree http codeforces com problemset problem 7 D 题解 CF 713C Sonya and Problem Wihtout a Legend ht
  • Luogu 3638 [APIO 2013] 机器人

    传送门思路正解参考代码关于 SPFA 传送门 思路 n n 这么小 会不会是搜索题 稍有经验的我直接否定了这个结论 仔细读题并分析样例 发现原来一个位置可以有多个机器人 且机器人行走的时候无视其它机器人 那这个就是一张图啊 可以将这张图预处
  • Luogu 3647 [APIO 2014] 连珠线

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 又看错题了 题目中说一个新的珠子和一个已经添加的珠子连接起来 xff0c 我没有看到 xff0c 然后就凉了 立个 flag xff1a 已经连续看错五题了 xff0c
  • 【转】mingw64的安装方法

    转自 xff1a http write blog csdn net postlist mingw64的安装方法 1 下载ming w64 http sourceforge net projects mingw w64 files or x8
  • Luogu 3645 [APIO 2015] 雅加达的摩天楼

    传送门思路正解参考代码Update 传送门 思路 唉 xff0c 我太弱了 xff0c 我都看出来要分块了 xff0c 就是做不来 不过终于把题读对了 先来看子任务三怎么做 显然可以有一个 O m 2 O m 2
  • Luogu 3644 [APIO 2015] 八邻旁之桥

    传送门思路当 k 61 2 时参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 题也做不来 很明显这道题先要把不过河的人排除了 xff0c 剩下的都是要过河的 当 k 61 1 k 61 1 时 xff0
  • Luogu 3646 [APIO 2015] 巴厘岛的雕塑

    传送门总结 APIO 2015思路参考代码总结 传送门 总结 APIO 2015 争取今天做完一套 QAQ T1 我最多之能想到从高位向低位做 xff0c 然后就完全不会了 xff1b T2 我想到了分情况讨论 xff0c 但是没有建图成功
  • UOJ 2016 [APIO 2016] Gap

    传送门思路参考代码交互题 交互题大致形式Windows 平台下 xff08 Dev C 43 43 xff09 Ubuntu 平台下 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 题也做不来 这道题简直就是利用
  • CF 940F Machine Learning

    传送门题目大意思路参考代码Remarks 传送门 题目大意 给你一个数组 a 1 n n 10 5 a 1 n
  • CF 976D Degree Set

    传送门题目大意思路参考代码总结 传送门 题目大意 给你一个长度为 n n 的正整数序列 d 1 d 2 d n d1 d2 dn xff08 d 1 lt d 2 lt lt d n