牛客周赛 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;
}

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

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

相关文章

二分查找题目:寻找两个正序数组的中位数

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;寻找两个正序数组的中位数 出处&#xff1a;4. 寻找两个正序数组的中位数 难度 8 级 题目描述 要求 给定两个大…

【unity游戏开发之InputSystem——07】InputSystem+UGUI配合使用(基于unity6开发介绍)

文章目录 一、InputSystem+UGUI配合使用1、官方文档参考2、切换到新的输入模块二、UGUI中的新输入系统输入模块参数相关1、Send Pointer Hover To Parent2、Move Repeat Delay3、Move Repeat Rate4、XR Tracking Origin5、Deselect On Background CLick6、Pointer Behavior7、S…

uniapp使用uni.navigateBack返回页面时携带参数到上个页面

我们平时开发中也经常遇到这种场景&#xff0c;跳转一个页面会进行一些操作&#xff0c;操作完成后再返回上个页面同时要携带着一些参数 其实也很简单&#xff0c;也来记录一下吧 假设从A页面 跳转到 B页面 A页面 直接上完整代码了哈&#xff0c;很简单&#xff1a; <t…

国内优秀的FPGA设计公司主要分布在哪些城市?

近年来&#xff0c;国内FPGA行业发展迅速&#xff0c;随着5G通信、人工智能、大数据等新兴技术的崛起&#xff0c;FPGA设计企业的需求也迎来了爆发式增长。很多技术人才在求职时都会考虑城市的行业分布和发展潜力。因此&#xff0c;国内优秀的FPGA设计公司主要分布在哪些城市&a…

汇编基础语法及其示例

1.汇编指令 1.1汇编指令的基本格式 <opcode>{<cond>}{s} <Rd> , <Rn> , <shifter_operand> <功能码>{<条件码>}{cpsr影响位} <目标寄存器> , <第一操作寄存器> , <第二操作数> 注&#xff1a;第一操作寄存器…

Direct2D 极速教程(1) —— 画图形

极速导航 Direct2D 简介创建新项目&#xff1a;001-DrawGraphics弄一个白窗口在窗口上画图 Direct2D 简介 大家在学 WINAPI 的时候的时候有没有想过&#xff0c;怎么在一副窗口上画图呢&#xff1f;大家知道 Windows 系统是 GUI 图形用户界面 系统&#xff0c;以 Graphics 图形…

Android13源码下载和编译过程详解

前言 作为Android开发者人人都应该有一份自己Android源码,这样我们就可以随时对自己有疑惑的地方通过亲手调试来加强理解 一 源码下载 1.1 配置要求 官方推荐配置请参考&#xff1a;AOSP使用入门文档&#xff0c;重点有如下几项&#xff1a; 1.1.1 硬件配置要求 至少需要…

Linux之详谈——权限管理

目录 小 峰 编 程 ​编辑 一、权限概述 1、什么是权限 2、为什么要设置权限 3、Linux中的权限类别- 4、Linux中文件所有者 1&#xff09;所有者分类&#xff08;谁&#xff09; 2&#xff09;所有者的表示方法 ① u(the user who owns it)&#xff08;属主权限&…

python Flask-Redis 连接远程redis

当使用Flask-Redis连接远程Redis时&#xff0c;首先需要安装Flask-Redis库。可以通过以下命令进行安装&#xff1a; pip install Flask-Redis然后&#xff0c;你可以使用以下示例代码连接远程Redis&#xff1a; from flask import Flask from flask_redis import FlaskRedisa…

Go Fx 框架使用指南:深入理解 Provide 和 Invoke 的区别

1. 什么是 Fx 框架&#xff1f; Fx 是一个基于 Go 语言的依赖注入框架&#xff0c;专注于简化应用程序的生命周期管理和依赖的构建。在复杂的应用程序中&#xff0c;Fx 通过模块化的设计方式将组件连接起来&#xff0c;使开发者能够更高效地管理依赖关系。 Fx 的核心理念是&a…

基于金融新闻的大型语言模型强化学习在投资组合管理中的应用

“Financial News-Driven LLM Reinforcement Learning for Portfolio Management” 论文地址&#xff1a;https://arxiv.org/pdf/2411.11059 摘要 本研究探索了如何通过将大语言模型&#xff08;LLM&#xff09;支持的情感分析融入强化学习&#xff08;RL&#xff09;中&#…

K8s运维管理平台 - KubeSphere 3.x 和4.x 使用分析:功能较强,UI美观

目录标题 Lic使用感受优点&#xff1a;优化点&#xff1a; 实操首页项目 | 应用负载 | 配置 | 定制资源定义存储监控告警集群设置 **KubeSphere 3.x** 和 **4.x**1. **架构变化**&#xff1a;2. **多集群管理**&#xff1a;3. **增强的 DevOps 功能**&#xff1a;4. **监控与日…

当AI学会“顿悟”:DeepSeek-R1如何用强化学习突破推理边界?

开篇&#xff1a;一场AI的“青春期叛逆” 你有没有想过&#xff0c;AI模型在学会“推理”之前&#xff0c;可能也经历过一段“中二时期”&#xff1f;比如&#xff0c;解题时乱写一通、语言混搭、答案藏在火星文里……最近&#xff0c;一支名为DeepSeek-AI的团队&#xff0c;就…

【llm对话系统】 LLM 大模型推理python实现:vLLM 框架

在 LLM 的应用中&#xff0c;推理 (Inference) 阶段至关重要。它指的是利用训练好的 LLM 模型&#xff0c;根据输入 (Prompt) 生成文本的过程。然而&#xff0c;LLM 的推理速度往往较慢&#xff0c;尤其是在处理长序列或高并发请求时&#xff0c;效率瓶颈尤为突出。 为了解决这…

Ollama+DeepSeek本地大模型部署

1、Ollama 官网&#xff1a;https://ollama.com/ Ollama可以干什么&#xff1f; 可以快速在本地部署和管理各种大语言模型&#xff0c;操作命令和dokcer类似。 mac安装ollama&#xff1a; # 安装ollama brew install ollama# 启动ollama服务&#xff08;默认11434端口&#xf…

论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(三)

Understanding Diffusion Models: A Unified Perspective&#xff08;三&#xff09; 文章概括 文章概括 引用&#xff1a; article{luo2022understanding,title{Understanding diffusion models: A unified perspective},author{Luo, Calvin},journal{arXiv preprint arXiv:…

mybatis(104/134)

动态sql标签&#xff0c;用于选择查询 if标签 where标签 &#xff1a;自动生成where&#xff0c;取决于后面有没有条件&#xff0c;会自动去除条件前面的and和or&#xff0c;不会去除语句后面的 trim标签&#xff1a;自动生成where&#xff0c;在语句后自动去除后缀and和or for…

【数据结构】动态内存管理函数

动态内存管理 为什么存在动态内存管理动态内存函数的介绍&#x1f38a;malloc补充&#xff1a;perror函数&#x1f38a;free&#x1f38a;calloc&#x1f38a;realloc 常见动态内存错误对空指针的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用free释放使用free释放一…

在FreeBSD下安装Ollama并体验DeepSeek r1大模型

在FreeBSD下安装Ollama并体验DeepSeek r1大模型 在FreeBSD下安装Ollama 直接使用pkg安装即可&#xff1a; sudo pkg install ollama 安装完成后&#xff0c;提示&#xff1a; You installed ollama: the AI model runner. To run ollama, plese open 2 terminals. 1. In t…

C++类和对象下详细指南

C类和对象下详细指南 1. 初始化列表与构造函数 1.1 初始化列表概述 初始化列表在C中用于初始化对象的成员变量&#xff0c;特别是当你需要在对象构造时就明确成员变量的值时。通过初始化列表&#xff0c;成员变量的初始化可以在进入构造函数体之前完成。这不仅可以提升性能&…