AtCoder Beginner Contest 403

news2025/5/15 8:47:43

再来一场atCoder,这一场简直血虐,让你回忆起了审题的重要性

A - Odd Position Sum 

思路:题意很简单,求一个数组奇数位上数字和。很简单的问题,但你如果不仔细审题,就会浪费大量的时间

/*
Author Owen_Q
*/
#include <bits/stdc++.h>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false), cin.tie(nullptr);
    int n;
    cin >> n;
    int oddSum = 0;
    for (int i = 0; i < n; i++) {
        int a;
        cin >> a;
        if (i % 2 == 0) {
            oddSum += a;
        }
    }
    cout << oddSum << '\n';

    return 0;
}

B - Four Hidden 

思路:第二题,简单的字符串子串题,暴力匹配一下即可

/*
Author Owen_Q
*/
#include <bits/stdc++.h>

using namespace std;

bool streamContains(string t, string u, int startT) {
    bool yes = true;
    int uLen = int(u.size());
    for (int i = 0; yes && i < uLen; i++) {
        if (u[i] != t[i + startT] && t[i + startT] != '?') {
            yes = false;;
        }
    }
    return yes;
}

int main() {
    ios_base::sync_with_stdio(false), cin.tie(nullptr);
    string t, u;
    cin >> t >> u;
    int tLen = int(t.size());
    int uLen = int(u.size());
    for (int i = 0; i + uLen <= tLen; i++) {
        if (streamContains(t, u, i)) {
            cout << "Yes" << '\n';
            return 0;
        }
    }
    cout << "No" << '\n';
    return 0;
}

C - 403 Forbidden 

思路:又是熟悉的模拟,与上次的模拟登录类似,这次换成了模拟授权。没什么难度,但却因为没读清题目,要求输出Yes/No,结果输出了YES/NO,导致了三次无意义的WA,实属可惜

/*
Author Owen_Q
*/
#include <bits/stdc++.h>

using namespace std;

const int N = 2e5 + 5;

set<int> g[N];
bool all[N];

int main() {
    ios_base::sync_with_stdio(false), cin.tie(nullptr);
    int n, m, q;
    cin >> n >> m >> q;
    while (q--) {
        int o, x, y;
        cin >> o;
        if (o == 1) {
            cin >> x >> y;
            g[x].insert(y);
        } else if (o == 2) {
            cin >> x;
            all[x] = true;
        } else {
            cin >> x >> y;
            if (all[x] || g[x].contains(y)) {
                cout << "Yes" << endl;
            } else {
                cout << "No" << endl;
            }
        }
    }
    return 0;
}

D - Forbidden Difference 

思路:给定一个数组a(2e5的数据量,最大值为1e6)和一个特定的数d,要求删除最少得数量是的数组内所有数的距离都不为d

题意倒是很简单,首先想到的将距离为d的数通过并查集连接,再通过遍历每一个连通集,进行间隔删除,最后找出最小的删除方案。

第一次提交出现了部分re,显然,并查集记得初始化,这个也算是一个坑点了

注意特判一下d为0的场景

发现问题了间隔删除并非是最优策略,看来还是要用dp来做。

最后整理一下,其实并查集的主要就是为了优化连通集,但是这题的数组最大值只有1e6,因此可以直接用计数数组而放弃并查集优化,这样会使代码简洁一些。

整体的dp方案,当然是根据数组内的值是否去除来进行转移。由于要去除最小值,我们完全可以转换为保留的最大值进行转移,最终用总和进行相减即可。

不难发现,连通数组的数量最大即为特定间隔数 d,于是遍历每一个连通集,将每个连通数组中的dp最大值进行求和,即为最终要保留的最大值。

那么dp转移方程就出来了,假设当前要判断的数为k,当前数总计出现了 cnt[k] 次

那么 dp[k][1] 表示当前数要保留,那面,前一个数一定不能保留,于是 dp[k][1] = dp[k-d][0] + cnt[k]

而 dp[k][0] 表示当前数要去除,则前一个数保留与否均可,取个最大值即可,即 dp[k][0] = max(dp[k-d][0],dp[k-d][1])

接下来看一下代码,我将原始求解写在了 first_pass_function() 函数中,将整理后的简易方法写在了 main() 函数中

/*
Author Owen_Q
*/
#include <bits/stdc++.h>

using namespace std;

const int N = 2e5 + 5;
const int M = 1e6 + 1;

int a[N];
int pre[M];
bool in[M];
int cnt[M];
set<int> col[M];
set<int> colSet;
// bool re[N];
int dp[M][2];



int findX(int x) {
    if (pre[x] == x) {
        return x;
    }
    return pre[x] = findX(pre[x]);
}

void unionXY(int x, int y) {
    int preX = findX(x);
    int preY = findX(y);
    if (preX > preY) {
        pre[x] = preY;
    } else if (preX < preY) {
        pre[y] = preX;
    }
}

int first_pass_function() {
    ios_base::sync_with_stdio(false), cin.tie(nullptr);
    int n, d;
    cin >> n >> d;
    int rere = 0;
    // 初始化
    for (int i = 0; i < M; i++) {
        pre[i] = i;
        in[i] = false;
        cnt[i] = 0;
        col[i].clear();
    }
    colSet.clear();
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        cnt[a[i]]++;
        in[a[i]] = true;
        if (cnt[a[i]] == 1) {
            if (a[i] - d >= 0 && in[a[i] - d]) {
                unionXY(a[i], a[i] - d);
            }
            if (a[i] + d < M && in[a[i] + d]) {
                unionXY(a[i], a[i] + d);
            }
        }
    }
    for (int i = 1; i <= n; i++) {
        int preA = findX(a[i]);
        col[preA].insert(a[i]);
        colSet.insert(preA);
    }
    for (auto colSetIt = colSet.begin(); colSetIt != colSet.end(); ++colSetIt) {
        int curPre = *colSetIt;
        int colSize = col[curPre].size();
        int colCnt = 0;
        // bool colStart = true;
        int colStartCnt = 0;
        memset(dp, 0, sizeof(dp));
        int nowPos = 1;
        for (auto colPreIt = col[curPre].begin(); colPreIt != col[curPre].end(); ++colPreIt) {
            int now = *colPreIt;
            // cout << now << "**" << endl;
            // 以下为间隔删除,该方法不正确,更换为dp
            // if (colStart) {
            //     colStart = false;
            // } else {
            //     colStart = true;
            // }
            // if (colStart) {
            //     colStartCnt += cnt[now];
            // }
            colCnt += cnt[now];

            dp[nowPos][1] = dp[nowPos-1][0] + cnt[now];
            dp[nowPos][0] = max(dp[nowPos-1][0], dp[nowPos-1][1]);
            nowPos ++;
        }
        colStartCnt = max(dp[colSize][0], dp[colSize][1]);
        // cout << colCnt << "*"  << colStartCnt <<  "\n";
        // 特判逻辑
        if (d == 0) {
            rere += colCnt - 1;
        } else if (colStartCnt > colCnt / 2) {
            rere += colCnt - colStartCnt;
            // colStart = true;
        } else {
            rere += colStartCnt;
            // colStart = false;
        }
        // cout << rere << "***" << endl;
        // colStartPre = -1;
        // for (auto colPreIt = col[curPre].begin(); colPreIt != col[curPre].end(); ++colPreIt) {
        //     int now = *colPreIt;
        //     if (now != colStartPre) {
        //         colStartPre = now;
        //         if (colStart) {
        //             colStart = false;
        //         } else {
        //             colStart = true;
        //         }
        //     }
        //     if (colStart) {
        //         re[now] = true;
        //     }
        // }
    }
    // int reDelCnt = 0;
    // for (int i = 1; i <= n; i++) {
    //     if (!re[a[i]]) {
    //        reDelCnt++;
    //     }
    // }

    cout << rere << endl;
    return 0;
}

int main() {
    ios_base::sync_with_stdio(false), cin.tie(nullptr);
    int n, d;
    cin >> n >> d;
    // 初始化
    memset(cnt, 0, sizeof(cnt));
    // memset(dp, 0, sizeof(dp));
    int difCnt = 0;
    int maxA = 0;
    for (int i = 1; i <= n; i++) {
        int A;
        cin >> A;
        cnt[A]++;
        if (cnt[A] == 1) {
            difCnt++;
            maxA = max(maxA, A);
        }
    }
    if (d == 0) {
        cout << n - difCnt << endl;
    } else {
        int maxRe = 0;
        for (int i = 0; i < d; i++) {
            // 第一轮dp初始化
            dp[i][1] = cnt[i];
            dp[i][0] = 0;
            int curRe = cnt[i];
            for (int j = i+d; j <= maxA; j+=d) {
                // 后续dp转移
                dp[j][1] = dp[j-d][0] + cnt[j];
                dp[j][0] = curRe;
                curRe = max(dp[j][0], dp[j][1]);
            }
            maxRe += curRe;
        }
        cout << n - maxRe << endl;
    }
}

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

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

相关文章

关于 Golang GC 机制的一些细节:什么是根对象?GC 机制的触发时机?

文章目录 关于 Golang GC 机制的一些细节&#xff1a;什么是根对象&#xff1f;GC 机制的触发时机&#xff1f;简要回顾 Golang GC 三色标记法的工作流程什么是根对象&#xff1f;GC 的触发时机&#xff1f; 关于 Golang GC 机制的一些细节&#xff1a;什么是根对象&#xff1f…

Python笔记:c++内嵌python,c++主窗口如何传递给脚本中的QDialog,使用的是pybind11

1. 问题描述 用的是python 3.8.20, qt版本使用的是5.15.2, PySide的版本是5.15.2, pybind11的版本为2.13.6 网上说在python脚本中直接用PySide2自带的QWinWidget&#xff0c;如from PySide2.QtWinExtras import QWinWidget&#xff0c;但我用的版本中说没有QWinWidget&#x…

C++效率掌握之STL库:map set底层剖析及迭代器万字详解

文章目录 1.map、set的基本结构2.map、set模拟实现2.1 初步定义2.2 仿函数实现2.3 Find功能实现2.4 迭代器初步功能实现2.4.1 运算符重载2.4.2 --运算符重载2.4.3 *运算符重载2.4.4 ->运算符重载2.4.5 !运算符重载2.4.6 begin()2.4.7 end() 2.5 迭代器进阶功能实现2.5.1 set…

新三消示例项目《Gem Hunter》中的光照和视觉效果

《Gem Hunter》是 Unity 的全新官方示例项目&#xff0c;展示了如何在 Unity 2022 LTS 使用通用渲染管线 (URP) 打造抢眼的光效和视效&#xff0c;让 2D 益智/三消游戏在竞争中脱颖而出。 下载示例项目及其说明文档。准备潜入清澈湛蓝的海水中探寻财富吧&#xff0c;因为那里到…

单向循环链表C语言实现实现(全)

#include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FASLE 0//定义宏标识判断是否成功 typedef struct Node {int data;struct Node* next; }Node;Node* InitList() {Node* list (Node*)malloc(sizeof(Node));list->data 0;//创建节点保存datalist…

【AI大模型】赋能【传统业务】

在数字化转型的浪潮下&#xff0c;传统业务流程&#xff08;如通知公告管理、文档处理等&#xff09;仍依赖人工操作&#xff0c;面临效率低、成本高、易出错等问题。以企业通知公告为例&#xff0c;从内容撰写、摘要提炼到信息分发&#xff0c;需耗费大量人力与时间&#xff0…

团结引擎开源车模 Sample 发布:光照渲染优化 动态交互全面体验升级

光照、材质与交互效果的精细控制&#xff0c;通常意味着复杂的技术挑战&#xff0c;但借助 Shader Graph 14.1.0(已内置在团结引擎官方 1.5.0 版本中)&#xff0c;这一切都变得简单易用。通过最新团结引擎官方车模 Sample&#xff0c;开发者能切身感受到全新光照优化与编辑功能…

精准测量“双雄会”:品致与麦科信光隔离探头谁更胜一筹

在电子技术飞速发展的当下&#xff0c;每一次精准测量都如同为科技大厦添砖加瓦。光隔离探头作为测量领域的关键角色&#xff0c;能有效隔绝电气干扰&#xff0c;保障测量安全与精准。在众多品牌中&#xff0c;PINTECH品致与麦科信的光隔离探头脱颖而出&#xff0c;成为工程师们…

NSSCTF [HNCTF 2022 WEEK4]

题解前的吐槽&#xff1a;紧拖慢拖还是在前段时间开始学了堆的UAF(虽然栈还没学明白&#xff0c;都好难[擦汗])&#xff0c;一直觉得学的懵懵懂懂&#xff0c;不太敢发题解&#xff0c;这题算是入堆题后一段时间的学习成果&#xff0c;有什么问题各位师傅可以提出来&#xff0c…

tornado_登录页面(案例)

目录 1.基础知识​编辑 2.脚手架&#xff08;模版&#xff09; 3.登录流程图&#xff08;processon&#xff09; 4.登录表单 4.1后&#xff08;返回值&#xff09;任何值&#xff1a;username/password &#xff08;4.1.1&#xff09;app.py &#xff08;4.1.2&#xff…

YOLOv12模型部署(保姆级)

一、下载YOLOv12源码 1.通过网盘分享的文件&#xff1a;YOLOv12 链接: https://pan.baidu.com/s/12-DEbWx1Gu7dC-ehIIaKtQ 提取码: sgqy &#xff08;网盘下载&#xff09; 2.进入github克隆YOLOv12源码包 二、安装Anaconda/pycharm 点击获取官网链接(anaconda) 点击获取…

BGP实验练习1

需求&#xff1a; 要求五台路由器的环回地址均可以相互访问 需求分析&#xff1a; 1.图中存在五个路由器 AR1、AR2、AR3、AR4、AR5&#xff0c;分属不同自治系统&#xff08;AS&#xff09;&#xff0c;AR1 在 AS 100&#xff0c;AR2 - AR4 在 AS 200&#xff0c;AR5 在 AS …

HTML、CSS 和 JavaScript 基础知识点

HTML、CSS 和 JavaScript 基础知识点 一、HTML 基础 1. HTML 文档结构 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.…

数据结构与算法分析实验12 实现二叉查找树

实现二叉查找树 1、二叉查找树介绍2.上机要求3.上机环境4.程序清单(写明运行结果及结果分析)4.1 程序清单4.1.1 头文件 TreeMap.h 内容如下&#xff1a;4.1.2 实现文件 TreeMap.cpp 文件内容如下&#xff1a;4.1.3 源文件 main.cpp 文件内容如下&#xff1a; 4.2 实现展效果示5…

使用 Semantic Kernel 调用 Qwen-VL 多模态模型

使用 Semantic Kernel 调用 Qwen-VL 多模态模型 一、引言 随着人工智能技术的不断发展&#xff0c;多模态模型逐渐成为研究的热点。Qwen-VL 是阿里云推出的大规模视觉语言模型&#xff0c;支持图像、文本等多种输入形式&#xff0c;并能够进行图像描述、视觉问答等多种任务。…

(4)python开发经验

文章目录 1 使用ctypes库调用2 使用pybind11 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt开发 &#x1f448;&#x1f449;python开发 &#x1f448; 1 使用ctypes库调用 说明&#xff1a;ctypes是一个Python内置的库&#xff0c;可以提供C兼容的数据类型…

深度剖析 GpuGeek 实例:GpuGeek/Qwen3-32B 模型 API 调用实践与性能测试洞察

深度剖析 GpuGeek 实例&#xff1a;GpuGeek/Qwen3-32B 模型 API 调用实践与性能测试洞察 前言 GpuGeek专注于人工智能与高性能计算领域的云计算平台&#xff0c;致力于为开发者、科研机构及企业提供灵活、高效、低成本的GPU算力资源。平台通过整合全球分布式数据中心资源&#…

MindSpore框架学习项目-ResNet药物分类-数据增强

目录 1.数据增强 1.1设置运行环境 1.1.1数据预处理 数据预处理代码解析 1.1.2数据集划分 数据集划分代码说明 1.2数据增强 1.2.1创建带标签的可迭代对象 1.2.2数据预处理与格式化&#xff08;ms的data格式&#xff09; 从原始图像数据到 MindSpore 可训练 / 评估的数…

【MySQL】别名设置与使用

个人主页&#xff1a;Guiat 归属专栏&#xff1a;MySQL 文章目录 1. 别名基础概念2. 列别名设置2.1 基础语法2.2 特殊字符处理2.3 计算字段示例 3. 表别名应用3.1 基础表别名3.2 自连接场景 4. 高级别名技术4.1 子查询别名4.2 CTE别名 5. 别名执行规则5.1 作用域限制5.2 错误用…

【内网渗透】——S4u2扩展协议提权以及KDC欺骗提权

【内网渗透】——S4u2扩展协议提权以及KDC欺骗提权 文章目录 【内网渗透】——S4u2扩展协议提权以及KDC欺骗提权[toc]一&#xff1a;Kerberos 委派攻击原理之 S4U2利用1.1原理1.2两种扩展协议**S4U2Self (Service for User to Self)****S4U2Proxy (Service for User to Proxy)*…