FJWC2019 Day2 题解

news2025/7/19 7:02:52

T1 - 直径

思路

就类似下图的链接方法。

在这里插入图片描述

这其中每一条边权都是 1 1 1

我们设以 2 2 2 为根的子树除去 2 2 2 a a a 个节点,以 3 3 3 为根的子树除去 3 3 3 b b b 个节点,以 4 4 4 为根的子树除去 4 4 4 c c c 个节点。

此时直径的数量就为 a ⋅ b + a ⋅ c + b ⋅ c a\cdot b+a\cdot c+b\cdot c ab+ac+bc

我们可以枚举 a , b a,b a,b ,看下有没有相应的 c c c 满足条件就可以了。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL k;
void out3(int a, int b, int c) {
    printf("%d\n", 4 + a + b + c);
    printf("1 2 1\n1 3 1\n1 4 1\n");
    for (int i = 5; i <= a + 4; i++)
        printf("2 %d 1\n", i);
    for (int i = a + 5; i <= a + 4 + b; i++)
        printf("3 %d 1\n", i);
    for (int i = a + b + 5; i <= a + 4 + b + c; i++)
        printf("4 %d 1\n", i);
}
int main() {
    // freopen("diameter.in", "r", stdin);
    // freopen("diameter.out", "w", stdout);
    scanf("%lld", &k);
    for (LL i = 1; i <= 5000; i++)
        for (LL j = 1; j <= 5000 - i; j++)
            if ((k - i * j) % (i + j) == 0 && (k - i * j) / (i + j) + j + i + 4 <= 5000) {
                out3(i, j, (k - i * j) / (i + j));
                return 0;
            }
    return 0;
}

T2 - 定价

思路

因为查询比较少,所以我们可以每次查询都做一次。

我们来看看如何做查询。

我们先将限制看为 0 0 0 1 1 1 0 0 0 代表只能选 0 0 0 1 1 1 代表 0 0 0 1 1 1 都能选。

我们可以从高位往低位枚举,因为我们已经知道上一个套装的选择方案了,于是我们分以下 4 4 4 类情况。

  • 如果上一位选了 1 1 1,这一位为 1 1 1,则这一位的一必须选。
  • 如果上一位选了 0 0 0,这一位为 1 1 1,则我们可以将这一位选上,更新当前套装的答案,但在再往低位枚举时就不用将这一位选上。
  • 如果上一位选了 1 1 1,这一位为 0 0 0,则我们直接退出当前套装的枚举。
  • 如果上一位选了 0 0 0,这一位为 0 0 0,则我们不用管他。

此时我们看看当前套装的答案有没有被更新过,如果没有,就说明没有一种方案满足要求,直接输出 − 1 -1 1 就好了。

因为这样做是 O ( n m ) O(nm) O(nm),我们来想想怎么优化。

因为只有为 1 1 1 的位才有贡献,所以我们可以用 set 来存每一位的限制,然后枚举时用双指针来做就可以了。

具体实现可以看代码。

注意 set 的细节,很容易越界导致gg。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MOD = 1e9 + 7;
int n, m, q;
LL ans, sum;
set <int> st[1005], last, now, s;
LL Pow(LL a, int b) {
    LL s = 1;
    while (b) {
        if (b & 1)
            s = s * a % MOD;
        a = a * a % MOD, b = b >> 1;
    }
    return s;
}
int main() {
    set <int>::const_iterator it, jt, lt;
    scanf("%d%d%d", &n, &m, &q);
    for (int qq = 1, op, r, c; qq <= q; qq++) {
        scanf("%d", &op);
        if (op == 1) {
            scanf("%d%d", &r, &c);
            if (st[r].count(m - c))
                st[r].erase(m - c);
            else
                st[r].insert(m - c);
        }
        else {
            last.clear();
            if (st[1].empty()) {
                printf("-1\n");
                continue;
            }
            last.insert(*st[1].begin());
            ans = Pow(2, *st[1].begin());
            //第一位特殊判断,直接使得第一位最小就可以了。
            for (int i = 2; i <= n; i++) {
                if (st[i].empty()) {//如果这一位没有任何1,直接为-1就可以了
                    ans = -1;
                    break;
                }
                jt = last.end(), jt--, it = st[i].upper_bound(*jt), sum = 0, s.clear(), now.clear();
                if (it == st[i].end())
                    it--;
                for (; ;) {
                    if (*jt == *it) {//上一个选了1,这一位为1
                        now.insert(*it);
                        if (it == st[i].begin())
                            break;
                        if (jt == last.begin()) {
                            s = now;
                            s.insert(*st[i].begin());
                            break;
                        }
                        jt--, it--;
                    }
                    else if (*jt > *it)//上一个选了1,这一位为0
                        break;
                    else {//上一个选了0,这一位为1
                        s = now;
                        s.insert(*it);
                        if (it == st[i].begin())
                            break;
                        it--;
                    }
                }
                if (s.empty())//如果答案没有被更新过
                    ans = -1;
                if (ans == -1)
                		break;
                last.clear();
                for (it = s.begin(); it != s.end(); it++)
                    sum = (sum + Pow(2, *it)) % MOD, last.insert(*it);
                (ans += sum) %= MOD;
            }
            printf("%lld\n", ans);
        }
    }
    return 0;
}

T3 - 排序

思路

我们可以将 c n t cnt cnt 次操作后能做完几个整轮,我们假设能做完 k k k 个整轮,则我们可以先将 k k k 个整轮之后的数组求出来,剩下的再暴力做。

我们来看看怎么求出 k k k 轮之后的数组。

我们先用一个优先队列存 k k k 个数,表示比当前的数小的前 k k k 个位置。

那我们做完 k k k 轮之后,当前数就会到这 k + 1 k+1 k+1 个位置中的最后一个位置。

原理比较难讲,自己理解一下应该可以。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int n, a[1000005], ans[1000005], tr[100000005], b[1000005];
LL cnt, m;
LL in() {
    LL s = 0;
    char ch = getchar();
    while (ch < '0' || ch > '9')
        ch = getchar();
    while (ch <= '9' && ch >= '0')
        s = s * 10 + ch - '0', ch = getchar();
    return s;
}
int main() {
    // freopen("sort.in", "r", stdin);
    // freopen("sort.out", "w", stdout);
    n = in(), m = cnt = in();
    for (int i = 1; i <= n; i++)
        a[i] = in(), b[a[i]] = i;
    priority_queue <int> q;
    int k = 1;
    while (m >= n - k)
        m = m - n + k, k++;
    k--;
    if (k) {
        for (int i = 1; i <= k; i++)
            q.push(b[i]);
        for (int i = k + 1; i <= n; i++) {
            if (q.top() > b[i])
                ans[q.top()] = i, q.pop(), q.push(b[i]);
            else
                ans[b[i]] = i;
        }
        for (int i = 1; i <= k; i++)
            ans[i] = i;
    }
    else
        for (int i = 1; i <= n; i++)
            ans[i] = a[i];
    // for (int i = 1; i <= n; i++)
    //     printf("%d ", ans[i]);
    // printf("\n");
    k++;
    for (int j = k + 1; m > 0 && j <= n; j++) {
        if (ans[j] < ans[k])
            swap(ans[j], ans[k]);
        m--;
    }
    for (int i = 1; i <= n; i++)
        printf("%d ", ans[i]);
    return 0;
}

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

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

相关文章

Day910.中台是什么 -SpringBoot与K8s云原生微服务实践

中台是什么 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于中台是什么的内容。 近几年针对软件开发领域&#xff0c;中台&#xff0c;这词相信大家都不会陌生。 中台&#xff08;Technology Middle Platform&#xff09;是一种基于技术架构和业务架构的中间层&…

制造业数字化转型难在哪儿?

工作岗位的原因&#xff0c;接触过很多制造业的CIO&#xff0c;也组建过几个制造业CIO的社群&#xff0c;当然也或参与或旁观过不少制造企业数字化转型的案例。 但这篇我不列举案例&#xff0c;分享一些经验和事实&#xff01; 为啥&#xff1f;我接下来说的话可能有点残酷&a…

目标跟踪中的卡尔曼滤波和匈牙利算法解读。

先解读Sort算法&#xff1a;Simple online and realtime tracking 论文地址 https://arxiv.org/abs/1602.00763 代码地址 https://github.com/abewley/sort https://github.com/YunYang1994/openwork/tree/master/sort SORT 流程简介&#xff1a; 整个流程如下图所示&#xf…

网络是怎么连接笔记(二)用电信号传输TCP/IP数据

文章目录介绍创建套接字连接服务器收发数据从服务器断开并删除套接字IP与以太网的包收发操作&#xff08;待更新&#xff09;UDP协议的收发操作&#xff08;待更新&#xff09;介绍 在了解了HTTP请求是如何产生的&#xff0c;以及网址是如何跳转到我们想要看到的页面&#xff…

普元ESO 逻辑流/页面流数据类型选择java--浏览转圈卡死

不知道什么时候开始的 前阵子在选择数据类型需要选择一个普元基本类型里没有的java类型的时候 它卡住了,虽然我对lj普元的容忍度较高,但是在等了五分钟以后还在那转我就忍不了了 在经历了重启eos 重启电脑 关闭所有软件运行eos后,最后忘了咋折腾的反正是整上这个类型了当时确…

Unity使用NatML的NatDevice功能调用外部摄像机

Unity使用NatML的NatDevice功能调用外部摄像机NatCamNatDevice广泛和轻量级在Unity中使用NatDevice导入NatDevice指定访问密钥运行摄像头预览示例测试结果NatCam 最开始在Unity中使用WebCamTexture获取外部摄像机的画面。后来发现WebCamTexture的功能过于简单&#xff0c;外部…

拥塞管理与拥塞避免

拥塞管理与拥塞避免背景来源产生情景队列技术FIFO&#xff1a;First In First OutRR&#xff1a;Round RobinWRR&#xff1a;Weight Round RobinPQ&#xff08;Priority Queuing&#xff09;CQ&#xff08;Custom Queuing&#xff09;WFQ&#xff08;Weight Fair Queuing&#…

入托不焦虑 | 如何帮宝宝更好地融入托班?

上托班是教育重要的一环&#xff0c;是宝宝开始适应集体过程的起点&#xff0c;宝爸宝妈也是忧喜交加&#xff1a;高兴的是宝宝慢慢长大开始上学了&#xff1b;忧虑的是从没有离开家的宝宝会不会适应托班生活呢&#xff1f; 今天我们就来分享一下如何引导宝宝更快地适应园区生…

【Unity】程序集Assembly模块化开发

笔者按&#xff1a;使用Unity版本为2021.3LTS&#xff0c;与其他版本或有异同。请仅做参考 一、简述。 本文是笔者在学习使用Unity引擎的过程中&#xff0c;产学研的一个笔记。由笔者根据官方文档Unity User Manual 2021.3 (LTS)/脚本/Unity 架构/脚本编译/程序集定义相关部分结…

【Spring6】IoC容器之基于注解管理Bean

3.3、基于注解管理Bean&#xff08;☆&#xff09; 从 Java 5 开始&#xff0c;Java 增加了对注解&#xff08;Annotation&#xff09;的支持&#xff0c;它是代码中的一种特殊标记&#xff0c;可以在编译、类加载和运行时被读取&#xff0c;执行相应的处理。开发人员可以通过…

Java基本数据类型变量自动提升、强制类型转换、String基本类型使用

文章目录基本数据类型变量自动提升特殊情况强制类型转换String基本类型使用基本数据类型变量自动提升 规则&#xff1a; 将取值范围小&#xff08;或容量小&#xff09;的类型自动提升为取值范围大&#xff08;或容量大&#xff09;的类型 。 byte、short、char-->int-->…

HCIP---回顾HCIA

HCIA回顾&#xff1a; 抽象语言---编码 编码---二进制 二进制---电信号 处理电信号 OSI参考模型----OSI/RM (Open System Interconnect-----开放式系统互连) 应用层&#xff1a;为终端用户提供网络服务接口 表示层&#xff1a;提供数据格式转换服务 会话层&#xff1a…

基于深度学习的鸟类检测识别系统(含UI界面,Python代码)

摘要&#xff1a;鸟类识别是深度学习和机器视觉领域的一个热门应用&#xff0c;本文详细介绍基于YOLOv5的鸟类检测识别系统&#xff0c;在介绍算法原理的同时&#xff0c;给出Python的实现代码以及PyQt的UI界面。在界面中可以选择各种鸟类图片、视频以及开启摄像头进行检测识别…

基于同步整流技术的Buck开关电源设计方法

基于同步整流技术的Buck开关电源设计方法 典型的Buck电路 同步整流的Buck电路 摘要 B u c k 变换器作为一种基本的开关电源变换器&#xff0c;在电力变换场合具有广泛的应用。 为解决 B u c k 变换器工作在电感电流连续状态下&#xff0c;续流二极管关断时存在较大的反向电流…

重资产模式和物流网络将推动京东第四季度利润率增长

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 强劲的2022年第三季度财务业绩 2022年11月18日&#xff0c;京东&#xff08;JD&#xff09;公布了2022年第三季度财务业绩&#xff0c;净收入为2435亿元人民币&#xff0c;增长了11.4%。净服务收入为465亿元人民币&#xf…

【C++知识点】异常处理

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;C/C知识点 &#x1f4e3;专栏定位&#xff1a;整理一下 C 相关的知识点&#xff0c;供大家学习参考~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;…

深度学习知识点全面总结_深度学习总结

深度学习知识点全面总结_深度学习总结 神经网络与深度学习结构(图片选自《神经网络与深度学习》一邱锡鹏) 目录 常见的分类算法 一、深度学习概念 1.深度学习定义 2.深度学习应用 3.深度学习主要术语 二、神经网络基础 1. 神经网络组成 感知机 多层感知机 3.前向传播…

【JS代码优化二】ES6 数组和对象篇

Vue3 Vite VueRouter Pinia Axios Element Plus 项目实战&#xff08;持续更新中…&#xff09; 序&#xff1a;如何让代码看起来更优雅&#xff1f;代码是由文字堆叠起来的可以被机器执行的程序。它记载着相关信息&#xff08;状态&#xff09;、表达相关的情绪&#xf…

vue中引入路径用法及说明

引入路径的用法及说明Vue文件中引用路径的介绍1、路径 ././当前文件同级目录2、路径 …/…/当前文件上一级目录3、符号 的作用是在你引入模块时&#xff0c;可以使用 代替 /src 目录&#xff0c;避免易错的相对路径。Vue中使用1. vue.config.js配置文件中使用chainWebpack(con…

Go语言学习的第三天--上部分(基础用法)

前两天经过不断度娘&#xff0c;与对up主的跟踪学习了解了go的历史&#xff0c;今天开始了go的基础&#xff01;&#xff01;本章主要是go 的注释、变量及常量的梳理一、注释不管什么语言都有自己的注释&#xff0c;go也不例外 &#xff01;&#xff01;单行注释 // 多行注释 …