当前位置: 首页 > news >正文

牛客周赛 Round 77 题解

文章目录

    • A-时间表
    • B-数独数组
    • D-隐匿社交网络
    • E-1or0

A-时间表

签到题

#include <bits/stdc++.h>
using namespace std;int main()
{int a[6] = {20250121,20250123,20250126,20250206,20250208,20250211};int n; cin >> n;cout << a[n - 1];return 0;
}

B-数独数组

想法:1~9每个数字的个数都在 [ n / 9 , ( n + 8 ) / 9 ] [n / 9, (n + 8) /9] [n/9,(n+8)/9]这个区间范围内,因为满足这个条件,通过排序肯定可以生成一个数独数组。

#include <bits/stdc++.h>
using namespace std;const int N = 1e5 + 10;int a[10];int main()
{int n; cin >> n;for(int i = 0; i < n; i ++ ){int x; cin >> x;a[x] ++;}for(int i = 1; i <= 9; i ++ )if(a[i] < n / 9 || a[i] > (n + 8) / 9){cout << "NO";return 0;}cout << "YES";return 0;
}

C-小红走网格

想法:a, b, c, d分别表示上下左右四个方向的移动距离,目标是从(0, 0)到(x, y),我们可以把他们抽象到两个方程去求解,分别是 k 1 ∗ a + k 2 ∗ b = y k1*a + k2*b=y k1a+k2b=y k 3 ∗ c + k 4 ∗ d = x k3*c+k4*d=x k3c+k4d=x,这就是线性同余算法,也就是若y可以被a和b的最大公约数整除,那么y就一定通过a和b两个数字构造出来,x也是同理。

#include <bits/stdc++.h>
using namespace std;const int N = 1e5 + 10;int x, y, a[4];void solve(){cin >> x >> y;for(int i = 0; i < 4; i ++ )cin >> a[i];int g1 = __gcd(a[0], a[1]), g3 = __gcd(a[2], a[3]);if(x % g3 == 0 && y % g1 == 0)cout << "YES";else cout << "NO";cout << endl;return ;
}int main()
{int _; cin >> _;while(_ --){solve();}return 0;
}

D-隐匿社交网络

想法:将每个表示权重的数看成二进制表示形式,如果i和j在同一个社交网络即 ( w i and ⁡ w j ) ≧ 1 (w_i \operatorname{and} w_j) \geqq 1 (wiandwj)1,那么这个权重一定在二进制的某一个位上有着相同的1(与运算全1出1,有0出0),因此可以使用并查集来维护这个有着二进制位同为1的集合,就是如果这个两个数可以在同一个社交网络,那么这个两个数所在的两个集合也可在同一个社交网络。

#include <bits/stdc++.h>
#define ll long long
using namespace std;const int N =  100100;ll n, w[N], p[N];int find(ll x){if(p[x] != x)return p[x] = find(p[x]);return x;
}void solve(){cin >> n;for(int i = 0; i <= n + 64; i ++ ) p[i] = i;for(int i = 1; i <= n; i ++ ){cin >> w[i];for(int j = 0; j <= 61; j ++ )if(w[i] >> j & 1){int wf = find(i);int jf = find(n + j + 1);if(wf != jf)p[wf] = jf;}}map<int, int> cnt;int ans = 0;for(int i = 1; i <= n; i ++ ){int f = find(p[i]);cnt[f] ++;ans = max(ans, cnt[f]);}cout << ans << endl;return ;
}int main(){int _;cin >> _;while(_ -- ){solve();}return 0;
}

E-1or0

核心思路:区间 [ l , r ] [l, r] [l,r],用子串的总个数 - 连续都是0的子串个数。

想法:首先或运算的性质是有1出1,全0出0。我们假设字符串为0010010,子串的自审值为0的情况只有一种可能,那就是这个子串全是0,故此我们可以用【核心思路】来快速求自审值的和,因为自审值只可能是0或1,所以有字符1的子串的个数即为答案。

快速计算连续都是0的子串个数的方法有两种:

  • 线段树,维护四个值分别是:0子串的个数(sum), 前缀0的个数(left), 后缀0的个数(right), 当前区间的长度(len)。合并区间时会有四种情况。
    1. 左:0011, 右:1100,正常情况
    2. 左:0000, 右:0100,left, sum要特殊处理
    3. 左:0010, 右:0000,right, sum要特殊处理
    4. 左:0010: 右:0100,sum要特殊处理
  • 前缀和, 例如00110010011000这是要求的区间,原字符串为00000110010011000000,要注意前缀0和后缀0的处理,去除前缀0和后缀0的中间部分,可以用前缀和来直接计算。
// 线段树解法
#include <bits/stdc++.h>
#define int long long
using namespace std;const int N =  200010;int n, q;
string s;struct Info{int l, r;int sum, left, right, len;
}tr[4*N];void merge(Info& res, Info l, Info r){
//     res.l = l.l; res.r = r.r;res.sum = l.sum + r.sum + l.right * r.left;res.len = l.len + r.len;res.left = l.left;res.right = r.right;if(l.left == l.len) res.left += r.left;if(r.right == r.len) res.right += l.right;
}// 合并操作
void pushUp(int u)
{merge(tr[u], tr[u << 1], tr[u << 1 | 1]);
}// 线段树初始化
void build(int u, int l, int r)
{tr[u].l=l, tr[u].r=r, tr[u].len = 1;if(l==r) return ;int mid=l+r>>1;build(u<<1, l, mid); build(u<<1|1, mid+1, r);
}// 查询
Info query(int u, int l, int r)
{if(tr[u].l>=l&&tr[u].r<=r) return tr[u];int mid=tr[u].l+tr[u].r>>1;Info lson, rson;lson = rson = {0, 0, 0, 0, 0, 0};if(l <= mid){lson = query(u << 1, l, r);}if(r > mid){rson = query(u << 1 | 1, l, r);}Info res;merge(res, lson, rson);res.l = lson.l; res.r = rson.r;if(lson.l == 0) res.l = rson.l;if(rson.r == 0) res.r = lson.r;return res;
}// 修改
void modify(int u, int x, int v)
{if(tr[u].l==x&&tr[u].r==x) tr[u].sum=v, tr[u].left = v, tr[u].right = v;else{int mid=tr[u].l+tr[u].r>>1;if(x<=mid) modify(u<<1, x, v);else modify(u<<1|1, x, v);pushUp(u);}
}signed main(){cin >> n >> s;s = " " + s;build(1, 1, n);for(int i = 1; i <= n; i ++ )modify(1, i, (s[i] == '0'?1:0));/*l r累加(r - l + 1)公式就是(1 + r - l + 1) * (r - l + 1) / 2;计算出子串的个数连续子串0的个数子串的个数 - 连续子串0的个数 = 答案*/cin >> q;while(q -- ){int l, r;cin >> l >> r;int ans = (1LL + r - l + 1) * (r - l + 1LL) / 2;Info t = query(1, l, r);ans -= t.sum;cout << ans << endl;}return 0;
}
// 前缀和做法
#include <bits/stdc++.h>
#define ll long long
using namespace std;const int N =  200010;int n;
string s;
ll l[N], r[N];
ll p1[N], p2[N], p3[N];int main(){cin >> n >> s;s = " " + s;p1[0] = p2[n + 1] = p3[0] = 0;int t = 0;for(int i = 1; i <= n; i ++ ){p3[i] = (s[i] == '0') + p3[i - 1];if(s[i] == '0')l[i] = l[i - 1] + 1;else l[i] = 0;}for(int i = n; i >= 1; i -- ){p2[i] = l[i] + p2[i + 1];if(s[i] == '0')r[i] = r[i + 1] + 1;else r[i] = 0;}for(int i = 1; i <= n; i ++ )p1[i] = r[i] + p1[i - 1];int q; cin >> q;while(q -- ){int x, y;cin >> x >> y;ll len = y - x + 1;ll ans = (1 + len) * len / 2;int _x = x + r[x];int _y = y - l[y];if(_x <= _y){ans -= (1 + r[x]) * r[x] / 2;ans -= (1 + l[y]) * l[y] / 2;ans -= p1[_y] - p1[_x - 1];}else{ans = 0;}cout << ans << endl;}return 0;
}

F-计树

核心思路:启发式合并算法。

想法:分类讨论,有序的组合数量等于无序组合数量的两倍。

  1. 当前点是集合中的点时,它要为LCA,当且仅当另个点在它的子树中或者两个点分别在它的两个不同的子树中。
  2. 当前点不是集合中的点时,它要为LCA,当且仅当两个点分别在它的两个不同的子树中。
#include <bits/stdc++.h>
#define int long long
using namespace std;const int N = 100010, M = N * 2;int n;
int e[M], ne[M], h[N], idx;
int k, vis[N];
int cnt[N];void add(int a, int b){e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}int dfs(int u, int f){if(vis[u]) cnt[u] = 1;int s = 0, t = 0;for(int i = h[u]; ~i; i = ne[i]){int j = e[i];if(j == f) continue;int sons = dfs(j, u);t += sons * s; // 计算总的组合数量s += sons; // 计算有多少个集合中的点}cnt[u] += t * 2; // 有序的组合数量等于无序组合数量的两倍if(vis[u]){// 情况1,反之情况2cnt[u] += s * 2;s ++;}return s;
}signed main(){memset(h, -1, sizeof h);cin >> n;for(int i = 0; i < n - 1; i ++ ){int u, v;cin >> u >> v;add(u, v); add(v, u);}cin >> k;for(int i = 0; i < k; i ++ ){int x; cin >> x;vis[x] = 1;}dfs(1, 1);for(int i = 1; i <= n; i ++ )cout << cnt[i] << ' ';return 0;
}

相关文章:

牛客周赛 Round 77 题解

文章目录 A-时间表B-数独数组D-隐匿社交网络E-1or0 A-时间表 签到题 #include <bits/stdc.h> using namespace std;int main() {int a[6] {20250121,20250123,20250126,20250206,20250208,20250211};int n; cin >> n;cout << a[n - 1];return 0; }B-数独数…...

Mybatis配置文件详解

MyBatis通过XML或注解的方式将Java对象与数据库中的记录进行映射&#xff0c;极大地简化了数据访问层的开发。而在MyBatis的核心组成部分中&#xff0c;配置文件扮演着举足轻重的角色。它不仅定义了MyBatis的运行环境&#xff0c;还配置了数据源、事务管理、映射器等关键元素&a…...

《深度揭秘:TPU张量计算架构如何重塑深度学习运算》

在深度学习领域&#xff0c;计算性能始终是推动技术发展的关键因素。从传统CPU到GPU&#xff0c;再到如今大放异彩的TPU&#xff08;张量处理单元&#xff09;&#xff0c;每一次硬件架构的革新都为深度学习带来了质的飞跃。今天&#xff0c;就让我们深入探讨TPU的张量计算架构…...

Java基础知识总结(二十二)--List接口

List本身是Collection接口的子接口&#xff0c;具备了Collection的所有方法。现在学习List体系特有的共性方法&#xff0c;查阅方法发现List的特有方法都有索引&#xff0c;这是该集合最大的特点。 List&#xff1a;有序(元素存入集合的顺序和取出的顺序一致)&#xff0c;元素都…...

[STM32 - 野火] - - - 固件库学习笔记 - - -十二.基本定时器

一、定时器简介 STM32 中的定时器&#xff08;TIM&#xff0c;Timer&#xff09;是其最重要的外设之一&#xff0c;广泛用于时间管理、事件计数和控制等应用。 1.1 基本功能 定时功能&#xff1a;TIM定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中…...

算法随笔_27:最大宽度坡

上一篇:算法随笔_26: 按奇偶排序数组-CSDN博客 题目描述如下: 给定一个整数数组 nums&#xff0c;坡是元组 (i, j)&#xff0c;其中 i < j 且 nums[i] < nums[j]。这样的坡的宽度为 j - i。 找出 nums 中的坡的最大宽度&#xff0c;如果不存在&#xff0c;返回 0 。 …...

无公网IP 外网访问本地部署 llamafile 大语言模型

llamafile 是一种AI大模型部署&#xff08;或者说运行&#xff09;的方案&#xff0c;它的特点就是可以将模型和运行环境打包成一个独立的可执行文件&#xff0c;这样就简化了部署流程。用户只需要下载并执行该文件&#xff0c;无需安装运行环境或依赖库&#xff0c;这大大提高…...

使用PC版本剪映制作照片MV

目录 制作MV模板时长调整拖动边缘缩短法分割删除法变速法整体调整法 制作MV 导入音乐 导入歌词 点击歌词 和片头可以修改字体&#xff1a; 还可以给字幕添加动画效果&#xff1a; 导入照片&#xff0c;自动创建照片轨&#xff1a; 修改片头字幕&#xff1a;增加两条字幕轨&…...

搭建 docxify 静态博客教程

首先&#xff0c;安装 node 环境安装 docxify &#xff0c;参考官网&#xff1a;https://docsify.js.org/#/zh-cn/ npm i docsify-cli -g新建docs文件夹专门用来放文章&#xff0c;初始化命令 docsify init ./docs就会生成如下两个文件&#xff0c;index.html 入口文件&#…...

汽车OEMs一般出于什么目的来自定义Autosar CP一些内容

汽车OEMs在使用AUTOSAR CP(Classic Platform)协议时,可能会根据自身的特定需求对标准协议进行修改,形成自己的企业标准(企标)。这种修改通常是为了满足特定的硬件平台、功能需求、安全要求或优化性能。以下是一些常见的修改场景和例子: 1. 硬件平台适配 企业可能会根据…...

Vue.js Vuex 模块化管理

Vue.js Vuex 模块化管理 今天咱们来聊聊如何在 Vuex 中进行模块化管理。当你的 Vue.js 应用变得越来越庞大时&#xff0c;单一的状态管理可能会让人头疼。这时候&#xff0c;Vuex 的模块化功能就派上用场了。 为什么需要模块化&#xff1f; 想象一下&#xff0c;如果把所有的…...

分布式光纤应变监测是一种高精度、分布式的监测技术

一、土木工程领域 桥梁结构健康监测 主跨应变监测&#xff1a;在大跨度桥梁的主跨部分&#xff0c;如悬索桥的主缆、斜拉桥的斜拉索和主梁&#xff0c;分布式光纤应变传感器可以沿着这些关键结构部件进行铺设。通过实时监测应变情况&#xff0c;能够精确捕捉到车辆荷载、风荷…...

用Devc++与easyx一步一步做游戏[启动界面部分]-解决hover闪烁问题及优化

在之前的博文中《用Devc与easyx一步一步做游戏[启动界面部分]-之按钮制作》&#xff0c;我们利用Devc和easyx完成了游戏启动界面按钮的基本制作&#xff0c;实现了按钮的绘制以及鼠标悬停时的信息提示功能。然而&#xff0c;目前还存在一个问题&#xff0c;即鼠标移动时&#x…...

mysql 学习3 SQL语句--整体概述。SQL通用语法;DDL创建数据库,查看当前数据库是那个,删除数据库,使用数据库;查看当前数据库有哪些表

SQL通用语法 SQL语句分类 DDL data definition language : 用来创建数据库&#xff0c;创建表&#xff0c;创建表中的字段&#xff0c;创建索引。因此成为 数据定义语言 DML data manipulation language 有了数据库和表以及字段后&#xff0c;那么我们就需要给这个表中 添加数…...

【数据结构】_链表经典算法OJ:分割链表(力扣—中等)

目录 1. 题目描述及链接 2. 解题思路 2.1 思路1 2.2 思路2 2.3 思路3&#xff08;本题采取该解法&#xff09; 3. 题解程序 1. 题目描述及链接 题目链接&#xff1a;面试题 02.04. 分割链表 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给你一个链表…...

k8s支持自定义field-selector spec.hostNetwork过滤

好久没写博客啦&#xff0c;年前写一个博客就算混过去啦&#x1f602; 写一个小功能&#xff0c;对于 Pod&#xff0c;在没有 label 的情况下&#xff0c;支持 --field-selector spec.hostNetwork 查询 Pod 是否为 hostNetwork 类型&#xff0c;只为了熟悉 APIServer 是如何构…...

ICSE‘25 LLM Assistance for Memory Safety

不知道从什么时候开始&#xff0c;各大技术社区&#xff0c;技术群聊流行着 “用Rust重写!” &#xff0c;放一张图(笑死… 这不, 随着大模型技术的流行&#xff0c;大家都在探索如何让大模型自动完成仓库级别(全程序)的代码重构&#xff0c;代码变换&#xff08;Refactor&…...

《十七》浏览器基础

浏览器&#xff1a;是安装在电脑里面的一个软件&#xff0c;能够将页面内容渲染出来呈现给用户查看&#xff0c;并让用户与网页进行交互。 常见的主流浏览器&#xff1a; 常见的主流浏览器有&#xff1a;Chrome、Safari、Firefox、Opera、Edge 等。 输入 URL&#xff0c;浏览…...

TikTok 推出了一款 IDE,用于快速构建 AI 应用

字节跳动(TikTok 的母公司)刚刚推出了一款名为 Trae 的新集成开发环境(IDE)。 Trae 基于 Visual Studio Code(VS Code)构建,继承了这个熟悉的平台,并加入了 AI 工具,帮助开发者更快、更轻松地构建应用——有时甚至无需编写任何代码。 如果你之前使用过 Cursor AI,T…...

阅读springboot源码 记录

关于 :: 双冒号 用stream的map简洁提取id&#xff0c;类似代码1 // 代码1 List<String> Ids list.stream().map(Student::getId).collect(Collectors.toList())// 代码2 List<String> Ids list.stream().map(use->{return use.getId(); }).collect(Collector…...

Linux之内存管理前世今生(一)

一个程序&#xff08;如王者荣耀&#xff09;平常是存储在硬盘上的&#xff0c;运行时才把这个程序载入内存&#xff0c;CPU才能执行。 问题&#xff1a; 这个程序载入内存的哪个位置呢&#xff1f;载入内核所在的空间吗&#xff1f;系统直接挂了。 一、虚拟内存 1.1 内存分…...

Beautiful Soup 入门指南:从零开始掌握网页解析

Beautiful Soup 入门指南&#xff1a;从零开始掌握网页解析 前言 在数据驱动的时代&#xff0c;网页数据是非常宝贵的资源。很多时候我们需要从网页上提取数据&#xff0c;进行分析和处理。Beautiful Soup 是一个非常流行的 Python 库&#xff0c;可以帮助我们轻松地解析和提…...

网络通信---MCU移植LWIP

使用的MCU型号为STM32F429IGT6&#xff0c;PHY为LAN7820A 目标是通过MCU的ETH给LWIP提供输入输出从而实现基本的Ping应答 OK废话不多说我们直接开始 下载源码 LWIP包源码&#xff1a;lwip源码 -在这里下载 ST官方支持的ETH包&#xff1a;ST-ETH支持包 这里下载 创建工程 …...

Go-并行编程新手指南

Go 并行编程新手指南 在Go语言中&#xff0c;并行编程是充分利用多核CPU资源、提升程序性能的重要手段。它的核心概念包括goroutine和channel&#xff0c;这些特性使得Go在处理并发任务时表现出色。 goroutine&#xff1a;轻量级的并发执行单元 goroutine是Go并行编程的基础…...

基于Django的个人博客系统的设计与实现

【Django】基于Django的个人博客系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 系统采用Python作为主要开发语言&#xff0c;结合Django框架构建后端逻辑&#xff0c;并运用J…...

Python爬虫获取custom-1688自定义API操作接口

一、引言 在电子商务领域&#xff0c;1688作为国内领先的B2B平台&#xff0c;提供了丰富的API接口&#xff0c;允许开发者获取商品信息、店铺信息等。其中&#xff0c;custom接口允许开发者进行自定义操作&#xff0c;获取特定的数据。本文将详细介绍如何使用Python调用1688的…...

kaggle-ISIC 2024 - 使用 3D-TBP 检测皮肤癌-学习笔记

问题描述&#xff1a; 通过从 3D 全身照片 (TBP) 中裁剪出单个病变来识别经组织学确诊的皮肤癌病例 数据集描述&#xff1a; 图像临床文本信息 评价指标&#xff1a; pAUC&#xff0c;用于保证敏感性高于指定阈值下的AUC 主流方法分析&#xff08;文本&#xff09; 基于CatBoo…...

滤波电路汇总

0、前言 1. 引言 滤波电路是电子系统中不可或缺的组成部分,其主要功能是选择性地通过或衰减特定频率范围内的信号。在现代电子技术中,滤波电路广泛应用于信号处理、通信系统、音频设备、电源设计等多个领域。通过滤波,可以去除信号中的噪声和干扰,提高信号的质量和稳定性…...

1.Template Method 模式

模式定义 定义一个操作中的算法的骨架&#xff08;稳定&#xff09;&#xff0c;而将一些步骤延迟&#xff08;变化)到子类中。Template Method 使得子类可以不改变&#xff08;复用&#xff09;一个算法的结构即可重定义&#xff08;override 重写&#xff09;该算法的某些特…...

MySQL分表自动化创建的实现方案(存储过程、事件调度器)

《MySQL 新年度自动分表创建项目方案》 一、项目目的 在数据库应用场景中&#xff0c;随着数据量的不断增长&#xff0c;单表存储数据可能会面临性能瓶颈&#xff0c;例如查询、插入、更新等操作的效率会逐渐降低。分表是一种有效的优化策略&#xff0c;它将数据分散存储在多…...