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

米哈游笔试——求强势顶点的个数

2025/08/10 游戏客户端开发A卷

这里题目就不展开讲了,题目本身可以转换为查询数组区间上最大(小)值的个数

害,做题时还没学线段树,所以只暴力了20%,现在给出线段树求解代码。

关于线段树可参考左神视频:

左程云--算法讲解110【扩展】线段树专题1-线段树原理和代码详解

#include <iostream>
#include <vector>
#include <unordered_map>using namespace std;
const static int N = 1e5 + 1;
vector<int> cArr = vector<int>(N, 0);
vector<vector<int>> tree = vector<vector<int>>(4 * N, vector<int>(2, 0));
pair<int, int> myUnion(int i, int j);
void build(int l, int r, int i);
pair<int, int> query(int jobl, int jobr, int l, int r, int i);
pair<int, int> myUnion(pair<int, int>& left, pair<int, int>& right);pair<int, int> myUnion(pair<int, int>& left, pair<int, int>& right) {if (left.first < right.first) {return left;}else if (right.first < left.first) {return right;}else {return { left.first, left.second + right.second };}
}void build(int l, int r, int i) {if (l == r) {tree[i][0] = cArr[l];tree[i][1] = 1;return;}int mid = l + ((r - l) >> 1);build(l, mid, i << 1);build(mid + 1, r, i << 1 | 1);auto ans = myUnion(i << 1, i << 1 | 1);tree[i][0] = ans.first;tree[i][1] = ans.second;
}pair<int, int> myUnion(int i, int j) {if (tree[i][0] < tree[j][0]) {return { tree[i][0], tree[i][1] };}else if (tree[i][0] > tree[j][0]) {return { tree[j][0], tree[j][1] };}else {return { tree[i][0], tree[i][1] + tree[j][1] };}
}pair<int, int> query(int jobl, int jobr, int l, int r, int i) {if (jobl <= l && r <= jobr) {return { tree[i][0], tree[i][1] };}int mid = l + ((r - l) >> 1);pair<int, int> left, right;if (jobl <= mid) {left = query(jobl, jobr, l, mid, i << 1);}if (jobr > mid) {right = query(jobl, jobr, mid + 1, r, i << 1 | 1);}if (left.second == 0) { return right; }if (right.second == 0) { return left; }return myUnion(left, right);
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n, q;	// n -> 数组大小  q -> 查询次数cin >> n >> q;//n = 5, q = 1;for (int i = 0; i < n; ++i) {cin >> cArr[i];	// ci = ai}//cArr = { 1, -2, 2, -2, -4 };int b;for (int i = 0; i < n; ++i) {cin >> b;cArr[i] = b - cArr[i];		// ci = bi - ai}build(0, n - 1, 1);while (q--) {int l, r;cin >> l >> r;l--; r--;auto ans = query(l, r, 0, n - 1, 1);cout << ans.second << endl;}return 0;
}

http://www.xdnf.cn/news/17554.html

相关文章:

  • [概率 DP]808. 分汤
  • 第4章 程序段的反复执行2 while语句P128练习题(题及答案)
  • pytorch llm 计算flops和参数量
  • Gltf 模型 加载到 Cesium 的坐标轴映射浅谈
  • 深入理解C++构造函数与初始化列表
  • Python训练营打卡Day27-类的定义和方法
  • AudioLLM
  • 专题二_滑动窗口_找到字符串中所有字母异位词
  • 第二十天:数论度量
  • 前端Web在Vue中的知识详解
  • 数据溢出ERROR L107:ADDRESS SPACE OVERFLOW
  • 11. 为什么要用static关键字
  • 【C++】string 的特性和使用
  • Python(13) -- 面向对象
  • 【面试场景题】通过LinkedHashMap来实现LRU与LFU
  • Java+Vue打造的采购招投标一体化管理系统,涵盖招标、投标、开标、评标全流程,功能完备,附完整可二次开发的源码
  • 标准IO实现
  • Effective C++ 条款32:确定你的public继承塑模出 is-a 关系
  • AWT 基本组件深入浅出:Button/Label/TextField/Checkbox/Choice/List 全面实战与性能优化
  • 2025-08-09 李沐深度学习14——经典卷积神经网络 (2)
  • MySQL相关概念和易错知识点(4)(分组查询、连接查询、合并查询、子查询)
  • Mysql笔记-系统变量\用户变量管理
  • 【LLM实战|langchain】langchain基础
  • toRef和toRefs
  • 智慧城管复杂人流场景下识别准确率↑32%:陌讯多模态感知引擎实战解析
  • Easysearch 冷热架构实战
  • Linux下管道的实现
  • SpringBoot 集成 MapStruct
  • 《从零实现哈希表:详解设计、冲突解决与优化》
  • [激光原理与应用-197]:光学器件 - 图解双折射晶体的工作原理