2019 ICPC香港站 G. Game Design

news2024/9/28 13:22:02

Problem - G - Codeforces

问题描述:怪物只能在树叶子节点出生,向上走,可以花费一个值在一个节点建防御塔,防御塔会阻碍怪物向上走。最小花费可以让根节点无法被怪物走到的一个造塔方法算是一个方案。现给定方案数,让构造满足给定方案数的树。数据限制:节点数:[2, 1e5],每一个防御塔的花费[1, 1e9]

思路:可以发现对于一个合数,它可以分解成许多质因数,例如8,可以分解成2 2 2这三个2,那么树的构造就是:

image-20230907162202193

这个的方案数是:2 * 2 * 2

如果是质数,例如11,可以进行减一操作后加上一个节点,在加的节点的基础上执行合数的操作方法。

image-20230907162644274

可以发现:是1 * 2(4-5) * 5(6-10) + 1(3-3) = 11,这个+1,是在节点3处。将节点2删除没有影响。

image-20230907162820637

可以发现:每次进行操作,如果是质数就-1,加一个节点,在那个节点的基础上进行添加质数-1的所有最小质因子。如果是合数,就不额外添加节点,直接添加所有的最小质因子。

证明如下:常见的,1e5以内的质数个数不超过9.6e3,1e7以内的质数个数不超过6.7e6,1e9以内的质数不超过5.1e7。最坏的情况下,减完后进行分解存在大质数,那么仍需要进行减1再分解。存在相差为2的质数的情况在值很大的情况下很少,这个操作的时间复杂度是近似O(log(N))(考虑到质数之间的间隔等),同时,最多有log(N) * log(N)个节点数,及最多900个,但是实际情况远小于900,c的限制同理。

#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <set>
#include <map>
#include <queue>
#include <ctime>
#include <random>
#include <sstream>
#include <numeric>
#include <stdio.h>
#include <functional>
#include <bitset>
#include <algorithm>
using namespace std;

// #define Multiple_groups_of_examples
#define IOS std::cout.tie(0);std::cin.tie(0)->sync_with_stdio(false);
#define dbgnb(a) std::cout << #a << " = " << a << '\n';
#define dbgtt cout<<" !!!test!!! "<<endl;
#define rep(i,x,n) for(int i = x; i <= n; i++)

#define all(x) (x).begin(),(x).end()
#define pb push_back
#define vf first
#define vs second

typedef long long LL;
typedef pair<int,int> PII;

const int INF = 0x3f3f3f3f;
const int N = 2e5 + 21;

void inpfile();

// 试除法分解质因数
vector<int> divide(int x) {
    vector<int> res;
    for(int i = 2; i <= x / i; ++i) {
        if(x % i == 0) {
            while(x % i == 0) x /= i, res.push_back(i);
        }
    }
    if(x > 1) res.push_back(x);
    return res;
}
void solve() {
    int k; cin>>k;
    vector<int> fa(N),c(N); // fa --> i节点的父亲节点是哪个    c --> 第i个点的花销
    vector<vector<int>> g(N); // 建的图
    int cnt  = 1; // 树链的编号
    
    // 进行质数分解
    /**
     * 如果小于10,直接展开成链。
     * 如果大于等于10:
     *      进行质数分解:
     *          - 是质数,多加一个节点连接 (质数-1)的分解因子所成的链
     *          - 不是质数,将所有的最小的因子作为链首,并连接到所指向的父亲节点。
    */
    auto dfs1 = [&](auto &&dfs1, int now, int fu) -> void {
        if(now < 10) { // 小于10,将树链展开。
            int father = fu;
            for(int i = 1; i <= now; ++i) {
                fa[++cnt] = father; 
                g[father].push_back(cnt);
                father = cnt; // 父亲节点要一直更新
            }
            return ;
        }
        // 分解出所有的最小因数
        auto primes = divide(now);
        if(primes.size() == 1) { // 如果是质数,加一个节点,向下递归
            fa[++cnt] = fu;
            g[fu].push_back(cnt);
            dfs1(dfs1, now-1, cnt);
        } else { // 否则,将因数暂时指向当前父亲节点,进入递归去指向它真正的父亲节点
            for(auto t: primes) {
                // 因为当前t是因子,而因子可能很大,导致不满足这个条件:2 <= N <= 1e5,因此对于大于10的质数还要进行递归找最小的
                dfs1(dfs1, t, fu);
            }
        }
    };
    dfs1(dfs1, k, 1);
    cout<<cnt<<endl;

    // 自下向上找花费
    auto dfs2 = [&](auto&&dfs2, int u) -> void {
        if(g[u].size() == 0) {
            c[u] = 1;
            return ;
        }
        for(auto y: g[u]) {
            dfs2(dfs2,y);
            c[u] += c[y];
        }
    };
    dfs2(dfs2,1);
    for(int i = 2; i <= cnt; ++i) cout<<fa[i]<<" "; puts("");
    c[1] = 1e8; // 根节点不算
    for(int i = 1; i <= cnt; ++i) cout<<c[i]<<" ";
}
int main()
{
    #ifdef Multiple_groups_of_examples
    int T; cin>>T;
    while(T--)
    #endif
    solve();
    return 0;
}
void inpfile() {
    #define mytest
    #ifdef mytest
    freopen("ANSWER.txt", "w",stdout);
    #endif
}

模板 - 数学 - 数论 - 数论常识 - KisekiPurin2019 - 博客园 (cnblogs.com)

Graph Editor (csacademy.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/984779.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MaskVO: Self-Supervised Visual Odometry with a Learnable Dynamic Mask 论文阅读

论文信息 题目&#xff1a;MaskVO: Self-Supervised Visual Odometry with a Learnable Dynamic Mask 作者&#xff1a;Weihao Xuan, Ruijie Ren, Siyuan Wu, Changhao Chen 时间&#xff1a;2022 来源&#xff1a; IEEE/SICE International Symposium on System Integration …

Kubernetes(k8s)部署高可用多主多从的Redis集群

Kubernetes部署高可用多主多从的Redis集群 环境准备准备Kubernetes准备存储类 部署redis准备一个命名空间命令创建yaml文件创建&#xff08;推荐&#xff09; 准备redis配置文件准备部署statefulset的资源清单文件执行文件完成部署初始化集群 环境准备 准备Kubernetes 首先你…

【Go基础】编译、变量、常量、基本数据类型、字符串

面试题文档下链接点击这里免积分下载 go语言入门到精通点击这里免积分下载 编译 使用 go build 1.在项目目录下执行 2.在其他路径下编译 go build &#xff0c;需要再后面加上项目的路径&#xff08;项目路径从GOPATH/src后开始写起&#xff0c;编译之后的可执行文件就保存再…

chrome_elf.dll丢失怎么办?修复chrome_elf.dll文件的方法

Chrome是目前最受欢迎的网络浏览器之一&#xff0c;然而有时用户可能会遇到Chrome_elf.dll丢失的问题。该DLL文件是Chrome浏览器的一个重要组成部分&#xff0c;负责启动和管理程序的各种功能。当Chrome_elf.dll丢失时&#xff0c;用户可能无法正常启动Chrome或执行某些功能。本…

log4qt库的使用

log4qt库的使用 一,什么是log4qt?二,log4qt的下载三,如何集成log4qt?1.在vs2022中集成log4qt的方法:模块一:配置log4qt的步骤步骤一,将下好的log4qt库进行解压,然后再库文件中,新建build和Log4Qt文件夹步骤二,打开cmake,有两个填写路径的位置.步骤三,点击cmake的configure按钮…

(2023,Diffusion)稳定扩散模型是不稳定的

Stable Diffusion is Unstable 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 进交流群获取资料&#xff09; 0. 摘要 最近&#xff0c;文本到图像模型一直蓬勃发展。 尽管它们具有强大的生成能力&#xff0c;但我们的研究发现这一生成过程缺乏稳健性。 具体…

【C++】平衡二叉搜索树的模拟实现

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

【数据结构】设计环形队列

环形队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;先进先出&#xff09;原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 环形队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里&#xff0c;一旦一个队列…

使用Caffeine实现帖子的缓存来优化网站的运行速度

导入依赖 <!-- https://mvnrepository.com/artifact/com.github.ben-manes.caffeine/caffeine --><dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.1.7</version>…

【产品应用】一体化伺服电机在全自动咖啡研磨机中的应用

在现代社会中&#xff0c;咖啡已经成为人们生活中不可或缺的一部分。为了满足咖啡爱好者对于口感和品质的追求&#xff0c;全自动咖啡研磨机应运而生。 而其中的一体化伺服电机作为关键组件&#xff0c;发挥着重要的作用。本文将探讨一体化伺服电机在全自动咖啡研磨机中的应用&…

Magisk隐藏外挂解决方案

自2008年1.0测试版发布以来&#xff0c;安卓系统已经发展了近16年&#xff0c;凭借着优秀的开源生态&#xff0c;安卓系统飞速成长&#xff0c;已经成了当下手机系统中的龙头。据研究机构 Canalys 报告称&#xff0c;今年第一季度安卓设备的整体市场份额占比达到 78 %。 开源生…

走进中国水果罐头领军品牌真心罐头—快消食品企业的全链路数字化

近日&#xff0c;【数字中国-高效增长】名城优企游学系列之走进真心罐头活动成功举办&#xff01; 真心罐头食品有限公司&#xff08;以下简称为“真心罐头”&#xff09;初创于1990年&#xff0c;位于素有“北方明珠”、“黄桃之乡”美誉的海滨城市——辽宁省大连市&#xff0…

软件测试面试题(Python全栈自动化测试面试题)

1、你的测试职业发展是什么? 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自己&#xff0c;不…

Java不定参数使用及一些注意情况

一、背景 在项目中使用到了StringUtils.isAllBlack(String …css)方法。可以很方便地传递不定数量的参数进行空判。 但开发过程中遇到了一些问题&#xff0c;所以特地记录一下。 二、不定参数传参 不定参数的传参本质上是一个泛型的数组。参数数量大于等于两个的时候&#x…

薅羊毛零撸小游戏是这样赚米的!

薅羊毛小游戏作为一种特殊类型的游戏&#xff0c;吸引了一大批用户的关注。本文将探讨薅羊毛小游戏的盈利模式、用户体验以及对游戏产业的影响&#xff0c;旨在为读者提供专业而有深度的思考和启示。 一、薅羊毛小游戏的盈利模式&#xff1a; 1.广告变现&#xff1a;薅羊毛小游…

R-CNN

目标检测、语义分割 由于我们将区域建议与CNN相结合&#xff0c;我们将我们的方法称为R-CNN:带有CNN特征的区域。 目标检测系统由三个模块组成。第一种方法生成分类独立的区域提案。这些提议定义了可供我们的检测器使用的候选检测集合。第二个模块是一个大型卷积神经网络&…

【C++基础】类与对象(中):默认成员函数、构造函数、析构函数、拷贝构造、赋值重载函数……

​&#x1f47b;内容专栏&#xff1a; C/C编程 &#x1f428;本文概括&#xff1a; C基础语法。六大默认构造函数简介、构造函数、析构函数、拷贝构造函数、赋值重载函数、const成员函数、取地址重载等。 &#x1f43c;本文作者&#xff1a; 阿四啊 &#x1f438;发布时间&…

开开心心带你学习MySQL数据库之第六篇上

​ &#x1f4ae; &#x1f4ae;&#x1f4ae; 只要路是对的&#xff0c;就不害怕遥远! &#x1f4ae; &#x1f4ae;&#x1f4ae; &#x1f386;&#x1f386;&#x1f386;窗台是风景&#xff0c;笔下有前途&#xff0c;低头是题海&#xff0c;抬头是未来&#x1f386;&…

扩散模型 DDPM 核心代码梳理

参考内容&#xff1a; 大白话AI | 图像生成模型DDPM | 扩散模型 | 生成模型 | 概率扩散去噪生成模型 AIGC 基础&#xff0c;从VAE到DDPM 原理、代码详解 全网最简单的扩散模型DDPM教程 The Annotated Diffusion Model LaTeX公式编辑器 备注&#xff1a; 具体公式的推导请查看…