2023牛客五一集训派对day2部分题解

D Duration

DDuration

题目大意

给你两个 AA:BB:CC 格式的时间,请你计算它们直接的时间插值(秒)

解题思路

模拟

代码示例

#include<bits/stdc++.h>
using namespace std;

int h, m, s;

int main(){
    scanf("%d:%d:%d", &h, &m, &s);
    int cnt_1 = h * 3600 + m * 60 + s;
    scanf("%d:%d:%d", &h, &m, &s);
    int cnt_2 = h * 3600 + m * 60 + s;
    cout << abs(cnt_1 - cnt_2) << '\n';
}

F Fake Maxpooling

FFake Maxpooling

题目大意

构造一个矩阵,每个位置的值是 lcm(i,j),请你计算每个 k * k 的子矩阵中最大值的总和

解题思路

目前看到了两种解法

解法一:

首先构造出来矩阵数组,为了维护子矩阵的最大值,我们可以利用两次单调队列维护矩阵最大值。一次维护所有行最大值,一次维护所有列最大值并更新此矩阵的最大值。

解法二:

打表找规律猜结论

发现最大值一般就在右下角的三个点 (k + i, k + j), (k + i - 1, k + j), (k + i, k + j - 1)

代码示例

解法一:

#include<bits/stdc++.h>
using namespace std;

const int N = 5010;
int n, m, k;
int a[N][N];
int mat[N][N];
deque<int> dq;

int gcd(int a, int b){
    return b == 0 ? a : gcd(b, a % b);
}

int lcm(int a, int b){
    return a * b / gcd(a, b);
}

int main(){
    cin >> n >> m >> k;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            mat[i][j] = lcm(i, j);
        }
    }
    // 维护第 i 行的最大值
    for(int i = 1; i <= n; i++){
        dq.clear();
        dq.push_back(0);
        for(int j = 1; j <= m; j++){
            if(j - dq.front() >= k) dq.pop_front();
            while(!dq.empty() && mat[i][j] >= mat[i][dq.back()]) dq.pop_back();
            dq.push_back(j);
            a[i][j] = mat[i][dq.front()];
        }
    }
    long long ans = 0;
    // 维护第 i 列的最大值 同时更新答案
    for(int j = k; j <= m; j++){
        dq.clear();
        dq.push_back(0);
        for(int i = 1; i <= n; i++){
            if(i - dq.front() >= k) dq.pop_front();
            while(!dq.empty() && a[i][j] >= a[dq.back()][j]) dq.pop_back();
            dq.push_back(i);
            if(i >= k) ans += a[dq.front()][j];
        }
    }
    cout << ans << '\n';
}

解法二:

#include<bits/stdc++.h>
using namespace std;

const int N = 5010;
int n, m, k;
int a[N][N];

int gcd(int a, int b){
    return b == 0 ? a : gcd(b, a % b);
}

int main(){
    cin >> n >> m >> k;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            if(k == 1) a[i][j] = i * j / gcd(i, j);
            else a[i][j] = max(i * j / gcd(i, j), max(a[i - 1][j], a[i][j - 1]));
        }
    }
    long long ans = 0;
    for(int i = k; i <= n; i++){
        for(int j = k; j <= m; j++){
            ans += a[i][j];
        }
    }
    cout << ans << '\n';
}

C Cover the tree

CCover the Tree

题目大意

给定一棵无根树,选择最少链数(至少一个)覆盖树中所有边。打印最小数量和一个解决方案。如果有多个解决方案,请打印其中任何一个。

解题思路

将树建成一个无向图,然后对度不为1的某个点进行深搜遍历,记录度为1的叶子节点的序号,如果叶子节点为奇数,那么在数组最后加上一个根节点的序号。然后将数组第一个点与后半部分的第一个节点配对,依次下去

首先设叶子节点个数为 s,那么答案就是 s / 2 向下取整

取任意一个非叶子节点作为根,然后求一个dfs序,并把所有叶子节点按dfs序排序,记为 l1, l2...ls 先假设 s 为偶数,那么构造的 s / 2 可以为 i -> s / 2 + i,能保证每条链都会被覆盖到

证明:

不妨设某条边的儿子节点所覆盖的叶子节点区间为 [L, R]

  • 如果 R <= s / 2,则这条边会被 l(R) -> l(s / 2 + R) 覆盖
  • 否则如果 L > s / 2,则这条边会被 l(L - s / 2) -> l(L) 覆盖
  • 否则因为根节点度数不为 1,所以 L ≠ 1,R ≠ s 中必有一个是满足的,如果 L ≠ 1 则这条边会被 l(1) -> l(s / 2 + 1) 覆盖。否则如果 R ≠ s 则这条边会被 l(s / 2) -> l(s) 覆盖 

如果 s 是奇数,只需要给根节点再接一个叶子节点,按照上述方法构造完后再把新加的这条边删去即可,代码实现可以跳过这一步

所以我们只要求一个dfs序,然后根据根左子树的叶子节点和根右子树的叶子节点逐一配对,如果叶子节点是奇数时,随便找个节点与其匹配就可以了

参考资料

Cover the Tree

代码示例

#include<bits/stdc++.h>
using namespace std;

const int N = 2e5 + 10;
int n;
int ans[N];
int tot;
int cnt;
int head[N];
int in[N];

struct edge{
    int to;
    int nxt;
}e[2 * N];

void add(int x, int y){
    tot++;
    e[tot].to = y;
    e[tot].nxt = head[x];
    head[x] = tot;
}

void dfs(int x, int f){
    if(in[x] == 1) ans[++cnt] = x;
    for(int i = head[x]; i; i = e[i].nxt){
        int y = e[i].to;
        if(y == f) continue;
        dfs(y, x);
    }
}

int main(){
    cin >> n;
    int x, y;
    for(int i = 1; i < n; i++){
        cin >> x >> y;
        in[x]++;
        in[y]++;
        add(x, y);
        add(y, x);
    }
    int root = 1;
    while(in[root] == 1) root++;
    dfs(root, -1);
    cout << (cnt + 1) / 2 << '\n';
    if(cnt & 1) ans[++cnt] = root;
    for(int i = 1; i <= (cnt + 1) / 2; i++) cout << ans[i] << " " << ans[i + (cnt + 1) / 2] << '\n';
}

B Boundary 

BBoundary

题目大意

给定二维平面上的 n 个点。考虑原点 (0,0) 在其边界上的所有圆,找出其边界上给定点最大的圆。打印最大点数。

解题思路

1 ≤ n ≤ 2000,所以可以暴力枚举两个点算出来圆心,然后用map统计个数,然后输出map最大值

代码示例

#include<bits/stdc++.h>
using namespace std;

const int N = 2010;
int ans;
int n;
map<pair<double, double>, int> mp;

struct point{
    double x;
    double y;
}p[N];

struct line{ // ax + by + c = 0
    double a;
    double b;
    double c;
};

void solve(point o, point a, point b){
    line OA = line{a.x, a.y, -(a.x * a.x + a.y * a.y) / 2.0}; // OA 中垂线
    line OB = line{b.x, b.y, -(b.x * b.x + b.y * b.y) / 2.0}; // OB 中垂线
    double x = (OA.b * OB.c - OA.c * OB.b) / (OA.a * OB.b - OA.b * OB.a);
    double y = (OA.a * OB.c - OA.c * OB.a) / (OA.a * OB.b - OA.b * OB.a);
    ans = max(ans, ++mp[make_pair(x, y)]);
}

int main(){
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> p[i].x >> p[i].y;
    for(int i = 1; i < n; i++){
        mp.clear();
        for(int j = i + 1; j <= n; j++){
            if(p[i].x * p[j].y == p[i].y * p[j].x) continue;
            solve(point{0,0}, p[i], p[j]);
        }
    }
    cout << ans + 1 << '\n';
}

G Greater and Greater

GGreater and Greater

题目大意

给一个长度为 n 的数组 a,和长度为 m 的字符串 b,求 a 有多少个长度与 b 串相等的子串,使每个位置大于 b 串的对应位置。

解题思路

代码示例

A All with Pairs

AAll with Pairs

题目大意

解题思路

代码示例

J Just Shuffle

JJust Shuffle

题目大意

前缀知识

首先我们要了解一个重要概念 - 置换

非空有限集A到A本身的一个可逆映射称为A的一个置换

假设我们有一个含有 n 个元素的集合可以写为

{a1, a2, ..., an}

则其置换表达式为

\begin{bmatrix} a1&a2 &... &an \\ P(a1)&P(a2) &... &P(an) \end{bmatrix}

注意这里 P(x) 是一个到自己的可逆映射,所以 P(ai) 其实就是 ai 的一种排列顺序

这里我们再扩展一点

置换比较重要的性质

如果 P(1), P(2), ..., P(n) 中存在两个数,较大的数排在较小的数之前,那么这两个数就构成了一个反序。反序的个数称为反序数。如果反序数是奇数,这个置换就是一个奇置换,如果反序数是偶数,这个置换就是一个偶置换

参考资料

抽象代数学习笔记(4)置换

题目

给你一个大小为 n 的数组 B, 是数组 A 的 k 次置换后的结果,请你求出原数组。k 保证是质数

解题思路

通过题目我们可以推出 A^{k} = B,等式两边同时乘 t 次幂,变成 A^{k + t} = B^{t},此时如果 t 为 k 的逆元时,上述式子就变成了 A = B^{t},所以求出每个环的大小并且每个让K取逆(欧几里得算法),分别求出逆的大小后环里一循环就可以了。

参考资料

环+逆——牛客多校赛第二场J题

代码示例

#include<bits/stdc++.h>
using namespace std;

#define int long long

const int N = 1e5 + 10;
int n, k;
int num;
int a[N];
int vis[N];
int change[N];

void exgcd(int a, int b, int &x, int &y){ // 扩展欧几里得算法
    if(!b){
        x = 1;
        y = 0;
        return;
    }
    exgcd(b, a % b, y, x);
    y -= a / b * x;
}

signed main(){
    cin >> n >> k;
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int i = 1; i <= n; i++){
        if(!vis[i]){
            vis[i] = 1;
            int tmp = a[i];
            num = 0;
            change[num++] = i;
            while(tmp != i){
                vis[tmp] = 1;
                change[num++] = tmp;
                tmp = a[tmp];
            }
            int x, y, t;
            exgcd(k % num, num, x, y);
            x = (x + num) % num;
            for(int i = 0; i < num; i++) a[change[i]] = change[(i + x) % num];
        }
    }
    for(int i = 1; i <= n; i++) cout << a[i] << " ";
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跨域问题解决方案

什么是跨域问题 跨域问题本质上是由浏览器的同源策略造成的&#xff0c;是浏览器对javascript施加的安全限制。 它指的服务A对服务B发起请求时&#xff0c;如果传输协议&#xff08;http、https&#xff09;、ip 地址&#xff08;域名&#xff09;、端口号有任意一个不同&…

一键轻松拥有自己专属的 ChatGPT 网页版,搭建一个私人的可随时随地访问的ChatGPT网站

前言 ChatGPT是一种基于Transformer架构的自然语言处理模型&#xff0c;由OpenAI开发。GPT是“Generative Pre-trained Transformer”的缩写&#xff0c;意为“预训练生成式Transformer模型”。 ChatGPT模型是一种无监督学习模型&#xff0c;它可以在大规模文本数据上进行预训…

『Linux』第九讲:Linux多线程详解(二)_ 线程控制

「前言」文章是关于Linux多线程方面的知识&#xff0c;上一篇是 Linux多线程详解&#xff08;一&#xff09;&#xff0c;今天这篇是 Linux多线程详解&#xff08;二&#xff09;&#xff0c;讲解会比较细&#xff0c;下面开始&#xff01; 「归属专栏」Linux系统编程 「笔者」…

【2023华中杯数学建模】B 题 小学数学应用题相似性度量及难度评估详细建模方案及实现代码

更新时间&#xff1a;2023-5-1 14:00 1 题目 B 题 小学数学应用题相似性度量及难度评估 某 MOOC 在线教育平台希望能够进行个性化教学&#xff0c;实现用户自主学习。在用户学习时&#xff0c;系统从题库中随机抽取若干道与例题同步的随堂测试题&#xff0c;记录、分析学生的学…

【常用算法】进制转换

目录 1. 二进制数、八进制数、十六进制数转换为十进制数 2. 十进制数转换为二进制数、八进制数、十六进制数 3. 二进制数和十六进制数的相互转换 4. 使用电脑计算器进行进制转换 1. 二进制数、八进制数、十六进制数转换为十进制数 十进制数的每一位都是10的指数幂。如&…

Python 中如何实现自动导入缺失的库?

在编写 Python 项目的时候&#xff0c;我们经常会遇到导入模块失败的错误&#xff1a; ImportError: No module named xxx或者ModuleNotFoundError: No module named xxx 导入失败&#xff0c;通常分为两种&#xff1a;一种是导入自己写的模块&#xff08;即以 .py 为后缀的文件…

每天一道算法练习题--Day17 第一章 --算法专题 --- ----------布隆过滤器

场景 假设你现在要处理这样一个问题&#xff0c;你有一个网站并且拥有很多访客&#xff0c;每当有用户访问时&#xff0c;你想知道这个 ip 是不是第一次访问你的网站。 hashtable 可以么 一个显而易见的答案是将所有的 IP 用 hashtable 存起来&#xff0c;每次访问都去 hash…

微软开源AI修图工具让老照片重现生机

GitHub - microsoft/Bringing-Old-Photos-Back-to-Life: Bringing Old Photo Back to Life (CVPR 2020 oral) 支持划痕修复&#xff0c;以及模型训练。 Old Photo Restoration (Official PyTorch Implementation) Project Page | Paper (CVPR version) | Paper (Journal vers…

Mysql第二章 多表查询的操作

这里写自定义目录标题 一 外连接与内连接的概念sql99语法实现 默认是内连接sql99语法实现左外连接&#xff0c;把没有部门的员工也查出来sql99语法实现右外连接&#xff0c;把没有人的部门查出来sql99语法实现满外连接&#xff0c;mysql不支持这样写mysql中如果要实现满外连接的…

【Java数据结构】——第九节.向上建堆和向下建堆的区别

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;Java初阶数据结构 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目…

Android jetpack Compose之约束布局

概述 我们都知道ConstraintLayout在构建嵌套层级复杂的视图界面时可以有效降低视图树的高度&#xff0c;使视图树扁平化&#xff0c;约束布局在测量布局耗时上比传统的相对布局具有更好的性能&#xff0c;并且约束布局可以根据百分比自适应各种尺寸的终端设备。因为约束布局确…

下载——安装——使用FinalShell

下载——安装——使用FinalShell FinalShell简介&#xff1a;下载&#xff1a;使用&#xff1a; FinalShell简介&#xff1a; FinalShell是一款免费的国产的集SSH工具、服务器管理、远程桌面加速的软件&#xff0c;同时支持Windows&#xff0c;macOS&#xff0c;Linux&#xf…

No.050<软考>《(高项)备考大全》【冲刺4】《软考之 119个工具 (2)》

《软考之 119个工具 &#xff08;2&#xff09;》 21.检查:22.偏差分析:23.滚动式规划:24.紧前关系绘图法(PDM):25.确定依赖关系:26.时间提前量与滞后量:28.发布的估算数据:29.自下而上估算:30.项目管理软件:31.储备分析:32.类比估算:33.参数估算:34.三点估算:35.进度网络分析:…

JS实现拼音(字母)匹配(搜索)汉字(姓名)

这就是个模糊查询&#xff0c;我们平常做的都是直接输入汉字去把对应的值过滤出来&#xff0c;但我还真是第一次通过拼音去查询&#xff08;当然不只是拼音&#xff0c;汉字也是可以的&#xff09;&#xff0c;以前还真没注意这个。唉&#xff0c;这可咋搞&#xff0c;我怎么知…

使用Statsmodel进行假设检验和线性回归

如果你使用 Python 处理数据&#xff0c;你可能听说过 statsmodel 库。Statsmodels 是一个 Python 模块&#xff0c;它提供各种统计模型和函数来探索、分析和可视化数据。该库广泛用于学术研究、金融和数据科学。在本文中&#xff0c;我们将介绍 statsmodel 库的基础知识、如何…

(七)ArcCatalog应用基础——图层操作与数据输出

&#xff08;七&#xff09;ArcCatalog应用基础——图层操作与数据输出 目录 &#xff08;七&#xff09;ArcCatalog应用基础——图层操作与数据输出 1.地图与图层操作1.1创建图层1.2设置文件特征1.3保存独立的图层文件 2.地理数据输出2.1输出为Shapefile2.2输出为Coverage2.3属…

笔记本电脑没有声音了怎么恢复

笔记本电脑 在使用的过程中&#xff0c;突然没有声音的话&#xff0c;对于人们来说会很麻烦。那么笔记本电脑没有声音了怎么恢复呢?下面小编为大家整理了笔记本电脑没有声音的恢复方法&#xff0c;一起来看看吧。 方法/步骤&#xff1a; 方法一&#xff1a;网络适配器检查音频…

UE5实现建筑剖切效果

文章目录 1.实现目标2.实现过程2.1 材质参数集2.2 材质遮罩函数2.3 更新Box3.参考资料1.实现目标 基于BoxMask材质节点,在UE5中实现建筑物的剖切效果,GIF动图如下: 2.实现过程 实现原理与之前“BoxMask实现建筑生长效果”的原理相同,都是基于BoxMask材质节点实现。 具体实…

操作系统之内存管理

连续分配 一、单一连续 直接为要运行的进程分配一个内存&#xff0c;只适合单任务&#xff0c;只能用于单对象、单任务&#xff0c;内存被分配为系统区和用户区&#xff0c;系统区在低地址&#xff0c;用户区是一个用户独享 二、等分分区 由于分配一个内存只能执行单任务&a…

MongoDB【常用命令】

目录 1&#xff1a;基本常用命令 1.1&#xff1a;演示案例 1.2&#xff1a;数据库操作 1.2.1&#xff1a;选择和创建数据库&#xff0c;查看当前正在使用的数据库命令 1.2.2&#xff1a;数据库的删除 1.3&#xff1a;集合操作 1.3.1&#xff1a;集合的显式创建&#xff0…